commit abc54697fd02e4e5c42c8a98a99f11c45b795dd6 Author: Mathis Date: Wed Jul 1 18:02:52 2026 +0200 update last version of the website diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5a098f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Ignore all Markdown files +# *.md +.**claude** +.gemini/ +.env +.env.* +config.local.php +config.prod.php +secrets.php +credentials.json +.vscode/ +.idea/ +*.log +node_modules/ diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..89673b5 --- /dev/null +++ b/.htaccess @@ -0,0 +1,125 @@ +# ---------------------------------------------------------------------- +# OMEGAKUBE — Configuration de sécurité renforcée Apache (.htaccess) +# ---------------------------------------------------------------------- + +# 1. Désactiver l'exploration des répertoires (Directory Browsing) +Options -Indexes + +# 2. Masquer les informations du serveur +ServerSignature Off + +# 3. Restriction d'accès aux fichiers sensibles, cachés et de données + +# A. Bloquer les fichiers commençant par un point (comme .git, .env, .htaccess) + + + Require all denied + + + Order allow,deny + Deny from all + + + +# Exception explicite pour le fichier security.txt du dossier .well-known + + + Require all granted + + + Order deny,allow + Allow from all + + + +# B. Bloquer les extensions sensibles (Configuration, scripts, logs, bases de données) + + + Require all denied + + + Order allow,deny + Deny from all + + + +# C. Protection intelligente des fichiers .json +# On bloque TOUS les .json du serveur par défaut, SAUF ceux situés dans assets/data/ + + + + Require all granted + + + Require all denied + + + + # Sécurité de secours pour les versions d'Apache très anciennes + Order allow,deny + Deny from all + + + +# 4. Exécution CGI activée par assets/python/.htaccess (plus fiable que FilesMatch racine) + + +# 5. En-têtes de sécurité HTTP (Recommandations Mozilla Observatory) + + # HSTS (Strict-Transport-Security) : Force l'utilisation du HTTPS pour le domaine et les sous-domaines (durée 1 an) + Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" + + # X-Frame-Options : Interdit le chargement du site dans une iframe (protection Clickjacking) + Header always set X-Frame-Options "DENY" + + # X-Content-Type-Options : Force le navigateur à respecter le type MIME envoyé (protection contre le sniffing de contenu) + Header always set X-Content-Type-Options "nosniff" + + # Referrer-Policy : Ne transmet le referer complet que pour les origines de confiance (HTTPS vers HTTPS interne) + Header always set Referrer-Policy "strict-origin-when-cross-origin" + + # Permissions-Policy : Restreint l'utilisation de fonctionnalités matérielles du navigateur pour la vie privée + Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()" + + # Content-Security-Policy (CSP) : Contrôle les sources d'où le site peut charger ses scripts, styles et médias. + Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://unpkg.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' https://cdn.discordapp.com data:; frame-src 'self' https://www.youtube.com https://www.youtube-nocookie.com; connect-src 'self'" + + # X-XSS-Protection : Filtre XSS existant dans les anciens navigateurs (mode blocage actif) + Header always set X-XSS-Protection "1; mode=block" + + +# 6. Règles de réécriture d'URL (mod_rewrite) + + RewriteEngine On + + # A. Redirection HTTPS automatique et robuste (compatible reverse proxies comme Cloudflare) + RewriteCond %{HTTPS} off [OR] + RewriteCond %{HTTP:X-Forwarded-Proto} !https + RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + + # B. Pare-feu applicatif de base (WAF) contre les attaques par injection courantes + RewriteCond %{QUERY_STRING} concat.*\( [NC,OR] + RewriteCond %{QUERY_STRING} union.*select [NC,OR] + RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR] + RewriteCond %{QUERY_STRING} base64_encode.*\( [NC,OR] + RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] + RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) + RewriteRule ^(.*)$ - [F,L] + + # C. Redirection des pages inexistantes ou dossiers sans fichier index vers une page 404 personnalisée + # Si le fichier demandé n'existe pas + RewriteCond %{REQUEST_FILENAME} !-f + # Et s'il ne s'agit pas d'un dossier + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^ pages/404.php [L] + + # Si le dossier demandé n'a aucun fichier d'index valide (index.html ou index.php) + RewriteCond %{REQUEST_FILENAME} -d + RewriteCond %{REQUEST_FILENAME}/index.html !-f + RewriteCond %{REQUEST_FILENAME}/index.php !-f + RewriteRule ^ pages/404.php [L] + + +# 7. Pages d'erreur Apache natives (fallback de sécurité si mod_rewrite est absent) +ErrorDocument 404 /pages/404.php +ErrorDocument 403 /pages/404.php diff --git a/.well-known/security.txt b/.well-known/security.txt new file mode 100644 index 0000000..51f9c45 --- /dev/null +++ b/.well-known/security.txt @@ -0,0 +1,6 @@ +Contact: mailto:contact@omegakube.fr +Preferred-Languages: fr, en +Expires: 2027-05-17T12:00:00.000Z +Encryption: https://omegakube.fr/pgp-key.txt +Acknowledgements: https://omegakube.fr/remerciements +Policy: https://omegakube.fr/security-policy diff --git a/README.md b/README.md new file mode 100644 index 0000000..ef41e33 --- /dev/null +++ b/README.md @@ -0,0 +1,258 @@ +# OmégaKube — Site Web + +Site vitrine officiel d'OmégaKube — plateforme de création d'expériences Role Play immersives : bots Discord personnalisés, maps Fortnite UEFN, graphisme et consulting. + +--- + +## 🏗️ Architecture + +``` +website/ +├── index.html # Page d'accueil +├── .htaccess # Config Apache (404, redirections) +├── pages/ +│ ├── services.html # Nos services +│ ├── realisations.html # Portfolio complet +│ ├── faq.html # Questions fréquentes +│ ├── mentions-legales.html +│ ├── cgv.html +│ └── 404.php # Page 404 (CSS/JS inline, chemin-indépendant) +├── components/ +│ ├── header.html # Navbar (data-include) +│ ├── footer.html # Footer + réseaux sociaux (data-include) +│ ├── background.html # Fond géométrique animé +│ ├── contact.html # Formulaire de contact réutilisable +│ ├── favicons.html +│ └── index/ +│ ├── hero.html +│ ├── apropos.html +│ └── services.html +├── assets/ +│ ├── css/ +│ │ ├── main.css # Styles globaux (thème dark/light, composants) +│ │ ├── 404.css # Styles page 404 +│ │ └── legal.css # Styles pages légales +│ ├── js/ +│ │ ├── main.js # ⭐ Config globale, thème, includes, social links +│ │ ├── home.js # Accueil : portfolio, team carousel, partners, easter egg +│ │ └── pages/ +│ │ ├── realisations.js # Portfolio + modal projet + galerie images/vidéo +│ │ ├── services.js # Onglets services +│ │ ├── services-process.js # Animation timeline processus +│ │ ├── legal.js # Pages légales +│ │ └── 404.js # Easter egg page 404 (Game of Life) +│ ├── data/ +│ │ ├── projects.json # ⭐ Projets (images, vidéos, stats, tech, social) +│ │ ├── team.json # ⭐ Membres de l'équipe +│ │ ├── partners.json # ⭐ Partenaires +│ │ ├── services.json # Détail des services et tarifs +│ │ └── faq.json # Questions / réponses FAQ +│ ├── images/ +│ │ ├── projects/ # Images et vidéos des projets +│ │ │ ├── kuby/ +│ │ │ ├── victorias-vice-1/ # Inclut TrailerOfficielVV1.mp4 +│ │ │ ├── vicy/ +│ │ │ ├── site-omega/ +│ │ │ └── branding-omega-kube/ +│ │ ├── team/ # Photos membres : {id_discord}.png ou .jpg +│ │ ├── partners/ # Logos partenaires — champ "logo" dans partners.json +│ │ ├── social/ # Icônes réseaux gaming (fortnite.svg, epicgames.svg) +│ │ └── favicon/ +│ ├── fonts/ # OmegaLarge, OmegaSmall, Montserrat +│ └── python/ +│ └── send_mail.py # Formulaire de contact CGI (JSON POST) +``` + +--- + +## ⚙️ Configuration rapide + +### 1. Réseaux sociaux — un seul endroit + +Dans `assets/js/main.js`, modifier `window.OK_SOCIAL` : + +```js +window.OK_SOCIAL = { + discord: 'https://discord.gg/FwvNkvu5dy', + fortnite: 'https://www.fortnite.com/@omega_kube_team', + epicgames: '', // laisser vide pour masquer le lien + twitter: 'https://x.com/Omegakube', + instagram: 'https://www.instagram.com/omegakube/', + youtube: 'https://www.youtube.com/@OmegaKube', + tiktok: 'https://www.tiktok.com/@omegakube', + facebook: '', + bluesky: '', + email: 'contact@omegakube.fr' +}; +``` + +Tous les liens du site (footer, contact, modals) se mettent à jour automatiquement. Les entrées vides `''` sont masquées automatiquement. + +Les icônes gaming (Fortnite, Epic Games) sont des SVG locaux dans `assets/images/social/` — ils s'adaptent automatiquement au thème dark/light. + +--- + +### 2. Ajouter / modifier un projet + +Éditer `assets/data/projects.json` : + +```json +{ + "id": 6, + "category": "bot", + "title": "Nom du projet", + "desc": "Description complète...", + "gradient": "linear-gradient(135deg, #5E2040, #8b3a62)", + "year": "2025", + "duration": "2 mois", + "images": "assets/images/projects/nom-du-projet/", + "files": [ + "trailer.mp4", // vidéo locale (avec bouton mute) + "https://youtube.com/watch?v=VIDEO_ID", // URL YouTube complète + "yt:VIDEO_ID", // shortcode YouTube + "img-1.png", + "img-2.jpg" + ], + "features": ["Feature 1", "Feature 2"], + "tech": [ + { "name": "Python", "icon": "code" } + ], + "stats": [ + { "icon": "users", "value": "500+", "label": "Utilisateurs" } + ], + "social": { + "discord": "https://discord.gg/...", + "twitter": "", + "instagram": "" + } +} +``` + +Déposer les fichiers dans `assets/images/projects/nom-du-projet/`. Les noms doivent correspondre exactement au champ `files`. + +**Catégories valides** : `"bot"` | `"map"` | `"graphisme"` + +--- + +### 3. Ajouter un membre de l'équipe + +Éditer `assets/data/team.json`. Photo optionnelle : `assets/images/team/{id_discord}.png` ou `.jpg` (fallback automatique). + +```json +{ + "id": "123456789", + "name": "Pseudo", + "role": "Rôle", + "avatar": "P", + "bio": "...", + "stats": [ + { "value": "3", "label": "Ans d'exp." } + ], + "skills": ["Skill 1", "Skill 2"], + "social": { + "discord": "", + "twitter": "", + "github": "", + "instagram": "", + "youtube": "", + "tiktok": "" + } +} +``` + +--- + +### 4. Ajouter un partenaire + +Éditer `assets/data/partners.json`. Le champ `logo` doit pointer vers le fichier image avec la **bonne extension** (`.png` ou `.jpg`). + +```json +{ + "name": "nom-slug", + "displayName": "Nom Affiché", + "description": "Courte description (carousel)", + "longDesc": "Description complète (modal)", + "gradient": "linear-gradient(...)", + "logo": "assets/images/partners/nom-slug.png", + "since": "2025", + "services": ["Service rendu"], + "stats": [ + { "icon": "users", "value": "100+", "label": "Membres" } + ], + "social": { + "discord": "", + "website": "", + "twitter": "", + "youtube": "", + "instagram": "" + } +} +``` + +--- + +### 5. FAQ + +Éditer `assets/data/faq.json` : + +```json +{ + "id": "ma-categorie", + "icon": "help-circle", + "title": "Ma catégorie", + "questions": [ + { "q": "La question ?", "a": "La réponse." } + ] +} +``` + +Les icônes sont issues de [Feather Icons](https://feathericons.com/). + +--- + +## 🌐 Déploiement + +- **Serveur** : PHP requis pour `404.php`, Python CGI requis pour `send_mail.py` +- **Contact** : configurer l'adresse email destinataire dans `assets/python/send_mail.py` (`TO_EMAIL`) +- **Apache** : le `.htaccess` gère la 404 et désactive le listing de dossiers +- **Thème** : dark par défaut, toggle persisté en `localStorage` +- **WAMP local** : utiliser `http://localhost/nom-du-dossier/` — les chemins assets sont relatifs + +--- + +## 🎨 Thème dark/light + +Le site supporte deux thèmes via l'attribut `data-theme` sur `` : + +- `data-theme="dark"` (défaut) +- `data-theme="light"` + +Toutes les couleurs sont des variables CSS définies dans `main.css`. Les textes sur images (cartes portfolio, bento projets phares) restent toujours blancs grâce à des gradients sombres en bas, que ce soit en dark ou light. + +--- + +## 🥚 Easter Eggs + +- **PC** : Konami Code `↑ ↑ ↓ ↓ ← → ← → B A` +- **Mobile** : 10 taps rapides sur le logo navbar ou footer +- **Page 404** : 10 taps sur le "404" → Game of Life de Conway + +--- + +## 🛠️ Stack technique + +| Technologie | Usage | +|---|---| +| HTML5 / CSS3 | Structure et styles, thème dark/light | +| JavaScript ES6+ | Logique, composants, données JSON | +| PHP / Python | Page 404 (PHP), Formulaire de contact (Python CGI) | +| Feather Icons | Icônes UI (CDN) | +| Simple Icons | Icônes réseaux sociaux gaming (SVG locaux) | +| Montserrat | Police secondaire | +| OmegaLarge / OmegaSmall | Polices custom OmégaKube | + +--- + +**Version** : 1.6.0 +**Dernière mise à jour** : Avril 2026 +**Mainteneur** : KIRITO_KMA / L'équipe OmégaKube diff --git a/SMTP_CONFIG_GUIDE.md b/SMTP_CONFIG_GUIDE.md new file mode 100644 index 0000000..8245010 --- /dev/null +++ b/SMTP_CONFIG_GUIDE.md @@ -0,0 +1,271 @@ +# ⚡ Guide de Configuration SMTP pour send_mail.py (Auto-hébergement Linux + Apache) + +*Dernière mise à jour : 2025-05-20* +*Fichier : `assets/python/send_mail.py`* + +--- + +## 📋 **CHECKLIST RAPIDE** + +- [ ] Postfix installé et démarré +- [ ] Apache configuré pour CGI Python +- [ ] send_mail.py a les permissions d'exécution +- [ ] Configuration SMTP correcte dans send_mail.py +- [ ] Test de connexion SMTP réussi + +--- + +## 🎯 **ÉTAPES COMPLÈTES** + +### **Partie 1 : Installation de Postfix (Serveur SMTP)** + +```bash +# 1. Installer Postfix +sudo apt update && sudo apt install postfix mailutils -y + +# 2. Pendant l'installation : +# - Sélectionner : "Site Internet" +# - Nom de domaine : omegakube.fr + +# 3. Configurer Postfix +sudo nano /etc/postfix/main.cf +``` + +**Dans `/etc/postfix/main.cf`, modifier/modifier :** +```ini +myhostname = omegakube.fr +mydomain = omegakube.fr +myorigin = $mydomain +mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 +inet_interfaces = loopback-only +smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination +``` + +```bash +# 4. Redémarrer Postfix +sudo systemctl restart postfix + +# 5. Vérifier que Postfix écoute sur le port 25 +sudo netstat -tulnp | grep 25 +# → Doit afficher : tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN + +# 6. Tester l'envoi local +sudo apt install mailutils -y # Si pas déjà installé +echo "Test email" | mail -s "Test Postfix" votre@email.com +``` + +--- + +### **Partie 2 : Configuration Apache pour CGI Python** + +```bash +# 1. Activer le module CGI +sudo a2enmod cgi + +# 2. Donner les permissions au script +chmod +x /home/gameurpro12/Documents/Mes_projets/site_Omega_Kube/website-main/assets/python/send_mail.py + +# 3. Donner la propriété à www-data (utilisateur Apache) +sudo chown -R www-data:www-data /home/gameurpro12/Documents/Mes_projets/site_Omega_Kube/website-main/assets/python/ + +# 4. Configurer Apache pour permettre CGI dans le répertoire Python +sudo nano /etc/apache2/sites-available/omegakube.conf +``` + +**Ajouter dans la configuration Apache :** +```apache + + Options +ExecCGI + AddHandler cgi-script .py + Require all granted + +``` + +```bash +# 5. Redémarrer Apache +sudo systemctl restart apache2 + +# 6. Vérifier que CGI est activé +sudo apache2ctl -M | grep cgi +# → Doit afficher : cgi_module (shared) +``` + +--- + +### **Partie 3 : Configurer send_mail.py** + +**Éditer le fichier :** +```bash +nano /home/gameurpro12/Documents/Mes_projets/site_Omega_Kube/website-main/assets/python/send_mail.py +``` + +**Configurer ces lignes (pour Postfix local) :** +```python +TO_EMAIL = "contact@omegakube.fr" +FROM_EMAIL = "noreply@omegakube.fr" +SMTP_HOST = "localhost" # Ou "127.0.0.1" +SMTP_PORT = 25 +SMTP_SSL = False # Pas de SSL pour localhost +SMTP_USER = "" # Pas d'authentification +SMTP_PASSWORD = "" # Pas d'authentification +``` + +**Pour d'autres fournisseurs (Gmail, OVH, etc.) :** +```python +# Exemple pour Gmail +SMTP_HOST = "smtp.gmail.com" +SMTP_PORT = 587 +SMTP_SSL = False +SMTP_USER = "votre@gmail.com" +SMTP_PASSWORD = "votre_app_password" # Utilisez un "App Password" si 2FA +``` + +--- + +### **Partie 4 : Tests** + +#### **Test 1 : Vérifier Postfix** +```bash +# Vérifier le statut +sudo systemctl status postfix + +# Vérifier les logs SMTP +tail -f /var/log/mail.log +``` + +#### **Test 2 : Tester send_mail.py manuellement** +```bash +# Créer un fichier de test +cd /home/gameurpro12/Documents/Mes_projets/site_Omega_Kube/website-main/assets/python +echo '{"name": "Test", "email": "votre@email.com", "subject": "Test SMTP", "message": "Ceci est un test"}' > /tmp/test_data.json + +# Exécuter avec simulation de requête POST +REQUEST_METHOD=POST CONTENT_LENGTH=85 HTTP_ORIGIN="https://omegakube.fr" python3 send_mail.py < /tmp/test_data.json +``` + +**Résultat attendu :** +```json +{"success": true, "message": "Votre message a bien été envoyé ! Nous vous répondrons rapidement."} +``` + +#### **Test 3 : Tester via le formulaire web** +1. Ouvrir le site dans un navigateur +2. Remplir le formulaire de contact +3. Soumettre +4. **Vérifier les logs :** + ```bash + tail -f /var/log/mail.log + tail -f /var/log/apache2/error.log + ``` + +--- + +## 🔍 **DÉPANNAGE** + +### **Problème : "Connection refused" sur localhost:25** +```bash +# Solution 1 : Vérifier que Postfix écoute +sudo netstat -tulnp | grep 25 + +# Solution 2 : Redémarrer Postfix +sudo systemctl restart postfix + +# Solution 3 : Vérifier la configuration +sudo postconf -n mynetworks +# → Doit contenir : 127.0.0.0/8 +``` + +### **Problème : "Relay access denied"** +```bash +# Modifier la configuration Postfix +sudo nano /etc/postfix/main.cf +``` +```ini +# Remplacer par : +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination +``` +```bash +sudo systemctl restart postfix +``` + +### **Problème : send_mail.py retourne 500 Error** +```bash +# Vérifier les permissions +ls -l /home/gameurpro12/Documents/Mes_projets/site_Omega_Kube/website-main/assets/python/send_mail.py +# → Doit afficher : -rwxr-xr-x + +# Vérifier que CGI est activé +sudo apache2ctl -M | grep cgi + +# Vérifier le shebang dans send_mail.py +head -1 /home/gameurpro12/Documents/Mes_projets/site_Omega_Kube/website-main/assets/python/send_mail.py +# → Doit être : #!/usr/bin/env python3 +``` + +### **Problème : Emails marqués comme spam** +```bash +# Configurer SPF (DNS) +# Ajouter cet enregistrement TXT pour omegakube.fr : +# v=spf1 a mx ~all + +# Vérifier votre IP sur les blacklists +# https://mxtoolbox.com/blacklists.aspx +``` + +--- + +## 📚 **CONFIGURATIONS SMTP PAR FOURNISSEUR** + +| Fournisseur | SMTP_HOST | SMTP_PORT | SMTP_SSL | Authentification | User | Password | +|------------|-----------|-----------|----------|-----------------|------|----------| +| **Local (Postfix)** | localhost | 25 | False | Non | - | - | +| **Gmail** | smtp.gmail.com | 587 | False | Oui | email@gmail.com | App Password | +| **Gmail SSL** | smtp.gmail.com | 465 | True | Oui | email@gmail.com | App Password | +| **OVH** | ssl0.ovh.net | 587 | False | Oui | contact@omegakube.fr | mot de passe | +| **Mailjet** | in-v3.mailjet.com | 587 | False | Oui | API Key | API Secret | +| **SendGrid** | smtp.sendgrid.net | 587 | False | Oui | apikey | API Key | + +--- + +## 🎯 **RÉSUMÉ DES COMMANDES CLÉS** + +```bash +# Installer Postfix +sudo apt install postfix mailutils -y + +# Activer CGI dans Apache +sudo a2enmod cgi && sudo systemctl restart apache2 + +# Permissions +chmod +x assets/python/send_mail.py +sudo chown -R www-data:www-data assets/python/ + +# Redémarrer les services +sudo systemctl restart postfix apache2 + +# Vérifier +sudo systemctl status postfix apache2 +sudo netstat -tulnp | grep 25 +sudo apache2ctl -M | grep cgi + +# Tester +REQUEST_METHOD=POST CONTENT_LENGTH=85 HTTP_ORIGIN="https://omegakube.fr" python3 assets/python/send_mail.py < /tmp/test_data.json + +# Voir les logs +tail -f /var/log/mail.log +``` + +--- + +## 📌 **NOTES IMPORTANTES** + +1. **Pour Gmail** : Activez "App Password" si vous avez la 2FA : [https://myaccount.google.com/apppasswords](https://myaccount.google.com/apppasswords) +2. **Sécurité** : Ne jamais utiliser votre mot de passe Gmail normal, toujours un "App Password" +3. **SPF/DKIM** : Configurez ces enregistrements DNS pour éviter que vos emails aient comme spam +4. **Backups** : Sauvegardez `/etc/postfix/main.cf` avant toute modification + +--- + +**✅ Une fois tout configuré, votre formulaire de contact devrait fonctionner parfaitement !** + +*Besoin d'aide ? Vérifiez les logs avec `tail -f /var/log/mail.log` et `tail -f /var/log/apache2/error.log`* diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..05d7eaa --- /dev/null +++ b/TODO.md @@ -0,0 +1,51 @@ +# TODO - Correctifs "créateurs" + bugs multiples + +## Étape 1 +- [x] Ajouter des garde-fous stricts dans `assets/js/home.js` pour empêcher qu'une erreur JS bloque l'affichage de la section "Les créateurs". + + +## Étape 2 +- [x] Sécuriser le rendu social : fallback **sans injection non contrôlée** si `window.renderSocialLinks` n'existe pas. + - Vérification que `window.renderSocialLinks` est une fonction valide (contient 'escapeHTML') + - Try/catch autour de l'appel à `renderSocialLinks` + - Fallback vide si la fonction est compromise ou absente + +## Étape 3 +- [x] Ajouter des logs et messages d'erreurs clairs (console) + try/catch autour de l'init team. + - Logs ajoutés pour le chargement des données (team, portfolio, partners) + - try/catch autour de `initTeamSection`, `openMemberModal`, `openPartnerModal` + - Fallback visuel avec messages d'erreur si chargement échoué + +## Étape 4 +- [x] Vérifier qu'aucune insertion de contenu non échappé n'est faite (XSS-safe) : uniquement `escapeHTML` sur les valeurs et aucune insertion depuis le JSON sans échappement. + - Toutes les données JSON sont échappées avec `window.escapeHTML()` avant insertion via innerHTML + - Vérification des données (Array.isArray, typeof) avant traitement + - Correction appliquée à : `home.js`, `realisations.js` + +## Étape 5 +- [x] Tester sur la page `index.html` : affichage cards + ouverture modal + fallback si liens manquants. + - Tests manuels à effectuer (les corrections sont en place) + +--- + +## Résumé des corrections appliquées + +### Fichiers modifiés : +1. **`assets/js/home.js`** : + - Garde-fous stricts pour les sections Portfolio, Partners, Team + - Vérification des réponses HTTP (`res.ok`) + - Validation des types de données (Array.isArray, typeof) + - try/catch autour de toutes les fonctions critiques + - Fallback visuel avec messages d'erreur si échec + - Sécurisation de `window.renderSocialLinks` avec vérification de signature + +2. **`assets/js/pages/realisations.js`** : + - Sécurisation de `window.renderSocialLinks` pour les liens sociaux des projets + - Mêmes vérifications que dans home.js + +### Points vérifiés (déjà conformes) : +- `assets/js/main.js` : `escapeHTML` déjà utilisé, fonction sécurisée +- `assets/js/services.js` : toutes les données échappées avec `escapeHTML` +- `assets/js/services-process.js` : pas de rendu HTML dynamique +- `assets/js/pages/legal.js` : pas de rendu HTML dynamique avec données externes +- `assets/js/pages/404.js` : pas de rendu HTML dynamique avec données externes diff --git a/assets/css/404.css b/assets/css/404.css new file mode 100644 index 0000000..28adba4 --- /dev/null +++ b/assets/css/404.css @@ -0,0 +1,331 @@ +:root { + --bg-deep: #0a0a0f; + --bg-primary: #12121a; + --bg-secondary: #1a1a25; + --accent-primary: #8b3a62; + --accent-secondary: #5e2a8b; + --accent-light: #d4a5c9; + --text-primary: #ffffff; + --text-secondary: #b8b8c8; + --text-muted: #6b6b7b; + --glass-bg: rgba(255, 255, 255, 0.03); + --glass-border: rgba(255, 255, 255, 0.08); +} + +* { margin: 0; padding: 0; box-sizing: border-box; } + +body { + font-family: 'Montserrat', sans-serif; + background: var(--bg-deep); + color: var(--text-primary); + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + overflow: hidden; + position: relative; +} + +.bg-grid { + position: fixed; + inset: 0; + background-image: + linear-gradient(rgba(139, 58, 98, 0.03) 1px, transparent 1px), + linear-gradient(90deg, rgba(139, 58, 98, 0.03) 1px, transparent 1px); + background-size: 50px 50px; + pointer-events: none; +} + +.bg-glow { + position: fixed; + width: 600px; + height: 600px; + border-radius: 50%; + filter: blur(150px); + opacity: 0.15; + pointer-events: none; +} + +.bg-glow-1 { + top: -200px; + left: -200px; + background: var(--accent-primary); + animation: float 8s ease-in-out infinite; +} + +.bg-glow-2 { + bottom: -200px; + right: -200px; + background: var(--accent-secondary); + animation: float 8s ease-in-out infinite reverse; +} + +@keyframes float { + 0%, 100% { transform: translate(0, 0); } + 50% { transform: translate(30px, 30px); } +} + +.particles { + position: fixed; + inset: 0; + pointer-events: none; + overflow: hidden; +} + +.particle { + position: absolute; + width: 4px; + height: 4px; + background: var(--accent-light); + border-radius: 50%; + opacity: 0.3; + animation: rise 10s linear infinite; +} + +@keyframes rise { + 0% { transform: translateY(100vh) scale(0); opacity: 0; } + 10% { opacity: 0.3; } + 90% { opacity: 0.3; } + 100% { transform: translateY(-100vh) scale(1); opacity: 0; } +} + +.container { + text-align: center; + z-index: 10; + padding: 2rem; + max-width: 600px; +} + +.error-code { + font-size: clamp(8rem, 25vw, 14rem); + font-weight: 700; + line-height: 1; + position: relative; + margin-bottom: 1rem; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary), var(--accent-light)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + animation: glitch 3s infinite; + cursor: pointer; + user-select: none; + transition: transform 0.3s ease, filter 0.3s ease; +} + +.error-code:hover { + transform: scale(1.05); + filter: brightness(1.2); +} + +.error-code:active { + transform: scale(0.98); +} + +.error-code::before, +.error-code::after { + content: '404'; + position: absolute; + top: 0; + left: 0; + right: 0; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + opacity: 0.8; +} + +.error-code::before { + animation: glitch-1 0.3s infinite linear alternate-reverse; + clip-path: polygon(0 0, 100% 0, 100% 35%, 0 35%); +} + +.error-code::after { + animation: glitch-2 0.3s infinite linear alternate-reverse; + clip-path: polygon(0 65%, 100% 65%, 100% 100%, 0 100%); +} + +@keyframes glitch { + 0%, 90%, 100% { transform: translate(0); } + 92% { transform: translate(-2px, 2px); } + 94% { transform: translate(2px, -2px); } + 96% { transform: translate(-2px, -2px); } + 98% { transform: translate(2px, 2px); } +} + +@keyframes glitch-1 { + 0% { transform: translate(0); } + 100% { transform: translate(-3px, 1px); } +} + +@keyframes glitch-2 { + 0% { transform: translate(0); } + 100% { transform: translate(3px, -1px); } +} + +.error-icon { + width: 80px; + height: 80px; + margin: 0 auto 2rem; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + animation: pulse-icon 2s ease-in-out infinite; +} + +.error-icon svg { + width: 40px; + height: 40px; + color: var(--accent-light); +} + +@keyframes pulse-icon { + 0%, 100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(139, 58, 98, 0.4); } + 50% { transform: scale(1.05); box-shadow: 0 0 0 15px rgba(139, 58, 98, 0); } +} + +.error-title { + font-size: 1.75rem; + font-weight: 600; + margin-bottom: 1rem; + color: var(--text-primary); +} + +.error-message { + font-size: 1rem; + color: var(--text-muted); + line-height: 1.7; + margin-bottom: 2.5rem; +} + +.error-message span { + color: var(--accent-light); +} + +.buttons { + display: flex; + gap: 1rem; + justify-content: center; + flex-wrap: wrap; +} + +.btn { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.875rem 1.75rem; + border-radius: 8px; + font-size: 0.95rem; + font-weight: 600; + text-decoration: none; + transition: all 0.3s ease; + cursor: pointer; + border: none; +} + +.btn svg { width: 18px; height: 18px; } + +.btn-primary { + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + color: white; + box-shadow: 0 4px 20px rgba(139, 58, 98, 0.3); +} + +.btn-primary:hover { + transform: translateY(-3px); + box-shadow: 0 8px 30px rgba(139, 58, 98, 0.4); +} + +.btn-secondary { + background: var(--glass-bg); + border: 1px solid var(--glass-border); + color: var(--text-secondary); +} + +.btn-secondary:hover { + background: rgba(255, 255, 255, 0.08); + border-color: var(--accent-primary); + color: var(--text-primary); +} + +.portal { + position: absolute; + width: 300px; + height: 300px; + pointer-events: none; + opacity: 0.1; +} + +.portal-left { left: -100px; top: 50%; transform: translateY(-50%); } +.portal-right { right: -100px; top: 50%; transform: translateY(-50%); } + +.portal-ring { + position: absolute; + inset: 0; + border: 2px solid var(--accent-primary); + border-radius: 50%; + animation: rotate 10s linear infinite; +} + +.portal-ring:nth-child(2) { inset: 20px; border-color: var(--accent-secondary); animation-duration: 8s; animation-direction: reverse; } +.portal-ring:nth-child(3) { inset: 40px; border-color: var(--accent-light); animation-duration: 6s; } + +@keyframes rotate { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } + +.footer { + position: fixed; + bottom: 2rem; + left: 50%; + transform: translateX(-50%); + display: flex; + align-items: center; + gap: 0.5rem; + color: var(--text-muted); + font-size: 0.85rem; + z-index: 10; +} + +.footer a { color: var(--accent-light); text-decoration: none; transition: color 0.3s ease; } +.footer a:hover { color: var(--text-primary); } + +.logo-mini { + font-weight: 700; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +/* Responsive 404 */ +@media (max-width: 768px) { + .error-code { font-size: clamp(5rem, 20vw, 8rem); } + .error-icon { width: 60px; height: 60px; margin-bottom: 1.5rem; } + .error-icon svg { width: 30px; height: 30px; } + .error-title { font-size: 1.4rem; } + .error-message { font-size: 0.9rem; padding: 0 1rem; } + .buttons { flex-direction: column; width: 100%; padding: 0 1rem; } + .btn { width: 100%; justify-content: center; padding: 1rem 1.5rem; } + .portal { display: none; } + .footer { bottom: 1rem; font-size: 0.75rem; } +} + +@media (max-width: 480px) { + .container { padding: 1rem; } + .error-code { font-size: clamp(4rem, 18vw, 6rem); margin-bottom: 0.5rem; } + .error-icon { width: 50px; height: 50px; margin-bottom: 1rem; } + .error-icon svg { width: 24px; height: 24px; } + .error-title { font-size: 1.2rem; } + .error-message { font-size: 0.85rem; margin-bottom: 2rem; } + .btn { font-size: 0.9rem; padding: 0.875rem 1.25rem; } +} + +@media (max-height: 600px) { + .error-icon { display: none; } + .error-code { margin-bottom: 0.5rem; } + .error-title { font-size: 1.2rem; margin-bottom: 0.5rem; } + .error-message { margin-bottom: 1.5rem; } +} \ No newline at end of file diff --git a/assets/css/legal.css b/assets/css/legal.css new file mode 100644 index 0000000..8459e8a --- /dev/null +++ b/assets/css/legal.css @@ -0,0 +1,46 @@ +/* assets/css/legal.css - styles pour les pages légales */ + +/* Hero */ +.page-hero { + display: flex; + align-items: center; + justify-content: center; + padding: 3rem 1rem; + color: var(--text-primary); +} +.page-hero .hero-content { max-width: 1100px; text-align: center; } +.page-hero .hero-content h1 { margin-bottom: 0.5rem; } +.page-hero .hero-content p { margin: 0; } + +/* Legal content */ +.legal-content { padding: 2.5rem 1rem 4rem; } +.legal-container { max-width: 900px; margin: 0 auto; } +.legal-section { margin-bottom: 2rem; } +.legal-section h2 { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 1.2rem; + font-weight: 700; + margin: 0 0 1rem 0; + color: var(--text-primary); +} +.legal-section h2 svg { width: 18px; height: 18px; flex-shrink: 0; } +.legal-card { + background: var(--card-bg); + padding: 1.5rem; + border-radius: 8px; + box-shadow: 0 4px 20px var(--shadow-color); + border: 1px solid rgba(255, 255, 255, 0.06); +} +.legal-card p, +.legal-card ul { + margin: 0 0 0.75rem 0; + line-height: 1.7; + font-size: 1rem; + color: var(--text-primary); +} +.legal-card p:last-child, +.legal-card ul:last-child { margin-bottom: 0; } +.legal-card ul { padding-left: 1.5rem; } +.legal-card ul li { margin-bottom: 0.25rem; } diff --git a/assets/css/main.css b/assets/css/main.css new file mode 100644 index 0000000..04a081a --- /dev/null +++ b/assets/css/main.css @@ -0,0 +1,4353 @@ +/* ============================================ + OmégaKube - Styles Globaux + ============================================ */ + +/* Custom Fonts */ +@font-face { + font-family: 'OmegaLarge'; + src: url('../fonts/custom_font_large.otf') format('opentype'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'OmegaSmall'; + src: url('../fonts/custom_font_small.otf') format('opentype'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Montserrat-Bold'; + src: url('../fonts/Montserrat/static/Montserrat-Bold.ttf') format('opentype'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Montserrat-BoldItalic'; + src: url('../fonts/Montserrat/static/Montserrat-BoldItalic.ttf') format('opentype'); + font-weight: normal; + font-style: normal; + font-display: swap; +} + +/* ============================================ + Variables & Thèmes + ============================================ */ +:root { + --bg-deep: #1a0f1f; + --bg-secondary: #251528; + --bg-tertiary: #2d1b33; + --accent-primary: #8b3a62; + --accent-secondary: #a64d79; + --accent-light: #c77daa; + --accent-glow: #d4a5c9; + --text-primary: #ffffff; + --text-secondary: #c9b8d0; + --text-muted: #8a7a91; + --glass-bg: rgba(45, 27, 51, 0.7); + --glass-border: rgba(167, 77, 121, 0.3); + --card-bg: rgba(37, 21, 40, 0.8); + --input-bg: #1a0f1f; + --shadow-color: rgba(139, 58, 98, 0.3); + --shape-color: rgba(255, 255, 255, 0.08); + --shape-border: rgba(255, 255, 255, 0.15); +} + +[data-theme="light"] { + --bg-deep: #faf7fb; + --bg-secondary: #f3edf5; + --bg-tertiary: #ebe3ee; + --accent-primary: #8b3a62; + --accent-secondary: #a64d79; + --accent-light: #c77daa; + --accent-glow: #8b3a62; + --text-primary: #1a0f1f; + --text-secondary: #4a3a52; + --text-muted: #6a5a72; + --glass-bg: rgba(255, 255, 255, 0.9); + --glass-border: rgba(139, 58, 98, 0.2); + --card-bg: rgba(255, 255, 255, 0.95); + --input-bg: #ffffff; + --shadow-color: rgba(139, 58, 98, 0.15); + --shape-color: rgba(139, 58, 98, 0.06); + --shape-border: rgba(139, 58, 98, 0.12); +} + +/* ============================================ + Reset & Base + ============================================ */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + font-family: 'Montserrat-Bold', 'Montserrat-BoldItalic',/* 'OmegaSmall',*/ 'Segoe UI', sans-serif; + background: var(--bg-deep); + color: var(--text-primary); + overflow-x: hidden; + line-height: 1.6; + transition: background 0.4s ease, color 0.4s ease; +} + +::-webkit-scrollbar { + width: 8px; +} +::-webkit-scrollbar-track { + background: var(--bg-deep); +} +::-webkit-scrollbar-thumb { + background: var(--accent-primary); + border-radius: 4px; +} + +/* ============================================ + Background Effects + ============================================ */ +.geo-bg { + position: fixed; + inset: 0; + z-index: -2; + background: linear-gradient(135deg, var(--bg-deep) 0%, var(--bg-secondary) 50%, var(--bg-tertiary) 100%); +} + +.grid-pattern { + position: fixed; + inset: 0; + z-index: -1; + background-image: radial-gradient(circle, var(--shape-border) 1px, transparent 1px); + background-size: 40px 40px; + opacity: 0.5; +} + +.geo-shapes { + position: fixed; + inset: 0; + z-index: -1; + pointer-events: none; + overflow: hidden; +} + +.shape { + position: absolute; + opacity: 0.6; + animation: floatShape 20s ease-in-out infinite; +} + +.shape-triangle { + width: 0; + height: 0; + border-left: 30px solid transparent; + border-right: 30px solid transparent; + border-bottom: 52px solid var(--shape-color); +} + +.shape-triangle-outline { + width: 60px; + height: 52px; + background: transparent; + border: 2px solid var(--shape-border); + clip-path: polygon(50% 0%, 0% 100%, 100% 100%); +} + +.shape-square { + width: 40px; + height: 40px; + background: var(--shape-color); +} + +.shape-square-outline { + width: 50px; + height: 50px; + background: transparent; + border: 2px solid var(--shape-border); +} + +.shape-rect { + width: 80px; + height: 30px; + background: var(--shape-color); +} + +.shape-diamond { + width: 40px; + height: 40px; + background: var(--shape-color); + transform: rotate(45deg); +} + +.shape-dots { + display: grid; + grid-template-columns: repeat(4, 8px); + grid-template-rows: repeat(4, 8px); + gap: 6px; +} + +.shape-dots span { + width: 4px; + height: 4px; + background: var(--shape-border); + border-radius: 50%; +} + +.shape:nth-child(1) { top: 10%; left: 5%; animation-delay: 0s; } +.shape:nth-child(2) { top: 20%; right: 10%; animation-delay: -3s; } +.shape:nth-child(3) { top: 60%; left: 8%; animation-delay: -6s; } +.shape:nth-child(4) { top: 75%; right: 5%; animation-delay: -9s; } +.shape:nth-child(5) { top: 40%; left: 3%; animation-delay: -12s; } +.shape:nth-child(6) { top: 85%; left: 15%; animation-delay: -15s; } +.shape:nth-child(7) { top: 15%; right: 20%; animation-delay: -4s; } +.shape:nth-child(8) { top: 50%; right: 3%; animation-delay: -8s; } +.shape:nth-child(9) { top: 30%; left: 12%; animation-delay: -11s; } +.shape:nth-child(10) { top: 90%; right: 15%; animation-delay: -14s; } + +@keyframes floatShape { + 0%, 100% { transform: translateY(0) rotate(0deg); } + 25% { transform: translateY(-20px) rotate(5deg); } + 50% { transform: translateY(-10px) rotate(-3deg); } + 75% { transform: translateY(-25px) rotate(3deg); } +} + +/* ============================================ + Navigation + ============================================ */ +nav { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 1000; + padding: 1.5rem 2rem; + transition: all 0.4s ease; +} + +nav.scrolled { + background: var(--glass-bg); + backdrop-filter: blur(20px); + border-bottom: 1px solid var(--glass-border); + padding: 1rem 2rem; +} + +.nav-container { + max-width: 1400px; + margin: 0 auto; + display: flex; + justify-content: space-between; + align-items: center; +} + +.logo { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.6rem; + text-decoration: none; + color: var(--text-primary); + display: flex; + align-items: center; + gap: 0.75rem; + transition: color 0.3s ease; +} + +.logo-icon { + width: 45px; + height: 45px; + flex-shrink: 0; +} + +.logo-icon img { + display: block; + max-width: 100%; + max-height: 100%; + width: auto; + height: auto; + object-fit: contain; +} + +.logo-text { + display: flex; + align-items: baseline; + gap: 0.15rem; +} + +.logo-text .omega { color: var(--text-primary); } +.logo-text .kube { color: var(--accent-light); } +.logo-short { display: none; } + +.nav-right { + display: flex; + align-items: center; + gap: 2rem; +} + +.nav-links { + display: flex; + gap: 2.5rem; + list-style: none; +} + +.nav-links a { + color: var(--text-secondary); + text-decoration: none; + font-weight: 500; + font-size: 0.95rem; + transition: color 0.3s ease; + position: relative; +} + +.nav-links a::after { + content: ''; + position: absolute; + bottom: -5px; + left: 0; + width: 0; + height: 2px; + background: var(--accent-primary); + transition: width 0.3s ease; +} + +.nav-links a:hover, +.nav-links a.active { + color: var(--text-primary); +} + +.nav-links a:hover::after, +.nav-links a.active::after { + width: 100%; +} + +/* Theme Toggle */ +.theme-toggle { + width: 56px; + height: 30px; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 50px; + cursor: pointer; + position: relative; + transition: all 0.3s ease; + display: flex; + align-items: center; + padding: 4px; + flex-shrink: 0; +} + +.theme-toggle:hover { + border-color: var(--accent-primary); +} + +.theme-toggle-thumb { + width: 22px; + height: 22px; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + border-radius: 50%; + transition: transform 0.3s ease; + box-shadow: 0 2px 10px var(--shadow-color); +} + +[data-theme="light"] .theme-toggle-thumb { + transform: translateX(26px); +} + +.theme-toggle .icon-moon, +.theme-toggle .icon-sun { + position: absolute; + width: 14px; + height: 14px; + transition: opacity 0.3s ease; +} + +.theme-toggle .icon-moon { + left: 8px; + opacity: 1; + color: var(--text-muted); +} + +.theme-toggle .icon-sun { + right: 8px; + opacity: 0.4; + color: var(--text-muted); +} + +[data-theme="light"] .theme-toggle .icon-moon { opacity: 0.4; } +[data-theme="light"] .theme-toggle .icon-sun { opacity: 1; } + +.mobile-toggle { + display: none; + flex-direction: column; + gap: 5px; + cursor: pointer; + padding: 5px; + flex-shrink: 0; +} + +.mobile-toggle span { + width: 25px; + height: 2px; + background: var(--text-primary); + transition: all 0.3s ease; +} + +/* Responsive: show mobile toggle and hide nav links on small screens */ +@media (max-width:880px) { + .nav-links { + display: none; + position: absolute; + right: 2rem; + top: 100%; + background: var(--glass-bg); + padding: 0.75rem 1rem; + border-radius: 8px; + box-shadow: 0 6px 18px rgba(2,6,23,.12); + flex-direction: column; + gap: 1rem; + width: auto; + min-width: 160px; + z-index: 1002; + } + .nav-links.active { display: block; } + .mobile-toggle { display: flex; } + + /* Debug helpers: make elements clearly visible during testing */ + /* .mobile-toggle { outline: 2px solid rgba(255,0,0,0.9) !important; } + .nav-links { outline: 2px dashed rgba(0,128,255,0.9) !important; } + .nav-links { z-index: 1100 !important; } */ +} + +/* ============================================ + Hero Sections + ============================================ */ +.hero { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + position: relative; + padding: 6rem 2rem 4rem; +} + +.page-hero { + min-height: 50vh; + display: flex; + align-items: center; + justify-content: center; + position: relative; + padding: 8rem 2rem 4rem; + text-align: center; +} + +/* Le contenu du page-hero est toujours visible dès le chargement */ +.page-hero .reveal, +.page-hero-content { + opacity: 1; + transform: none; + transition: none; + animation: fadeInUp 0.7s ease forwards; +} +.page-hero .reveal.active { + opacity: 1; + transform: none; +} + +.hero-content { + text-align: center; + max-width: 900px; + z-index: 1; +} + +.hero-badge { + display: inline-flex; + align-items: center; + gap: 0.5rem; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + padding: 0.5rem 1.25rem; + border-radius: 4px; + font-size: 0.85rem; + color: var(--accent-light); + margin-bottom: 2rem; + backdrop-filter: blur(10px); + animation: fadeInUp 0.8s ease forwards; +} + +.hero-badge::before { + content: ''; + width: 0; + height: 0; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 10px solid var(--accent-light); +} + +.hero h1, +.page-hero h1 { + font-family: 'OmegaLarge', sans-serif; + font-size: clamp(3rem, 8vw, 5.5rem); + font-weight: normal; + line-height: 1.1; + margin-bottom: 1.5rem; + animation: fadeInUp 0.8s ease 0.1s forwards; + opacity: 0; +} + +.page-hero h1 { + font-size: clamp(2.5rem, 6vw, 4rem); + opacity: 1; + animation: fadeInUp 0.8s ease forwards; +} + +.hero h1 .highlight, +.page-hero h1 .highlight { + color: var(--accent-light); +} + +.hero p, +.page-hero p { + font-size: 1.25rem; + color: var(--text-secondary); + max-width: 600px; + margin: 0 auto 2.5rem; + animation: fadeInUp 0.8s ease 0.2s forwards; + opacity: 0; +} + +.page-hero p { + margin-bottom: 0; +} + +.hero-buttons { + display: flex; + gap: 1rem; + justify-content: center; + flex-wrap: wrap; + animation: fadeInUp 0.8s ease 0.3s forwards; + opacity: 0; +} + +/* ============================================ + Buttons + ============================================ */ +.btn { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 1rem 2rem; + border-radius: 4px; + font-family: 'Montserrat-Bold', 'Montserrat-BoldItalic', /*'OmegaSmall',*/ sans-serif; + font-weight: 500; + font-size: 1rem; + text-decoration: none; + transition: all 0.3s ease; + cursor: pointer; + border: none; +} + +.btn-primary { + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + color: white; + box-shadow: 0 4px 20px var(--shadow-color); +} + +.btn-primary:hover { + transform: translateY(-3px); + box-shadow: 0 8px 30px var(--shadow-color); +} + +.btn-secondary { + background: var(--glass-bg); + color: var(--text-primary); + border: 1px solid var(--glass-border); + backdrop-filter: blur(10px); +} + +.btn-secondary:hover { + background: var(--accent-primary); + border-color: var(--accent-primary); + color: white; +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* ============================================ + Sections + ============================================ */ +section { + padding: 8rem 2rem; + position: relative; +} + +.section-header { + text-align: center; + max-width: 700px; + margin: 0 auto 5rem; +} + +.section-tag { + font-size: 0.85rem; + color: var(--accent-light); + text-transform: uppercase; + letter-spacing: 3px; + margin-bottom: 1rem; + display: flex; + align-items: center; + justify-content: center; + gap: 0.75rem; +} + +.section-tag::before, +.section-tag::after { + content: ''; + width: 30px; + height: 1px; + background: var(--accent-primary); +} + +.section-title { + font-family: 'OmegaLarge', sans-serif; + font-size: clamp(2rem, 5vw, 3rem); + font-weight: normal; + margin-bottom: 1rem; +} + +.section-desc { + color: var(--text-secondary); + font-size: 1.1rem; +} + +/* ============================================ + About Section + ============================================ */ +.about { + background: linear-gradient(180deg, transparent 0%, var(--bg-secondary) 50%, transparent 100%); +} + +.about-grid { + max-width: 1200px; + margin: 0 auto; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 4rem; + align-items: center; +} + +.about-content h3 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.5rem; + margin-bottom: 1.5rem; + color: var(--accent-light); +} + +.about-content p { + color: var(--text-secondary); + margin-bottom: 1.5rem; + font-size: 1.1rem; +} + +.about-stats { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 1.5rem; + margin-top: 2rem; +} + +.stat-item { + text-align: center; + padding: 1.5rem; + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + backdrop-filter: blur(10px); + position: relative; + overflow: hidden; +} + +.stat-item::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 3px; + background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); +} + +.stat-number { + font-family: 'OmegaLarge', sans-serif; + font-size: 2rem; + color: var(--accent-light); +} + +.stat-label { + font-size: 0.85rem; + color: var(--text-muted); + margin-top: 0.25rem; +} + +.about-card { + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + padding: 3rem; + backdrop-filter: blur(20px); + position: relative; + overflow: hidden; +} + +.about-card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 4px; + height: 100%; + background: linear-gradient(180deg, var(--accent-primary), var(--accent-secondary)); +} + +.about-card h4 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.25rem; + margin-bottom: 1rem; +} + +.about-card p { + color: var(--text-secondary); + line-height: 1.8; +} + +.deco-triangle { + position: absolute; + width: 0; + height: 0; + border-left: 20px solid transparent; + border-right: 20px solid transparent; + border-bottom: 35px solid var(--accent-primary); + opacity: 0.3; + bottom: 20px; + right: 20px; +} + +/* ============================================ + Services + ============================================ */ +.services-grid { + max-width: 1200px; + margin: 0 auto; + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 2rem; +} + +.service-card { + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + padding: 2.5rem; + backdrop-filter: blur(10px); + transition: all 0.4s ease; + position: relative; + overflow: hidden; +} + +.service-card::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 3px; + background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); + transform: scaleX(0); + transition: transform 0.4s ease; +} + +.service-card:hover { + transform: translateY(-10px); + border-color: var(--accent-primary); + box-shadow: 0 20px 40px var(--shadow-color); +} + +.service-card:hover::after { + transform: scaleX(1); +} + +.service-icon { + width: 70px; + height: 70px; + position: relative; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 1.5rem; +} + +.service-icon::before { + content: ''; + position: absolute; + width: 100%; + height: 100%; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); +} + +.service-icon svg { + width: 28px; + height: 28px; + color: white; + position: relative; + z-index: 1; +} + +.service-card h3 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.25rem; + margin-bottom: 1rem; +} + +.service-card p { + color: var(--text-secondary); + margin-bottom: 1.5rem; +} + +.service-features { + list-style: none; +} + +.service-features li { + display: flex; + align-items: center; + gap: 0.75rem; + color: var(--text-secondary); + margin-bottom: 0.75rem; + font-size: 0.95rem; +} + +.service-features li::before { + content: ''; + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 8px solid var(--accent-light); + flex-shrink: 0; +} + +/* Service Detail */ +.service-detail { + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + padding: 3rem; + margin-bottom: 3rem; + position: relative; + overflow: hidden; +} + +.service-detail::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 4px; + background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); +} + +.service-detail-header { + display: flex; + align-items: center; + gap: 2rem; + margin-bottom: 2rem; +} + +.service-detail-icon { + width: 100px; + height: 100px; + position: relative; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.service-detail-icon::before { + content: ''; + position: absolute; + width: 100%; + height: 100%; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); +} + +.service-detail-icon svg { + width: 40px; + height: 40px; + color: white; + position: relative; + z-index: 1; +} + +.service-detail h2 { + font-family: 'OmegaLarge', sans-serif; + font-size: 2rem; + margin-bottom: 0.5rem; +} + +.service-detail h2 + p { + color: var(--text-secondary); + font-size: 1.1rem; +} + +.service-detail-content { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 3rem; +} + +.service-detail-content h3 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.25rem; + margin-bottom: 1rem; + color: var(--accent-light); +} + +.service-detail-content p { + color: var(--text-secondary); + line-height: 1.8; + margin-bottom: 1.5rem; +} + +.service-detail-content ul { + list-style: none; +} + +.service-detail-content ul li { + display: flex; + align-items: center; + gap: 0.75rem; + color: var(--text-secondary); + margin-bottom: 0.75rem; +} + +.service-detail-content ul li::before { + content: ''; + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 8px solid var(--accent-light); + flex-shrink: 0; +} + +/* ============================================ + Team Carousel + ============================================ */ +.team { + background: linear-gradient(180deg, transparent 0%, var(--bg-secondary) 50%, transparent 100%); +} + +.team-carousel-container { + max-width: 1200px; + margin: 0 auto; + position: relative; + overflow: hidden; + padding: 0.5rem 1rem; +} + +.team-carousel { + display: flex; + transition: transform 0.5s ease; +} + +.team-card { + flex: 0 0 calc(33.333% - 2rem); + margin: 0 1rem; + text-align: center; + padding: 2rem; + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + backdrop-filter: blur(10px); + transition: all 0.4s ease; +} + +.team-card:hover { + border-color: var(--accent-primary); + box-shadow: 0 5px 20px var(--shadow-color); + cursor: pointer; +} + +.team-avatar { + width: 120px; + height: 120px; + margin: 0 auto 1.5rem; + position: relative; +} + +.team-avatar::before { + content: ''; + position: absolute; + inset: -4px; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + clip-path: polygon(29.3% 0%, 70.7% 0%, 100% 29.3%, 100% 70.7%, 70.7% 100%, 29.3% 100%, 0% 70.7%, 0% 29.3%); +} + +.team-avatar-inner { + position: absolute; + inset: 0; + background: var(--bg-secondary); + clip-path: polygon(29.3% 0%, 70.7% 0%, 100% 29.3%, 100% 70.7%, 70.7% 100%, 29.3% 100%, 0% 70.7%, 0% 29.3%); + display: flex; + align-items: center; + justify-content: center; + font-family: 'OmegaLarge', sans-serif; + font-size: 2rem; + overflow: hidden; + transition: background 0.3s ease; +} + +.team-avatar-inner img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.team-card h4 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.1rem; + margin-bottom: 0.25rem; +} + +.team-role { + color: var(--accent-light); + font-size: 0.9rem; + margin-bottom: 1rem; +} + +.team-desc { + color: var(--text-muted); + font-size: 0.9rem; +} + +/* Carousel Controls */ +.carousel-controls { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + margin-top: 2rem; +} + +.carousel-btn { + width: 50px; + height: 50px; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.3s ease; + color: var(--text-primary); +} + +.carousel-btn:hover { + background: var(--accent-primary); + border-color: var(--accent-primary); +} + +.carousel-btn svg { + width: 24px; + height: 24px; +} + +.carousel-dots { + display: flex; + gap: 0.5rem; +} + +.carousel-dot { + width: 10px; + height: 10px; + background: var(--glass-border); + border-radius: 50%; + cursor: pointer; + transition: all 0.3s ease; +} + +.carousel-dot.active { + background: var(--accent-primary); + width: 30px; + border-radius: 5px; +} + +/* ============================================ + Portfolio + ============================================ */ +.portfolio-grid { + max-width: 1200px; + margin: 0 auto; + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 2rem; +} + +.portfolio-item { + position: relative; + border-radius: 4px; + overflow: hidden; + aspect-ratio: 4/3; + background: var(--card-bg); + border: 1px solid var(--glass-border); + cursor: pointer; + transition: all 0.4s ease; +} + +.portfolio-item:hover { + transform: scale(1.02); + box-shadow: 0 20px 40px var(--shadow-color); +} + +.portfolio-item.hidden { + display: none; +} + +.portfolio-bg { + position: absolute; + inset: 0; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + /* opacity retiré — géré par portfolio-content gradient */ +} + +.portfolio-content { + position: absolute; + inset: 0; + display: flex; + flex-direction: column; + justify-content: flex-end; + padding: 2rem; + /* Gradient sombre uniquement en bas pour lisibilité du texte sans masquer l'image */ + background: linear-gradient(180deg, transparent 55%, rgba(10,10,15,0.92) 100%); + z-index: 2; +} + +.portfolio-tag { + font-size: 0.75rem; + color: var(--accent-light); + text-transform: uppercase; + letter-spacing: 2px; + margin-bottom: 0.5rem; + display: flex; + align-items: center; + gap: 0.5rem; +} + +.portfolio-tag::before { + content: ''; + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-bottom: 7px solid var(--accent-light); +} + +.portfolio-item h4 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.25rem; + color: #ffffff; /* Toujours blanc — lisible sur le gradient sombre en bas */ +} + +/* En mode clair, forcer le blanc sur les textes des cartes portfolio */ +[data-theme="light"] .portfolio-item h4, +[data-theme="light"] .portfolio-tag, +[data-theme="light"] .portfolio-tag::before { + color: #ffffff; +} + +.portfolio-item p { + display: none; /* Description masquée dans les cartes — visible uniquement dans la modal */ +} + +/* Portfolio Detail */ +.portfolio-detail { + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + overflow: hidden; + margin-bottom: 3rem; +} + +.portfolio-detail-image { + width: 100%; + height: 300px; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); +} + +.portfolio-detail-content { + padding: 2.5rem; +} + +.portfolio-detail-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 2rem; + flex-wrap: wrap; + gap: 1rem; +} + +.portfolio-detail h2 { + font-family: 'OmegaLarge', sans-serif; + font-size: 2rem; + margin-bottom: 0.5rem; +} + +.portfolio-detail-meta { + display: flex; + gap: 2rem; + color: var(--text-muted); + font-size: 0.9rem; +} + +.portfolio-detail-meta span { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.portfolio-detail-meta svg { + width: 16px; + height: 16px; +} + +.portfolio-detail p { + color: var(--text-secondary); + line-height: 1.8; + margin-bottom: 1.5rem; +} + +.portfolio-detail-features { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1rem; + margin-top: 2rem; + list-style: none; +} + +.portfolio-detail-features li { + display: flex; + align-items: center; + gap: 0.75rem; + color: var(--text-secondary); +} + +.portfolio-detail-features li::before { + content: ''; + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 8px solid var(--accent-light); + flex-shrink: 0; +} + +/* ============================================ + Contact + ============================================ */ +.contact { + background: linear-gradient(180deg, transparent 0%, var(--bg-secondary) 100%); +} + +.contact-wrapper { + max-width: 1000px; + margin: 0 auto; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 4rem; +} + +.contact-info h3 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.5rem; + margin-bottom: 1.5rem; +} + +.contact-info p { + color: var(--text-secondary); + margin-bottom: 2rem; + font-size: 1.1rem; +} + +.contact-links { + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.contact-link { + display: flex; + align-items: center; + gap: 1rem; + color: var(--text-secondary); + text-decoration: none; + transition: color 0.3s ease; +} + +.contact-link:hover { + color: var(--accent-light); +} + +.contact-link-icon { + width: 50px; + height: 50px; + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s ease; +} + +.contact-link:hover .contact-link-icon { + background: var(--accent-primary); + border-color: var(--accent-primary); +} + +.contact-form { + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + padding: 2.5rem; + backdrop-filter: blur(10px); + position: relative; +} + +.contact-form::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 4px; + background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); +} + +.form-group { + margin-bottom: 1.5rem; +} + +.form-group label { + display: block; + margin-bottom: 0.5rem; + font-weight: 500; + color: var(--text-secondary); +} + +.form-group input, +.form-group textarea { + width: 100%; + padding: 1rem; + background: var(--input-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + color: var(--text-primary); + font-family: 'Montserrat-Bold', 'Montserrat-BoldItalic', /*'OmegaSmall',*/ sans-serif; + font-size: 1rem; + transition: all 0.3s ease; +} + +.form-group input:focus, +.form-group textarea:focus { + outline: none; + border-color: var(--accent-primary); + box-shadow: 0 0 0 3px var(--shadow-color); +} + +.form-group textarea { + resize: vertical; + min-height: 120px; +} + +.form-submit { + width: 100%; +} + +/* ============================================ + Footer + ============================================ */ +footer { + padding: 4rem 2rem 2rem; + border-top: 1px solid var(--glass-border); +} + +.footer-content { + max-width: 1200px; + margin: 0 auto; + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 2rem; +} + +.footer-links { + display: flex; + gap: 2rem; +} + +.footer-links a { + color: var(--text-muted); + text-decoration: none; + transition: color 0.3s ease; +} + +.footer-links a:hover { + color: var(--text-primary); +} + +.footer-social { + display: flex; + gap: 1rem; +} + +.footer-social a { + width: 44px; + height: 44px; + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + color: var(--text-secondary); + transition: all 0.3s ease; + flex-shrink: 0; +} + +.footer-social a svg { + width: 20px; + height: 20px; + fill: currentColor; + display: block; +} + +.footer-social a:hover { + background: var(--accent-primary); + border-color: var(--accent-primary); + color: white; +} + +/* ── Partners Section ──────────────────────────────────────────────────────── */ +.partners { + padding: 6rem 2rem; + max-width: 1200px; + margin: 0 auto; +} + +.partners-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 1.5rem; + margin-top: 3rem; +} + +.partner-card { + display: flex; + align-items: center; + gap: 1.25rem; + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 8px; + padding: 1.5rem; + text-decoration: none; + color: var(--text-primary); + transition: all 0.3s ease; +} + +.partner-card:hover { + border-color: var(--accent-primary); + transform: translateY(-3px); + box-shadow: 0 8px 30px rgba(var(--accent-primary-rgb, 142, 36, 170), 0.15); +} + +.partner-avatar { + width: 56px; + height: 56px; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + font-family: 'OmegaLarge', sans-serif; + font-size: 1rem; + color: white; + flex-shrink: 0; +} + +.partner-info h4 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1rem; + margin-bottom: 0.25rem; + color: var(--text-primary); +} + +.partner-info p { + font-size: 0.85rem; + color: var(--text-muted); +} + +/* ── Easter Egg ────────────────────────────────────────────────────────────── */ +#easter-egg-overlay { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.85); + display: flex; + align-items: center; + justify-content: center; + z-index: 9999; + animation: fadeIn 0.3s ease; +} + +.easter-egg-box { + background: var(--card-bg); + border: 2px solid var(--accent-primary); + border-radius: 12px; + padding: 3rem 2.5rem; + text-align: center; + max-width: 480px; + width: 90%; + animation: scaleIn 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); +} + +.easter-egg-icon { + font-size: 4rem; + margin-bottom: 1rem; + display: block; +} + +.easter-egg-box h2 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.5rem; + color: var(--accent-light); + margin-bottom: 1rem; +} + +.easter-egg-box p { + color: var(--text-secondary); + margin-bottom: 2rem; +} + +@keyframes scaleIn { + from { transform: scale(0.7); opacity: 0; } + to { transform: scale(1); opacity: 1; } +} + +.footer-bottom { + max-width: 1200px; + margin: 2rem auto 0; + padding-top: 2rem; + border-top: 1px solid var(--glass-border); + text-align: center; + color: var(--text-muted); + font-size: 0.9rem; +} + +/* ============================================ + Animations + ============================================ */ +.reveal { + opacity: 0; + transform: translateY(40px); + transition: all 0.8s ease; +} + +.reveal.active { + opacity: 1; + transform: translateY(0); +} + +.reveal-delay-1 { transition-delay: 0.1s; } +.reveal-delay-2 { transition-delay: 0.2s; } +.reveal-delay-3 { transition-delay: 0.3s; } + +/* ============================================ + Responsive + ============================================ */ +@media (max-width: 1024px) { + .services-grid, + .portfolio-grid { + grid-template-columns: repeat(2, 1fr); + } + + .team-card { + flex: 0 0 calc(50% - 2rem); + } +} + +@media (max-width: 768px) { + nav { + padding: 1rem; + } + + nav.scrolled { + padding: 0.75rem 1rem; + } + + .nav-links { + display: none; + position: absolute; + top: 100%; + left: 0; + right: 0; + background: var(--glass-bg); + backdrop-filter: blur(20px); + flex-direction: column; + padding: 2rem; + gap: 1.5rem; + border-bottom: 1px solid var(--glass-border); + } + + .nav-links.active { + display: flex; + } + + .mobile-toggle { + display: flex; + } + + .mobile-toggle.active span:nth-child(1) { + transform: rotate(45deg) translate(5px, 5px); + } + + .mobile-toggle.active span:nth-child(2) { + opacity: 0; + } + + .mobile-toggle.active span:nth-child(3) { + transform: rotate(-45deg) translate(5px, -5px); + } + + .nav-right { + gap: 0.75rem; + } + + .logo-text .logo-full { + display: none; + } + + .logo-short { + display: flex !important; + align-items: baseline; + gap: 0.1rem; + } + + .logo-short .omega-symbol { + color: var(--text-primary); + } + + .logo-short .kube-short { + color: var(--accent-light); + } + + .logo-icon { + width: 35px; + height: 35px; + } + + .logo { + font-size: 1.3rem; + gap: 0.5rem; + } + + .about-grid, + .contact-wrapper { + grid-template-columns: 1fr; + gap: 3rem; + } + + .services-grid, + .portfolio-grid { + grid-template-columns: 1fr; + } + + .service-detail-content, + .portfolio-detail-features { + grid-template-columns: 1fr; + } + + .service-detail-header { + flex-direction: column; + text-align: center; + } + + .team-card { + flex: 0 0 calc(100% - 2rem); + } + + section { + padding: 5rem 1.5rem; + } + + .hero { + padding: 8rem 1.5rem 4rem; + } + + .footer-content { + flex-direction: column; + text-align: center; + } + + .footer-links { + flex-wrap: wrap; + justify-content: center; + } +} + +@media (max-width: 480px) { + .about-stats { + grid-template-columns: 1fr; + gap: 1rem; + } + + .theme-toggle { + width: 48px; + height: 26px; + } + + .theme-toggle-thumb { + width: 18px; + height: 18px; + } + + [data-theme="light"] .theme-toggle-thumb { + transform: translateX(22px); + } + + .carousel-controls { + flex-wrap: wrap; + } +} + +/* ============================================ + Team Member Modal + ============================================ */ +.team-modal-overlay { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.8); + backdrop-filter: blur(10px); + z-index: 2000; + display: flex; + align-items: center; + justify-content: center; + padding: 1rem; + overflow-y: auto; + opacity: 0; + visibility: hidden; + transition: all 0.3s ease; +} + +.team-modal-overlay.active { + opacity: 1; + visibility: visible; +} + +.team-modal { + background: var(--card-bg); + border: 1px solid var(--glass-border); + 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; + overscroll-behavior: contain; +} + +.team-modal-overlay.active .team-modal { + transform: scale(1) translateY(0); +} + +.team-modal-header { + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + padding: 2rem; + text-align: center; + position: relative; +} + +.team-modal-close { + position: absolute; + top: 1rem; + right: 1rem; + width: 36px; + height: 36px; + background: rgba(255, 255, 255, 0.2); + border: none; + border-radius: 50%; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + color: white; + transition: all 0.3s ease; +} + +.team-modal-close:hover { + background: rgba(255, 255, 255, 0.3); + transform: rotate(90deg); +} + +.team-modal-close svg { + width: 20px; + height: 20px; +} + +.team-modal-avatar { + width: 120px; + height: 120px; + margin: 0 auto; + position: relative; +} + +.team-modal-avatar::before { + content: ''; + position: absolute; + inset: -4px; + background: rgba(255, 255, 255, 0.3); + clip-path: polygon(29.3% 0%, 70.7% 0%, 100% 29.3%, 100% 70.7%, 70.7% 100%, 29.3% 100%, 0% 70.7%, 0% 29.3%); +} + +.team-modal-avatar-inner { + position: absolute; + inset: 0; + background: var(--bg-secondary); + clip-path: polygon(29.3% 0%, 70.7% 0%, 100% 29.3%, 100% 70.7%, 70.7% 100%, 29.3% 100%, 0% 70.7%, 0% 29.3%); + display: flex; + align-items: center; + justify-content: center; + font-family: 'OmegaLarge', sans-serif; + font-size: 2.5rem; + color: var(--text-primary); +} + +.team-modal-name { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.5rem; + color: white; + margin-top: 1rem; +} + +.team-modal-role { + color: rgba(255, 255, 255, 0.8); + font-size: 0.95rem; + margin-top: 0.25rem; +} + +.team-modal-content { + padding: 2rem; +} + +.team-modal-bio { + color: var(--text-secondary); + line-height: 1.8; + margin-bottom: 1.5rem; +} + +.team-modal-stats { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 1rem; + margin-bottom: 1.5rem; +} + +.team-modal-stat { + text-align: center; + padding: 1rem; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; +} + +.team-modal-stat-value { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.25rem; + color: var(--accent-light); +} + +.team-modal-stat-label { + font-size: 0.75rem; + color: var(--text-muted); + margin-top: 0.25rem; +} + +.team-modal-skills { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.team-modal-skill { + padding: 0.5rem 1rem; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + font-size: 0.85rem; + color: var(--text-secondary); + transition: all 0.3s ease; +} + +.team-modal-skill:hover { + border-color: var(--accent-primary); + color: var(--accent-light); +} + +.team-modal-social { + display: flex; + justify-content: center; + gap: 1rem; + margin-top: 1.5rem; + padding-top: 1.5rem; + border-top: 1px solid var(--glass-border); +} + +.team-modal-social a { + width: 40px; + height: 40px; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + color: var(--text-secondary); + transition: all 0.3s ease; +} + +.team-modal-social a:hover { + background: var(--accent-primary); + border-color: var(--accent-primary); + color: white; +} + +.team-modal-social a svg { + width: 18px; + height: 18px; + fill: currentColor; + display: block; +} + +@media (max-width: 480px) { + .team-modal-stats { + grid-template-columns: repeat(3, 1fr); + } + + .team-modal { + max-height: calc(100dvh - 1rem); + border-radius: 6px; + } + + .team-modal-header { + padding: 1.5rem 1rem; + } + + .team-modal-content { + 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; + } +} + +/* ============================================ + Pagination + ============================================ */ +.pagination { + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; + margin-top: 4rem; + flex-wrap: wrap; +} + +.pagination-btn { + width: 44px; + height: 44px; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + color: var(--text-secondary); + font-family: 'Montserrat-Bold', 'Montserrat-BoldItalic', /*'OmegaSmall',*/ sans-serif; + font-size: 0.95rem; + transition: all 0.3s ease; +} + +.pagination-btn:hover:not(:disabled) { + background: var(--accent-primary); + border-color: var(--accent-primary); + color: white; +} + +.pagination-btn:disabled { + opacity: 0.4; + cursor: not-allowed; +} + +.pagination-btn.active { + background: var(--accent-primary); + border-color: var(--accent-primary); + color: white; +} + +.pagination-btn svg { + width: 20px; + height: 20px; +} + +.pagination-arrow { + width: 50px; +} + +.pagination-ellipsis { + width: 44px; + height: 44px; + display: flex; + align-items: center; + justify-content: center; + color: var(--text-muted); + font-size: 1.2rem; + letter-spacing: 2px; +} + +.pagination-info { + width: 100%; + text-align: center; + margin-top: 1rem; + color: var(--text-muted); + font-size: 0.9rem; +} + +@media (max-width: 480px) { + .pagination-btn { + width: 38px; + height: 38px; + font-size: 0.85rem; + } + + .pagination-arrow { + width: 44px; + } +} + +/* ============================================ + Bento Grid - Projets Phares + ============================================ */ +.bento-grid { + display: grid; + grid-template-columns: repeat(12, 1fr); + grid-template-rows: auto; + gap: 1.5rem; + max-width: 1200px; + margin: 0 auto; +} + +.bento-item { + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 8px; + overflow: hidden; + transition: all 0.4s ease; + position: relative; +} + +.bento-item:hover { + border-color: var(--accent-primary); + box-shadow: 0 20px 40px var(--shadow-color); + transform: translateY(-5px); +} + +/* Bento Project Layout */ +.bento-project { + grid-column: span 12; + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: auto auto; + gap: 1.5rem; + padding: 0; + background: transparent; + border: none; +} + +.bento-project:hover { + transform: none; + box-shadow: none; +} + +.bento-project .bento-image { + grid-column: 1; + grid-row: 1 / 3; + min-height: 400px; + background-size: cover; + background-position: center; + border-radius: 8px; + position: relative; + overflow: hidden; +} + +/* Pas d'overlay sur le bento — juste gradient bas pour lisibilité texte */ +.bento-project .bento-image::before { + display: none; +} + +/* Gradient sombre en bas pour le texte */ +.bento-project .bento-image::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 50%; + background: linear-gradient(to top, rgba(10,10,15,0.9) 0%, transparent 100%); + z-index: 2; + pointer-events: none; +} + +.bento-image-content { + position: absolute; + bottom: 2rem; + left: 2rem; + right: 2rem; + z-index: 3; +} + +.bento-image-content .portfolio-tag { + margin-bottom: 0.75rem; +} + +.bento-image-content h3 { + font-family: 'OmegaLarge', sans-serif; + font-size: 2rem; + margin-bottom: 0.5rem; + color: #ffffff; +} + +.bento-image-content p { + color: rgba(255,255,255,0.85); + font-size: 1rem; +} + +/* Mode clair — forcer blanc sur textes bento (gradient sombre garantit lisibilité) */ +[data-theme="light"] .bento-image-content h3, +[data-theme="light"] .bento-image-content p, +[data-theme="light"] .bento-image-content .portfolio-tag { + color: #ffffff; +} + +/* Mode clair — tag catégorie dans la modal projet : couleur contrastée */ +[data-theme="light"] .project-modal .portfolio-tag, +[data-theme="light"] #modal-category { + color: var(--accent-primary); +} +[data-theme="light"] .project-modal .portfolio-tag::before, +[data-theme="light"] #modal-category::before { + border-bottom-color: var(--accent-primary); +} + +/* Stats Grid */ +.bento-stats { + grid-column: 2; + grid-row: 1; + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1rem; +} + +.bento-stat { + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 8px; + padding: 1.5rem; + text-align: center; + transition: all 0.3s ease; +} + +.bento-stat:hover { + border-color: var(--accent-primary); + background: var(--glass-bg); +} + +.bento-stat-icon { + width: 50px; + height: 50px; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + margin: 0 auto 1rem; +} + +.bento-stat-icon svg { + width: 24px; + height: 24px; + color: white; +} + +.bento-stat-value { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.75rem; + color: var(--accent-light); + margin-bottom: 0.25rem; +} + +.bento-stat-label { + font-size: 0.85rem; + color: var(--text-muted); +} + +/* Info Card */ +.bento-info { + grid-column: 2; + grid-row: 2; + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 8px; + padding: 2rem; + display: flex; + flex-direction: column; +} + +.bento-info h4 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.1rem; + color: var(--accent-light); + margin-bottom: 1rem; + display: flex; + align-items: center; + gap: 0.5rem; +} + +.bento-info h4::before { + content: ''; + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 8px solid var(--accent-light); +} + +.bento-info p { + color: var(--text-secondary); + line-height: 1.7; + margin-bottom: 1.5rem; + flex-grow: 1; +} + +.bento-features { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.bento-feature { + padding: 0.4rem 0.8rem; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + font-size: 0.8rem; + color: var(--text-secondary); + transition: all 0.3s ease; +} + +.bento-feature:hover { + border-color: var(--accent-primary); + color: var(--accent-light); +} + +/* Tech Stack */ +.bento-tech { + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 8px; + padding: 1.5rem; +} + +.bento-tech h4 { + font-family: 'OmegaLarge', sans-serif; + font-size: 0.9rem; + color: var(--accent-light); + margin-bottom: 1rem; +} + +.bento-tech-list { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.bento-tech-item { + padding: 0.5rem 1rem; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + font-size: 0.85rem; + color: var(--text-secondary); + display: flex; + align-items: center; + gap: 0.5rem; + transition: all 0.3s ease; +} + +.bento-tech-item:hover { + border-color: var(--accent-primary); + color: var(--accent-light); +} + +.bento-tech-item svg { + width: 16px; + height: 16px; +} + +/* Alternate Layout (Image Right) */ +.bento-project.reverse .bento-image { + grid-column: 2; + grid-row: 1 / 3; +} + +.bento-project.reverse .bento-stats { + grid-column: 1; + grid-row: 1; +} + +.bento-project.reverse .bento-info { + grid-column: 1; + grid-row: 2; +} + +/* Bento Divider */ +.bento-divider { + grid-column: span 12; + height: 1px; + background: linear-gradient(90deg, transparent, var(--glass-border), transparent); + margin: 2rem 0; +} + +@media (max-width: 1024px) { + .bento-project { + grid-template-columns: 1fr; + } + + .bento-project .bento-image { + grid-column: 1; + grid-row: 1; + min-height: 300px; + } + + .bento-project .bento-stats { + grid-column: 1; + grid-row: 2; + } + + .bento-project .bento-info { + grid-column: 1; + grid-row: 3; + } + + .bento-project.reverse .bento-image, + .bento-project.reverse .bento-stats, + .bento-project.reverse .bento-info { + grid-column: 1; + } + + .bento-project.reverse .bento-image { grid-row: 1; } + .bento-project.reverse .bento-stats { grid-row: 2; } + .bento-project.reverse .bento-info { grid-row: 3; } +} + +@media (max-width: 480px) { + .bento-stats { + grid-template-columns: 1fr; + } + + .bento-project .bento-image { + min-height: 250px; + } + + .bento-image-content h3 { + font-size: 1.5rem; + } +} + +/* ============================================ + Project Modal - Galerie + ============================================ */ +.project-modal-overlay { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.9); + backdrop-filter: blur(10px); + z-index: 2000; + display: flex; + align-items: center; + justify-content: center; + padding: 2rem; + opacity: 0; + visibility: hidden; + transition: all 0.3s ease; +} + +.project-modal-overlay.active { + opacity: 1; + visibility: visible; +} + +.project-modal { + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 12px; + max-width: 900px; + width: 100%; + max-height: 90vh; + overflow: hidden; + position: relative; + transform: scale(0.9) translateY(20px); + transition: transform 0.3s ease; + display: flex; + flex-direction: column; +} + +.project-modal-overlay.active .project-modal { + transform: scale(1) translateY(0); +} + +.project-modal-close { + position: absolute; + top: 1rem; + right: 1rem; + width: 44px; + height: 44px; + background: rgba(0, 0, 0, 0.5); + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + color: white; + transition: all 0.3s ease; + z-index: 10; +} + +.project-modal-close:hover { + background: var(--accent-primary); + border-color: var(--accent-primary); +} + +.project-modal-close svg { + width: 24px; + height: 24px; +} + +/* Gallery */ +.project-gallery { + position: relative; + width: 100%; + height: 350px; + overflow: hidden; +} + +.project-gallery-slides { + position: relative; + width: 100%; + height: 100%; +} + +.project-gallery-slide { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + pointer-events: none; + transition: opacity 0.35s ease, transform 0.35s ease; + transform: translateX(100%); + will-change: transform, opacity; +} + +/* Slide à gauche de la courante */ +.project-gallery-slide.slide-left { + transform: translateX(-100%); + opacity: 0; +} + +/* Slide à droite de la courante */ +.project-gallery-slide.slide-right { + transform: translateX(100%); + opacity: 0; +} + +/* Slide active — visible */ +.project-gallery-slide.active { + opacity: 1; + transform: translateX(0) !important; + pointer-events: auto; +} + +.project-gallery-slide::before { + content: ''; + position: absolute; + inset: 0; + background: linear-gradient(135deg, rgba(139, 58, 98, 0.4), rgba(45, 27, 51, 0.6)); +} + +.gallery-nav { + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 44px; + height: 44px; + background: rgba(0, 0, 0, 0.5); + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + color: white; + transition: all 0.3s ease; + z-index: 5; +} + +.gallery-nav:hover { + background: var(--accent-primary); + border-color: var(--accent-primary); +} + +.gallery-nav svg { + width: 20px; + height: 20px; +} + +.gallery-nav.prev { left: 1rem; } +.gallery-nav.next { right: 1rem; } + +.gallery-dots { + position: absolute; + bottom: 1rem; + left: 50%; + transform: translateX(-50%); + display: flex; + gap: 0.5rem; + z-index: 5; +} + +.gallery-dot { + width: 10px; + height: 10px; + background: rgba(255, 255, 255, 0.4); + border-radius: 50%; + cursor: pointer; + transition: all 0.3s ease; +} + +.gallery-dot.active { + background: white; + width: 30px; + border-radius: 5px; +} + +/* Modal Content */ +.project-modal-content { + padding: 2rem; + overflow-y: auto; + flex-grow: 1; +} + +.project-modal-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 1.5rem; + flex-wrap: wrap; + gap: 1rem; +} + +.project-modal-header h2 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.75rem; + margin-bottom: 0.5rem; +} + +.project-modal-meta { + display: flex; + gap: 1.5rem; + color: var(--text-muted); + font-size: 0.9rem; +} + +.project-modal-meta span { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.project-modal-meta svg { + width: 16px; + height: 16px; +} + +.project-modal-desc { + color: var(--text-secondary); + line-height: 1.8; + margin-bottom: 2rem; +} + +/* Modal Tabs */ +.project-modal-tabs { + display: flex; + gap: 0.5rem; + margin-bottom: 1.5rem; + border-bottom: 1px solid var(--glass-border); + padding-bottom: 1rem; +} + +.project-modal-tab { + padding: 0.75rem 1.25rem; + background: transparent; + border: 1px solid var(--glass-border); + border-radius: 4px; + color: var(--text-secondary); + font-family: 'Montserrat-Bold', 'Montserrat-BoldItalic', /*'OmegaSmall',*/ sans-serif; + font-size: 0.9rem; + cursor: pointer; + transition: all 0.3s ease; +} + +.project-modal-tab:hover, +.project-modal-tab.active { + background: var(--accent-primary); + border-color: var(--accent-primary); + color: white; +} + +.project-modal-tab-content { + display: none; +} + +.project-modal-tab-content.active { + display: block; +} + +/* Features Grid */ +.project-features-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1rem; +} + +.project-feature-item { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 1rem; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 4px; + color: var(--text-secondary); + transition: all 0.3s ease; +} + +.project-feature-item:hover { + border-color: var(--accent-primary); +} + +.project-feature-item::before { + content: ''; + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 8px solid var(--accent-light); + flex-shrink: 0; +} + +/* Tech Stack Grid */ +.project-tech-grid { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; +} + +/* project-tech-item and project-stats-grid → see end of file */ + +/* project-stat-card-value / label → see end of file */ + +@media (max-width: 768px) { + .project-modal { + max-height: 95vh; + margin: 0.5rem; + } + + .project-gallery { + height: 250px; + } + + .project-modal-content { + padding: 1.5rem; + } + + .project-features-grid, + .project-stats-grid { + grid-template-columns: 1fr; + } + + .project-modal-tabs { + flex-wrap: wrap; + } +} + +/* Portfolio Item Click State */ +.portfolio-item { + cursor: pointer; +} + +.portfolio-item::before { + content: ''; + position: absolute; + inset: 0; + background: transparent; + z-index: 3; + transition: background 0.3s ease; +} + +.portfolio-item:hover::before { + background: rgba(139, 58, 98, 0.08); +} + +.portfolio-item:active { + transform: scale(0.98); +} + +/* ============================================ + Process Timeline + ============================================ */ +.process-section { + padding: 6rem 2rem; + background: linear-gradient(180deg, transparent 0%, var(--bg-secondary) 50%, transparent 100%); +} + +.process-timeline { + max-width: 1000px; + margin: 0 auto; + display: flex; + justify-content: space-between; + position: relative; + padding: 2rem 0; +} + +.process-timeline::before { + content: ''; + position: absolute; + top: 50%; + left: 10%; + right: 10%; + height: 3px; + background: var(--glass-border); + transform: translateY(-50%); + z-index: 0; +} + +.process-timeline::after { + content: ''; + position: absolute; + top: 50%; + left: 10%; + height: 3px; + background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); + transform: translateY(-50%); + z-index: 1; + width: 0%; + transition: width 5s ease; +} + +.process-timeline.animated::after { + width: 80%; +} + +.process-step { + display: flex; + flex-direction: column; + align-items: center; + position: relative; + z-index: 2; + flex: 1; +} + +.process-step-number { + width: 70px; + height: 70px; + background: var(--card-bg); + border: 3px solid var(--glass-border); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-family: 'OmegaLarge', sans-serif; + font-size: 1.5rem; + color: var(--text-muted); + margin-bottom: 1.5rem; + transition: all 0.5s ease; + position: relative; +} + +.process-step-number::before { + content: ''; + position: absolute; + inset: -6px; + border-radius: 50%; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + opacity: 0; + z-index: -1; + transition: opacity 0.5s ease; +} + +.process-step.active .process-step-number { + border-color: var(--accent-primary); + color: var(--accent-light); + background: var(--bg-deep); +} + +.process-step.active .process-step-number::before { + opacity: 1; +} + +.process-step-icon { + position: absolute; + width: 30px; + height: 30px; + color: var(--text-muted); + transition: color 0.5s ease; +} + +.process-step.active .process-step-icon { + color: var(--accent-light); +} + +[data-theme="light"] .process-step.active .process-step-icon { + color: var(--accent-primary); +} + +.process-step-content { + text-align: center; + max-width: 150px; +} + +.process-step-title { + font-family: 'OmegaLarge', sans-serif; + font-size: 1rem; + margin-bottom: 0.5rem; + color: var(--text-primary); +} + +.process-step-desc { + font-size: 0.85rem; + color: var(--text-muted); + line-height: 1.5; +} + +@media (max-width: 768px) { + .process-timeline { + flex-direction: column; + gap: 2rem; + padding: 0; + } + + .process-timeline::before, + .process-timeline::after { + top: 10%; + bottom: 10%; + left: 35px; + right: auto; + width: 3px; + height: auto; + transform: none; + } + + .process-timeline::after { + height: 0%; + width: 3px; + } + + .process-timeline.animated::after { + height: 80%; + width: 3px; + } + + .process-step { + flex-direction: row; + gap: 1.5rem; + } + + .process-step-number { + margin-bottom: 0; + flex-shrink: 0; + } + + .process-step-content { + text-align: left; + max-width: none; + } +} + +/* ============================================ + Service Tabs + ============================================ */ +.service-tabs-section { + padding: 6rem 2rem; +} + +.service-tabs-container { + max-width: 1200px; + margin: 0 auto; +} + +.service-tabs-nav { + display: flex; + justify-content: center; + gap: 1rem; + margin-bottom: 3rem; + flex-wrap: wrap; +} + +.service-tab-btn { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 1rem 1.5rem; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 8px; + color: var(--text-secondary); + font-family: 'Montserrat-Bold', 'Montserrat-BoldItalic', /*'OmegaSmall',*/ sans-serif; + font-size: 0.95rem; + cursor: pointer; + transition: all 0.3s ease; +} + +.service-tab-btn:hover { + border-color: var(--accent-primary); + color: var(--text-primary); +} + +.service-tab-btn.active { + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + border-color: transparent; + color: white; +} + +.service-tab-btn svg { + width: 20px; + height: 20px; +} + +/* Service Tags / Stamps */ +.service-stamp { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.3rem 0.6rem; + font-family: 'OmegaLarge', sans-serif; + font-size: 0.65rem; + text-transform: uppercase; + letter-spacing: 1px; + border-radius: 4px; + font-weight: bold; + transform: rotate(12deg); + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); + animation: stampPop 0.4s ease; +} + +@keyframes stampPop { + 0% { transform: rotate(12deg) scale(0); opacity: 0; } + 50% { transform: rotate(12deg) scale(1.2); } + 100% { transform: rotate(12deg) scale(1); opacity: 1; } +} + +.service-stamp-free { + background: linear-gradient(135deg, #2ecc71, #27ae60); + color: white; + border: 2px dashed rgba(255, 255, 255, 0.5); +} + +.service-stamp-new { + background: linear-gradient(135deg, #3498db, #2980b9); + color: white; + border: 2px dashed rgba(255, 255, 255, 0.5); +} + +.service-stamp-soon { + background: linear-gradient(135deg, #686b6d, #828e96); + color: white; + border: 2px dashed rgba(255, 255, 255, 0.5); +} + +.service-stamp-popular { + background: linear-gradient(135deg, #e74c3c, #c0392b); + color: white; + border: 2px dashed rgba(255, 255, 255, 0.5); +} + +.service-stamp-promo { + background: linear-gradient(135deg, #f39c12, #e67e22); + color: white; + border: 2px dashed rgba(255, 255, 255, 0.5); +} + +.service-stamp-best { + background: linear-gradient(135deg, #9b59b6, #8e44ad); + color: white; + border: 2px dashed rgba(255, 255, 255, 0.5); +} + +/* Stamp on tab button */ +.service-tab-btn { + position: relative; +} + +.service-tab-btn .service-stamp { + position: absolute; + top: -10px; + right: -10px; + font-size: 0.55rem; + padding: 0.2rem 0.5rem; + z-index: 10; +} + +/* Large stamp for service visual */ +.service-visual-stamp { + position: absolute; + top: 20px; + right: 20px; + z-index: 10; + padding: 0.5rem 1rem; + font-size: 0.85rem; + transform: rotate(12deg); + border: 3px dashed rgba(255, 255, 255, 0.6); + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); +} + +.service-visual-stamp::before { + content: ''; + position: absolute; + inset: -6px; + border: 2px solid currentColor; + border-radius: 6px; + opacity: 0.3; +} + +/* Stamp in header - inline with transparency */ +.service-tab-header { + position: relative; +} + +.service-tab-header .service-stamp-inline { + display: inline-flex; + margin-left: 1rem; + vertical-align: middle; + transform: rotate(12deg); + opacity: 0.7; + font-size: 0.55rem; + padding: 0.2rem 0.45rem; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + transition: opacity 0.3s ease; +} + +.service-tab-header .service-stamp-inline:hover { + opacity: 1; +} + +/* Animated stamp effect */ +.service-stamp-animated { + animation: stampBounce 2s ease infinite; +} + +@keyframes stampBounce { + 0%, 100% { transform: rotate(12deg) scale(1); } + 50% { transform: rotate(12deg) scale(1.05); } +} + +/* Ribbon style stamp */ +.service-ribbon { + position: absolute; + top: 20px; + left: -35px; + background: linear-gradient(135deg, #2ecc71, #27ae60); + color: white; + padding: 0.5rem 3rem; + font-family: 'OmegaLarge', sans-serif; + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 1px; + transform: rotate(-45deg); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); + z-index: 10; +} + +.service-ribbon::before, +.service-ribbon::after { + content: ''; + position: absolute; + bottom: -5px; + border: 5px solid #1e8449; + border-bottom-color: transparent; +} + +.service-ribbon::before { + left: 0; + border-left-color: transparent; +} + +.service-ribbon::after { + right: 0; + border-right-color: transparent; +} + +/* Tab Content */ +.service-tab-content { + display: none; + animation: fadeInTab 0.5s ease; +} + +.service-tab-content.active { + display: block; +} + +@keyframes fadeInTab { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.service-tab-grid { + display: grid; + grid-template-columns: 1fr 1.2fr; + gap: 3rem; + align-items: center; +} + +/* Service Visual */ +.service-visual { + position: relative; + height: 400px; + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 12px; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; +} + +.service-visual::before { + content: ''; + position: absolute; + inset: 0; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + opacity: 0.1; +} + +.service-visual-icon { + position: relative; + z-index: 1; +} + +.service-visual-icon .icon-main { + width: 120px; + height: 120px; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + border-radius: 24px; + display: flex; + align-items: center; + justify-content: center; + animation: floatIcon 3s ease-in-out infinite; + box-shadow: 0 20px 60px var(--shadow-color); +} + +.service-visual-icon .icon-main svg { + width: 60px; + height: 60px; + color: white; +} + +@keyframes floatIcon { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-15px); } +} + +/* Floating elements around icon */ +.service-visual-particles { + position: absolute; + inset: 0; + pointer-events: none; +} + +.particle { + position: absolute; + background: var(--accent-primary); + border-radius: 50%; + opacity: 0.3; + animation: particleFloat 4s ease-in-out infinite; +} + +.particle:nth-child(1) { width: 10px; height: 10px; top: 20%; left: 20%; animation-delay: 0s; } +.particle:nth-child(2) { width: 15px; height: 15px; top: 30%; right: 25%; animation-delay: -1s; } +.particle:nth-child(3) { width: 8px; height: 8px; bottom: 25%; left: 30%; animation-delay: -2s; } +.particle:nth-child(4) { width: 12px; height: 12px; bottom: 20%; right: 20%; animation-delay: -3s; } +.particle:nth-child(5) { width: 6px; height: 6px; top: 50%; left: 15%; animation-delay: -0.5s; } +.particle:nth-child(6) { width: 14px; height: 14px; top: 15%; right: 35%; animation-delay: -1.5s; } + +@keyframes particleFloat { + 0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.3; } + 50% { transform: translate(10px, -20px) scale(1.2); opacity: 0.6; } +} + +/* Service Details */ +.service-tab-details { + padding: 1rem 0; +} + +.service-tab-header { + margin-bottom: 2rem; +} + +.service-tab-header h2 { + font-family: 'OmegaLarge', sans-serif; + font-size: 2.25rem; + margin-bottom: 0.75rem; +} + +.service-tab-header p { + color: var(--text-secondary); + font-size: 1.1rem; + line-height: 1.7; +} + +.service-tab-features { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1rem; + margin-bottom: 2rem; +} + +.service-feature-item { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 1rem; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 8px; + transition: all 0.3s ease; +} + +.service-feature-item:hover { + border-color: var(--accent-primary); + transform: translateX(5px); +} + +.service-feature-icon { + width: 40px; + height: 40px; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.service-feature-icon svg { + width: 20px; + height: 20px; + color: white; +} + +.service-feature-text h4 { + font-size: 0.95rem; + margin-bottom: 0.2rem; +} + +.service-feature-text p { + font-size: 0.8rem; + color: var(--text-muted); +} + +/* Service CTA */ +.service-tab-cta { + display: flex; + gap: 1rem; + flex-wrap: wrap; +} + +/* Service Highlights */ +.service-highlights { + display: flex; + gap: 2rem; + margin-bottom: 2rem; + padding: 1.5rem; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 8px; +} + +.service-highlight { + text-align: center; + flex: 1; +} + +.service-highlight-value { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.75rem; + color: var(--accent-light); + margin-bottom: 0.25rem; +} + +.service-highlight-label { + font-size: 0.8rem; + color: var(--text-muted); +} + +@media (max-width: 1024px) { + .service-tab-grid { + grid-template-columns: 1fr; + gap: 2rem; + } + + .service-visual { + height: 300px; + } +} + +@media (max-width: 600px) { + .service-tab-features { + grid-template-columns: 1fr; + } + + .service-highlights { + flex-direction: column; + gap: 1rem; + } + + .service-tab-btn { + padding: 0.75rem 1rem; + font-size: 0.85rem; + } + + .service-tab-btn span { + display: none; + } +} + +/* ============================================ + Why Choose Us Section + ============================================ */ +.why-us-grid { + max-width: 1000px; + margin: 0 auto; + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 2rem; +} + +.why-us-card { + text-align: center; + padding: 2.5rem 2rem; + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 8px; + transition: all 0.3s ease; +} + +.why-us-card:hover { + border-color: var(--accent-primary); + transform: translateY(-5px); +} + +.why-us-icon { + width: 80px; + height: 80px; + margin: 0 auto 1.5rem; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + border-radius: 16px; + display: flex; + align-items: center; + justify-content: center; +} + +.why-us-icon svg { + width: 36px; + height: 36px; + color: white; +} + +.why-us-card h3 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.2rem; + margin-bottom: 0.75rem; +} + +.why-us-card p { + color: var(--text-secondary); + font-size: 0.95rem; + line-height: 1.6; +} + +@media (max-width: 768px) { + .why-us-grid { + grid-template-columns: 1fr; + } +} + +/* |||||||||||||||||||||||||||||||||||||||||||||| + |||||||||||||||||||||||||||||||||||||||||||||| + |||||||||||||||||||||||||||||||||||||||||||||| */ + +/* ============================================ + Service Stamps / Tags + ============================================ */ +.service-stamp { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.3rem 0.6rem; + font-family: 'OmegaLarge', sans-serif; + font-size: 0.65rem; + text-transform: uppercase; + letter-spacing: 1px; + border-radius: 4px; + font-weight: bold; + transform: rotate(12deg); + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); +} + +.service-stamp-free { + background: linear-gradient(135deg, #2ecc71, #27ae60); + color: white; + border: 2px dashed rgba(255, 255, 255, 0.5); +} + +.service-stamp-new { + background: linear-gradient(135deg, #3498db, #2980b9); + color: white; + border: 2px dashed rgba(255, 255, 255, 0.5); +} + +.service-stamp-soon { + background: linear-gradient(135deg, #686b6d, #828e96); + color: white; + border: 2px dashed rgba(255, 255, 255, 0.5); +} + +.service-stamp-popular { + background: linear-gradient(135deg, #e74c3c, #c0392b); + color: white; + border: 2px dashed rgba(255, 255, 255, 0.5); +} + +.service-stamp-promo { + background: linear-gradient(135deg, #f39c12, #e67e22); + color: white; + border: 2px dashed rgba(255, 255, 255, 0.5); +} + +.service-tab-btn .service-stamp { + position: absolute; + top: -10px; + right: -10px; + font-size: 0.55rem; + padding: 0.2rem 0.5rem; + z-index: 10; +} + +.service-visual-stamp { + position: absolute; + top: 20px; + right: 20px; + z-index: 10; + padding: 0.5rem 1rem; + font-size: 0.85rem; + transform: rotate(12deg); + border: 3px dashed rgba(255, 255, 255, 0.6); + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); +} + +.service-tab-header .service-stamp-inline { + display: inline-flex; + margin-left: 1rem; + vertical-align: middle; + transform: rotate(12deg); + opacity: 0.75; + font-size: 0.75rem; + padding: 0.35rem 0.7rem; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + transition: opacity 0.3s ease, transform 0.3s ease; +} + +.service-tab-header .service-stamp-inline:hover { + opacity: 1; + transform: rotate(12deg) scale(1.1); +} + +.service-stamp-animated { + animation: stampBounce 2s ease infinite; +} + +@keyframes stampBounce { + 0%, 100% { transform: rotate(12deg) scale(1); } + 50% { transform: rotate(12deg) scale(1.05); } +} + +/* ============================================ + Partners Section - Infinite Logo Carousel + ============================================ */ +.partners-section { + padding: 4rem 0; +} + +.partners-section .section-header { + margin-bottom: 2.5rem; +} + +.partners-marquee { + position: relative; + width: 100%; + overflow: hidden; + padding: 2rem 0 3rem; + -webkit-mask-image: linear-gradient(90deg, transparent 0%, white 8%, white 92%, transparent 100%); + mask-image: linear-gradient(90deg, transparent 0%, white 8%, white 92%, transparent 100%); +} + +.partners-track { + display: flex; + gap: 5rem; + width: max-content; + animation: marqueeInfinite 35s linear infinite; + will-change: transform; + backface-visibility: hidden; + perspective: 1000px; +} + +.partners-track:hover { + animation-play-state: paused; +} + +@keyframes marqueeInfinite { + 0% { + transform: translate3d(0, 0, 0); + } + 100% { + transform: translate3d(-50%, 0, 0); + } +} + +.partner-item { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + flex-shrink: 0; + cursor: pointer; + transition: transform 0.3s ease; +} + +.partner-item:hover { + transform: translateY(-8px); +} + +.partner-logo-icon { + width: 100px; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + font-family: 'OmegaLarge', sans-serif; + font-size: 2rem; + color: var(--text-muted); + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 20px; + transition: all 0.3s ease; +} + +.partner-item:hover .partner-logo-icon { + color: var(--accent-light); + border-color: var(--accent-primary); + background: var(--glass-bg); + box-shadow: 0 15px 40px rgba(139, 58, 98, 0.3); +} + +.partner-item span { + font-size: 0.95rem; + color: var(--text-muted); + font-weight: 500; + transition: color 0.3s ease; + white-space: nowrap; +} + +.partner-item:hover span { + color: var(--text-primary); +} + +@media (max-width: 768px) { + .partners-track { + gap: 3rem; + animation-duration: 25s; + } + + .partner-logo-icon { + width: 75px; + height: 75px; + font-size: 1.5rem; + border-radius: 14px; + } + + .partner-item span { + font-size: 0.8rem; + } +} + +/* ============================================ + Legal Pages Styles + ============================================ */ +.legal-content { + padding: 4rem 2rem 6rem; + max-width: 900px; + margin: 0 auto; +} + +.legal-container { + display: flex; + flex-direction: column; + gap: 2.5rem; +} + +.legal-section h2 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.3rem; + color: var(--text-primary); + margin-bottom: 1rem; + display: flex; + align-items: center; + gap: 0.75rem; +} + +.legal-section h2 svg { + width: 22px; + height: 22px; + color: var(--accent-light); +} + +.legal-card { + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 12px; + padding: 1.5rem 2rem; +} + +.legal-card p { + color: var(--text-secondary); + line-height: 1.7; + margin-bottom: 1rem; +} + +.legal-card p:last-child { + margin-bottom: 0; +} + +.legal-card strong { + color: var(--text-primary); +} + +.legal-card ul { + margin: 1rem 0; + padding-left: 1.5rem; + color: var(--text-secondary); +} + +.legal-card ul li { + margin-bottom: 0.5rem; + line-height: 1.6; +} + +.legal-card ul li::marker { + color: var(--accent-light); +} + +@media (max-width: 768px) { + .legal-content { + padding: 2rem 1rem 4rem; + } + + .legal-card { + padding: 1.25rem 1.5rem; + } + + .legal-section h2 { + font-size: 1.1rem; + } +} + + +/* ═══════════════════════════════════════════════════════════════════════════ + HOME — Partners carousel + ═══════════════════════════════════════════════════════════════════════════ */ + +.partners-carousel-wrapper { + overflow: hidden; + padding: 2rem 0; + position: relative; + mask-image: linear-gradient(to right, transparent 0%, black 8%, black 92%, transparent 100%); + -webkit-mask-image: linear-gradient(to right, transparent 0%, black 8%, black 92%, transparent 100%); +} + +.partners-carousel-track { + display: flex; + gap: 1.5rem; + width: max-content; + will-change: transform; +} + +.partner-slide { + flex-shrink: 0; + cursor: pointer; +} + +.partner-slide-inner { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.6rem; + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 10px; + padding: 1.25rem 1.75rem; + width: 160px; + transition: border-color 0.3s ease, transform 0.3s ease, box-shadow 0.3s ease; +} + +.partner-slide:hover .partner-slide-inner { + border-color: var(--accent-primary); + transform: translateY(-4px); + box-shadow: 0 8px 24px rgba(142,36,170,0.18); +} + +.partner-logo-img { + width: 72px; + height: 72px; + object-fit: contain; + border-radius: 8px; +} + +.partner-logo-fallback { + width: 72px; + height: 72px; + border-radius: 8px; + align-items: center; + justify-content: center; + font-family: 'OmegaLarge', sans-serif; + font-size: 1.2rem; + color: white; + display: none; +} + +.partner-slide-name { + font-size: 0.82rem; + color: var(--text-secondary); + text-align: center; + font-weight: 500; +} + +/* Partner modal — utilise exactement la même structure que team-modal */ + +.team-modal-avatar-photo { + width: 100%; + height: 100%; + object-fit: cover; + display: block; + /* Remplit l'octogone — clip-path du parent gère la forme */ +} + +.team-modal-avatar-fallback { + width: 100%; + height: 100%; + align-items: center; + justify-content: center; + font-family: 'OmegaLarge', sans-serif; + font-size: 1.25rem; + color: white; + display: none; +} + +/* ═══════════════════════════════════════════════════════════════════════════ + TEAM — Avatar photo + ═══════════════════════════════════════════════════════════════════════════ */ + +.team-avatar-photo { + width: 100%; + height: 100%; + object-fit: cover; + display: block; + /* Pas de border-radius — le clip-path octogone du parent s'applique */ +} + +.team-avatar-fallback { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + font-family: 'OmegaLarge', sans-serif; + font-size: 1.5rem; + color: var(--text-primary); +} + +.team-avatar-inner { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + /* overflow géré par clip-path du parent — pas de border-radius */ +} + +/* Modal avatar photo */ +.team-modal-avatar-inner { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + overflow: hidden; +} + +/* ═══════════════════════════════════════════════════════════════════════════ + SERVICES — Note + ═══════════════════════════════════════════════════════════════════════════ */ + +.service-note { + font-size: 0.78rem; + color: var(--text-muted); + margin-bottom: 1rem; + line-height: 1.5; + font-style: italic; +} + +.service-note-mark { + color: var(--accent-light); + font-style: normal; + font-weight: 600; +} + +/* ═══════════════════════════════════════════════════════════════════════════ + FAQ — Page + ═══════════════════════════════════════════════════════════════════════════ */ + +.faq-teaser { + padding: 0 2rem 2rem; + max-width: 1200px; + margin: 0 auto; +} + +.faq-teaser-inner { + display: flex; + align-items: center; + justify-content: space-between; + gap: 2rem; + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-left: 4px solid var(--accent-primary); + border-radius: 10px; + padding: 2rem 2.5rem; +} + +.faq-teaser-text p.section-tag { + margin-bottom: 0.5rem; +} + +.faq-teaser-text h2 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.4rem; + color: var(--text-primary); + margin-bottom: 0.6rem; +} + +.faq-teaser-text p:last-child { + color: var(--text-secondary); + font-size: 0.9rem; + max-width: 480px; +} + +.faq-teaser-btn { + white-space: nowrap; + flex-shrink: 0; +} + +.faq-page-section { + padding: 2rem 2rem 5rem; +} + +.faq-page-container { + max-width: 860px; + margin: 0 auto; + display: flex; + flex-direction: column; + gap: 2.5rem; +} + +.faq-category-title { + font-family: 'OmegaLarge', sans-serif; + font-size: 1rem; + color: var(--accent-light); + display: flex; + align-items: center; + gap: 0.6rem; + margin-bottom: 1rem; + padding-bottom: 0.75rem; + border-bottom: 1px solid var(--glass-border); +} + +.faq-category-title svg { + width: 18px; + height: 18px; + flex-shrink: 0; +} + +.faq-list { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.faq-item { + background: var(--card-bg); + border: 1px solid var(--glass-border); + border-radius: 8px; + overflow: hidden; + transition: border-color 0.25s ease; +} + +.faq-item.open { + border-color: var(--accent-primary); +} + +.faq-question { + width: 100%; + background: none; + border: none; + padding: 1.1rem 1.5rem; + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + cursor: pointer; + font-size: 0.95rem; + font-weight: 500; + color: var(--text-primary); + text-align: left; + transition: color 0.25s ease; +} + +.faq-question:hover { + color: var(--accent-light); +} + +.faq-chevron { + width: 18px; + height: 18px; + flex-shrink: 0; + color: var(--text-muted); + transition: transform 0.3s ease; +} + +.faq-item.open .faq-chevron { + transform: rotate(180deg); + color: var(--accent-light); +} + +.faq-answer { + max-height: 0; + overflow: hidden; + transition: max-height 0.35s cubic-bezier(0.4,0,0.2,1), padding 0.3s ease; + padding: 0 1.5rem; +} + +.faq-item.open .faq-answer { + max-height: 300px; + padding: 0 1.5rem 1.25rem; +} + +.faq-answer p { + font-size: 0.9rem; + color: var(--text-secondary); + line-height: 1.7; +} + +.faq-answer strong { + color: var(--text-primary); +} + +.faq-cta-section { + background: var(--card-bg); + border-top: 1px solid var(--glass-border); + padding: 4rem 2rem; + text-align: center; +} + +.faq-cta-inner { + max-width: 600px; + margin: 0 auto; +} + +.faq-cta-inner h2 { + font-family: 'OmegaLarge', sans-serif; + font-size: 1.6rem; + margin-bottom: 0.75rem; + color: var(--text-primary); +} + +.faq-cta-inner p { + color: var(--text-secondary); + margin-bottom: 2rem; +} + +.faq-cta-btns { + display: flex; + gap: 1rem; + justify-content: center; + flex-wrap: wrap; +} + +@media (max-width: 768px) { + .faq-teaser-inner { + flex-direction: column; + align-items: flex-start; + } + .faq-teaser-btn { + width: 100%; + text-align: center; + justify-content: center; + } +} + + +/* ═══════════════════════════════════════════════════════════════════════════ + GALLERY — image réelle dans les slides + ═══════════════════════════════════════════════════════════════════════════ */ + +/* Slide sans image chargée → masqué */ +.project-gallery-slide.no-image { + display: none !important; +} + +/* Slide avec image → l'image remplace le gradient */ +.project-gallery-slide.has-image { + background: #000 !important; +} + +.gallery-slide-img { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; + z-index: 1; + display: block; +} + +/* Enlève l'overlay gradient quand une vraie image est présente */ +.project-gallery-slide.has-image::before { + display: none; +} + +/* ═══════════════════════════════════════════════════════════════════════════ + MODAL TECH — tech items avec icônes + ═══════════════════════════════════════════════════════════════════════════ */ + +.project-tech-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); + gap: 0.75rem; +} + +.project-tech-item { + padding: 0.75rem 1rem; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 6px; + color: var(--text-secondary); + font-size: 0.88rem; + display: flex; + align-items: center; + gap: 0.6rem; + transition: all 0.25s ease; + font-weight: 500; +} + +.project-tech-item svg { + width: 16px; + height: 16px; + flex-shrink: 0; + color: var(--accent-light); +} + +.project-tech-item:hover { + border-color: var(--accent-primary); + color: var(--text-primary); + background: rgba(142, 36, 170, 0.08); +} + +/* ═══════════════════════════════════════════════════════════════════════════ + MODAL STATS — grille 2×2 valorisée + ═══════════════════════════════════════════════════════════════════════════ */ + +.project-stats-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1rem; +} + +.project-stat-card { + text-align: center; + padding: 1.5rem 1rem; + background: var(--glass-bg); + border: 1px solid var(--glass-border); + border-radius: 10px; + transition: border-color 0.25s ease, transform 0.25s ease; +} + +.project-stat-card:hover { + border-color: var(--accent-primary); + transform: translateY(-2px); +} + +.project-stat-card-icon { + width: 48px; + height: 48px; + background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); + border-radius: 12px; + display: flex; + align-items: center; + justify-content: center; + margin: 0 auto 0.85rem; +} + +.project-stat-card-icon svg { + width: 22px; + height: 22px; + color: white; +} + +.project-stat-card-value { + font-family: 'OmegaLarge', sans-serif; + font-size: 2.2rem; + color: var(--accent-light); + line-height: 1; + margin-bottom: 0.4rem; +} + +.project-stat-card-label { + font-size: 0.82rem; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.5px; +} + + + +/* ═══════════════════════════════════════════════════════════════════════════ + PORTFOLIO — image de couverture dans les cartes + ═══════════════════════════════════════════════════════════════════════════ */ + +.portfolio-cover-img { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; + z-index: 1; /* au-dessus du gradient .portfolio-bg */ + display: block; +} + +/* .portfolio-bg — override pour les cartes avec image */ +.portfolio-bg { + position: absolute; + inset: 0; + overflow: hidden; + /* gradient retiré ici — défini dans la règle principale */ + background: none; +} + +/* ═══════════════════════════════════════════════════════════════════════════ + BENTO + PORTFOLIO — image de couverture réelle + ═══════════════════════════════════════════════════════════════════════════ */ + +.bento-cover-img { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; + z-index: 1; /* au-dessus du gradient de fond */ + display: block; +} + +/* bento-image-content — z-index géré dans la règle principale ligne ~2141 */ + +/* ═══════════════════════════════════════════════════════════════════════════ + GALLERY — iframe YouTube + ═══════════════════════════════════════════════════════════════════════════ */ + +.yt-wrapper { + position: absolute; + inset: 0; + width: 100%; + height: 100%; +} + +.gallery-slide-yt-iframe { + width: 100%; + height: 100%; + border: none; + display: block; +} + +/* ═══════════════════════════════════════════════════════════════════════════ + GALLERY — bouton mute vidéo + ═══════════════════════════════════════════════════════════════════════════ */ + +.gallery-mute-btn { + position: absolute; + bottom: 3rem; /* au-dessus des dots */ + right: 1rem; + z-index: 10; + width: 38px; + height: 38px; + background: rgba(0, 0, 0, 0.6); + border: 1px solid rgba(255,255,255,0.2); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + color: white; + transition: background 0.2s ease; + backdrop-filter: blur(4px); +} + +.gallery-mute-btn:hover { + background: rgba(139, 58, 98, 0.8); + border-color: var(--accent-primary); +} + +/* Icône son coupé = visible par défaut (muted=true au départ) */ +.gallery-mute-btn .icon-muted { display: block; } +.gallery-mute-btn .icon-unmuted { display: none; } + +/* Quand le son est activé */ +.gallery-mute-btn.unmuted .icon-muted { display: none; } +.gallery-mute-btn.unmuted .icon-unmuted { display: block; } + +/* Footer social — img pour logos CDN (gaming platforms) */ +.footer-social a img { + width: 20px; + height: 20px; + display: block; + object-fit: contain; + filter: brightness(0) invert(1); /* Force blanc pour cohérence avec les SVG */ + opacity: 0.85; + transition: opacity 0.3s ease; +} + +.footer-social a:hover img { + opacity: 1; + filter: none; /* Affiche la couleur officielle au hover */ +} + +/* ═══════════════════════════════════════════════════════════════════════════ + Footer gaming icons — logos officiels locaux + ═══════════════════════════════════════════════════════════════════════════ */ + +.footer-gaming-icon { + width: 20px; + height: 20px; + display: block; + object-fit: contain; + opacity: 0.85; + /* Mode sombre : icône blanche */ + filter: brightness(0) invert(1); + transition: opacity 0.2s ease, filter 0.2s ease; +} + +.footer-social a:hover .footer-gaming-icon { + opacity: 1; +} + +/* Mode clair : icône sombre */ +[data-theme="light"] .footer-gaming-icon { + filter: brightness(0); +} + +[data-theme="light"] .footer-social a:hover .footer-gaming-icon { + filter: brightness(0) invert(1); /* Blanc au hover (fond accent) */ +} + +/* Hytale PNG — fond transparent forcé via mix-blend-mode */ +.footer-gaming-icon--hytale { + mix-blend-mode: screen; + opacity: 0.9; +} diff --git a/assets/data/faq.json b/assets/data/faq.json new file mode 100644 index 0000000..bf71819 --- /dev/null +++ b/assets/data/faq.json @@ -0,0 +1,78 @@ +[ + { + "id": "delais", + "icon": "clock", + "title": "Délais & Process", + "questions": [ + { + "q": "Quels sont les délais habituels pour un bot Discord ?", + "a": "Un bot Discord RP complet demande généralement entre 2 et 4 semaines selon la complexité des systèmes (économie, combat, inventaire…). Nous établissons un planning détaillé dès la validation du devis." + }, + { + "q": "Et pour une map Fortnite ?", + "a": "La création d'une map UEFN prend entre 3 et 6 semaines. Ce délai inclut le design, la construction, les scripts Verse et les tests de performance. Des points réguliers sont organisés pour valider chaque étape." + }, + { + "q": "Comment se déroule le processus du début à la fin ?", + "a": "Notre processus se déroule en 4 étapes : Contact (échange sur vos besoins), Devis (proposition détaillée et validation), Création (développement avec suivi régulier) et Livraison (tests, ajustements et remise des fichiers). Vous êtes impliqué à chaque étape." + } + ] + }, + { + "id": "tarifs", + "icon": "dollar-sign", + "title": "Tarifs & Devis", + "questions": [ + { + "q": "Comment sont calculés vos tarifs ?", + "a": "Chaque projet est unique, nos tarifs sont donc établis sur devis selon la complexité, le nombre de fonctionnalités et les délais souhaités. Le devis est gratuit, détaillé et sans engagement." + }, + { + "q": "Le consulting est-il vraiment gratuit ?", + "a": "Oui, la première consultation est entièrement gratuite et sans engagement. Elle permet de cerner vos besoins, évaluer votre projet et vous orienter vers la solution la plus adaptée, qu'elle soit payante ou non." + }, + { + "q": "Y a-t-il des frais cachés ?", + "a": "Non. Le devis que nous soumettons est exhaustif. Les éventuels ajouts de fonctionnalités en cours de projet font l'objet d'un avenant écrit et validé par les deux parties avant toute réalisation." + } + ] + }, + { + "id": "revisions", + "icon": "refresh-cw", + "title": "Révisions & Support", + "questions": [ + { + "q": "Que signifient les « révisions illimitées* » en graphisme ?", + "a": "Les révisions illimitées s'appliquent aux ajustements dans le cadre du brief initial : couleurs, proportions, typo, espacement. Elles ne couvrent pas les changements de direction créative complète (nouveau concept, refonte totale), qui sont facturés séparément." + }, + { + "q": "Que se passe-t-il si mon bot plante après livraison ?", + "a": "Un mois de support est inclus après chaque livraison. Durant cette période, tout bug lié à notre code est corrigé gratuitement et en priorité. Passé ce délai, un contrat de maintenance peut être négocié." + }, + { + "q": "Puis-je modifier moi-même le projet après livraison ?", + "a": "Oui, vous recevez les fichiers sources complets. Nous livrons également une documentation pour vous permettre d'effectuer des modifications de base. Pour des évolutions plus complexes, notre équipe reste disponible." + } + ] + }, + { + "id": "technique", + "icon": "code", + "title": "Technique", + "questions": [ + { + "q": "Quelles technologies utilisez-vous pour les bots Discord ?", + "a": "Nos bots sont développés principalement en Python avec discord.py, couplés à une base de données MySQL. Pour l'hébergement, nous pouvons vous guider vers des solutions adaptées (VPS, serveur dédié) ou gérer l'hébergement pour vous." + }, + { + "q": "Les maps Fortnite sont-elles compatibles avec les dernières mises à jour du jeu ?", + "a": "Oui. Nous développons exclusivement via UEFN (Unreal Editor for Fortnite), l'outil officiel d'Epic Games, ce qui garantit une compatibilité optimale et l'accès aux dernières fonctionnalités disponibles." + }, + { + "q": "Pouvez-vous reprendre un projet existant ?", + "a": "Oui, nous réalisons des audits de projets existants. Après analyse du code ou de la map, nous vous soumettons un rapport et un plan d'action. C'est d'ailleurs inclus dans notre offre de consulting gratuit." + } + ] + } +] diff --git a/assets/data/partners.json b/assets/data/partners.json new file mode 100644 index 0000000..d578e7f --- /dev/null +++ b/assets/data/partners.json @@ -0,0 +1,119 @@ +[ + { + "name": "victorias-vice", + "displayName": "‎ ‎ Victoria's ‎ Vice", + "description": "Serveur RP whitelist Fortnite sur thème italien. L'une de nos collaborations les plus abouties.", + "longDesc": "Victoria's Vice est un serveur RP whitelist Fortnite immersif basé sur une esthétique italienne unique. OmégaKube a développé l'intégralité de la map UEFN, le bot RP Vicy et l'identité visuelle du projet.", + "gradient": "linear-gradient(135deg, #5E2040, #8b3a62)", + "since": "2025", + "services": [ + "Sessions RP Victoria's Vice 2" + ], + "stats": [ + { + "icon": "users", + "value": "70", + "label": "Joueurs max" + }, + { + "icon": "home", + "value": "30+", + "label": "Bâtiments" + }, + { + "icon": "play", + "value": "30+", + "label": "Sessions" + } + ], + "social": { + "discord": "https://discord.gg/8D564jm2SD", + "twitter": "", + "instagram": "", + "youtube": "https://www.youtube.com/@VictoriasVice", + "tiktok": "", + "website": "#", + "epicgames": "https://www.fortnite.com/@omega_kube_team" + }, + "logo": "assets/images/partners/victorias-vice.png" + }, + { + "name": "red-dust-redemption", + "displayName": "Red Dust Redemption", + "description": "Plongez au cœur du Far West en 1884, dans l’Ouest des États-Unis où chaque choix compte.", + "longDesc": "Bienvenue sur Red Dust Redemption RP WL.Plongez au cœur du Far West en 1884, dans l’Ouest des États-Unis où chaque choix compte. Une multitude de possibilités s'offrent à vous. Notamment en travaillant au saloon avec piano en fond, ambiance chaleureuse et rencontres garanties, c'est l’endroit idéal pour ceux qui aiment la convivialité. Et si le danger vous attire, sachez que plusieurs organisations criminelles n’attendent que vous. Si l’aventure vous tente, n’attendez plus et foncez-nous rejoindre dès maintenant.", + "gradient": "linear-gradient(135deg, var(--accent-primary), var(--accent-secondary))", + "since": "2025", + "services": [ + "Sessions RP Red Dust Redemption 2" + ], + "stats": [ + { + "icon": "users", + "value": "45+", + "label": "Joueurs max" + }, + { + "icon": "home", + "value": "+6", + "label": "Paysages uniques" + }, + { + "icon": "play", + "value": "+50", + "label": "Sessions" + } + ], + "social": { + "discord": "https://discord.gg/FUamNpf7hq", + "twitter": "", + "instagram": "", + "youtube": "", + "tiktok": "", + "website": "#", + "epicgames": "https://www.fortnite.com/@kayrix" + }, + "logo": "assets/images/partners/red-dust-redemption.jpg" + }, + { + "name": "site-omega", + "displayName": " ‎ ‎ ‎ Site ‎ ‎ ‎ Omega", + "description": "Site dans l'univers SCP entièrement en UEFN.", + "longDesc": "Site Omega est un projet ambitieux qui vise à recréer l'univers de la Fondation SCP dans Fortnite en utilisant UEFN. Les joueurs peuvent explorer des installations secrètes, interagir avec des anomalies et vivre des expériences uniques inspirées de l'univers SCP.", + "gradient": "linear-gradient(135deg, #1a3a5e, #3a5e8b)", + "since": "2025", + "services": [ + "Map UEFN", + "Bot Discord", + "Branding" + + ], + "stats": [ + { + "icon": "star", + "value": "?", + "label": "Stat 1" + }, + { + "icon": "zap", + "value": "?", + "label": "Stat 2" + }, + { + "icon": "heart", + "value": "?", + "label": "Stat 3" + } + ], + "social": { + "discord": "#", + "twitter": "", + "instagram": "", + "youtube": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", + "tiktok": "", + "website": "#", + "epicgames": "https://www.fortnite.com/@omega_kube_team" + }, + "logo": "assets/images/partners/site-omega.png" + } +] \ No newline at end of file diff --git a/assets/data/projects.json b/assets/data/projects.json new file mode 100644 index 0000000..14653c7 --- /dev/null +++ b/assets/data/projects.json @@ -0,0 +1,491 @@ +[ + { + "id": 1, + "category": "bot", + "title": "Kuby", + "desc": "Un bot multifonction, de sécurité, d'administration et utilitaire.", + "gradient": "linear-gradient(135deg, var(--accent-primary), var(--accent-secondary))", + "year": "2025", + "duration": "3 semaines", + "features": [ + "Système d'absences staff", + "Systèmes de sécurité et logs", + "Gestion de sanctions", + "Système de convocations", + "Tickets avec stats", + "Et bien plus à venir" + ], + "tech": [ + { + "name": "Python", + "icon": "code" + }, + { + "name": "Discord.py", + "icon": "message-circle" + }, + { + "name": "MySQL", + "icon": "database" + }, + { + "name": "Bash", + "icon": "terminal" + } + ], + "stats": [ + { + "icon": "users", + "value": "1075+", + "label": "Utilisateurs" + }, + { + "icon": "terminal", + "value": "150+", + "label": "Commandes" + }, + { + "icon": "activity", + "value": "97%", + "label": "Uptime" + }, + { + "icon": "clock", + "value": "3", + "label": "Semaines de dev" + } + ], + "images": "assets/images/projects/kuby/", + "files": [ + "imgk-1.png", + "yt:dQw4w9WgXcQ" + ], + "social": { + "discord": "https://discord.gg/FwvNkvu5dy", + "instagram": "", + "tiktok": "", + "youtube": "", + "twitter": "" + } + }, + { + "id": 2, + "category": "map", + "title": "Victoria's Vice", + "desc": "Victoria's Vice est serveur RP whitelist Fortnite, Victoria's Vice, qui est basé sur un thème italien ! Plongez-vous dans un univers authentique où chaque partie est une immersion dans les rues, la culture, et l'ambiance unique italienne.", + "gradient": "linear-gradient(135deg, #5E2040, #8b3a62)", + "year": "2025", + "duration": "4 mois", + "features": [ + "économie réaliste", + "30+ bâtiments", + "Système jour/nuit", + "Serveur Whitelist", + "Métiers légaux variés", + "Bot RP Vicy exclusif" + ], + "tech": [ + { + "name": "Fortnite Creative", + "icon": "map" + }, + { + "name": "UEFN", + "icon": "layers" + }, + { + "name": "Verse", + "icon": "cpu" + }, + { + "name": "Texturing", + "icon": "image" + } + ], + "stats": [ + { + "icon": "play", + "value": "30+", + "label": "Sessions" + }, + { + "icon": "home", + "value": "30+", + "label": "Bâtiments" + }, + { + "icon": "users", + "value": "70", + "label": "Joueurs max" + }, + { + "icon": "calendar", + "value": "4", + "label": "Mois de dev" + } + ], + "images": "assets/images/projects/victorias-vice-1/", + "files": [ + "imgvv1-1.jpg", + "imgvv1-2.jpg", + "imgvv1-3.jpg", + "imgvv1-4.jpg", + "imgvv1-5.jpg", + "imgvv1-6.jpg", + "imgvv1-7.jpg", + "imgvv1-8.jpg", + "TrailerOfficielVV1.mp4" + ], + "social": { + "discord": "https://discord.gg/8D564jm2SD", + "instagram": "", + "tiktok": "", + "youtube": "", + "twitter": "", + "epicgames": "https://www.fortnite.com/@omega_kube_team" + } + }, + { + "id": 3, + "category": "bot", + "title": "Vicy", + "desc": "Bot RP ville avec économie réaliste, tickets whitelist automatisé et cartes d'identités.", + "gradient": "linear-gradient(135deg, #3a1f5e, #8b3a62)", + "year": "2024", + "duration": "", + "features": [ + "Économie réaliste", + "Gestion ticket Whitelist", + "Carte d'identités", + "Prise de RDV", + "système de comptes avec RIB", + "Fonctionnalités bonus" + ], + "tech": [ + { + "name": "Python", + "icon": "code" + }, + { + "name": "Discord.py", + "icon": "message-circle" + }, + { + "name": "MySQL", + "icon": "database" + }, + { + "name": "Pillow", + "icon": "image" + } + ], + "stats": [ + { + "icon": "users", + "value": "300+", + "label": "Utilisateurs" + }, + { + "icon": "terminal", + "value": "100+", + "label": "Commandes" + }, + { + "icon": "credit-card", + "value": "60+", + "label": "RIB générés" + }, + { + "icon": "activity", + "value": "99%", + "label": "Uptime" + } + ], + "images": "assets/images/projects/vicy/", + "files": [ + "imgvicy-1.png" + ], + "social": { + "discord": "https://discord.gg/8D564jm2SD", + "instagram": "", + "tiktok": "", + "youtube": "", + "twitter": "" + } + }, + { + "id": 4, + "category": "graphisme", + "title": "Branding Omega Kube", + "desc": "Identité visuelle complète incluant logo, bannières, emojis personnalisés et templates pour Omega Kube.", + "gradient": "linear-gradient(135deg, #2d1b5e, #5E2040)", + "year": "2024", + "duration": "1 semaine", + "features": [ + "Logo principal", + "Charte graphique", + "Bannières", + "Animations After Effects" + ], + "tech": [ + { + "name": "Photoshop", + "icon": "edit" + }, + { + "name": "Illustrator", + "icon": "pen-tool" + }, + { + "name": "After Effects", + "icon": "film" + }, + { + "name": "Figma", + "icon": "pen-tool" + } + ], + "stats": [ + { + "icon": "layers", + "value": "5+", + "label": "Éléments" + }, + { + "icon": "clock", + "value": "2h", + "label": "After Effects" + }, + { + "icon": "pen-tool", + "value": "3h", + "label": "Illustrator" + } + ], + "images": "assets/images/projects/branding-omega-kube/", + "files": [ + "imgk-1.png", + "imgk-2.png", + "videok-3.mp4" + ], + "social": { + "discord": "https://discord.gg/FwvNkvu5dy", + "instagram": "", + "tiktok": "", + "youtube": "", + "twitter": "" + } + }, + { + "id": 5, + "category": "map", + "title": "Site Omega", + "desc": "Site dans l'univers SCP entièrement en UEFN avec des systèmes innovants jamais vus dans le fortnite RP.", + "gradient": "linear-gradient(135deg, #1a3a5e, #3a5e8b)", + "year": "2026", + "duration": "4 mois", + "features": [ + "Intégration de SCP", + "Cinématiques", + "Modèles 3D", + "Site Souterrain", + "Terraforming extérieur" + ], + "tech": [ + { + "name": "Fortnite Creative", + "icon": "map" + }, + { + "name": "UEFN", + "icon": "layers" + }, + { + "name": "Verse", + "icon": "cpu" + }, + { + "name": "Custom Props", + "icon": "box" + } + ], + "stats": [ + { + "icon": "grid", + "value": "6+", + "label": "Secteurs" + }, + { + "icon": "shield", + "value": "15+", + "label": "SCP" + }, + { + "icon": "cpu", + "value": "30+", + "label": "Systèmes" + } + ], + "images": "assets/images/projects/site-omega/", + "files": [ + "imgso-1.png", + "imgso-2.png", + "imgso-3.png", + "imgso-4.png", + "imgso-5.png", + "imgso-6.png", + "imgso-7.png", + "imgso-8.png", + "imgso-9.jpg" + ], + "social": { + "discord": "", + "instagram": "", + "tiktok": "", + "youtube": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", + "twitter": "", + "epicgames": "https://www.fortnite.com/@omega_kube_team" + } + }, + { + "id": 6, + "category": "map", + "title":"Victoria's Vice 2", + "desc": "Suite de Victoria's Vice, avec une map plus grande, plus de bâtiments, plus de systèmes et une immersion encore plus poussée dans l'univers italien.", + "gradient": "linear-gradient(135deg, #5E2040, #8b3a62)", + "year": "2026", + "duration": "en cours...", + "features": [ + "économie réaliste", + "50+ bâtiments", + "Système jour/nuit", + "Serveur Whitelist", + "Métiers légaux variés", + "Bot RP Vicy exclusif" + ], + "tech": [ + { + "name": "Fortnite Creative", + "icon": "map" + }, + { + "name": "UEFN", + "icon": "layers" + }, + { + "name": "Verse", + "icon": "cpu" + }, + { + "name": "Texturing", + "icon": "image" + } + ], + "stats": [ + { + "icon": "play", + "value": "en cours...", + "label": "Sessions" + }, + { + "icon": "home", + "value": "en cours...", + "label": "Bâtiments" + }, + { + "icon": "users", + "value": "en cours...", + "label": "Joueurs max" + }, + { + "icon": "calendar", + "value": "en cours...", + "label": "Mois de dev" + } + ], + "images": "assets/images/projects/victorias-vice-2/", + "files": [ + "imgvv2-1.jpg", + "imgvv2-2.jpg", + "imgvv2-3.jpg", + "https://www.youtube.com/watch?v=Lx-1FWOJN9E" + ], + "social": { + "discord": "https://discord.gg/AM3e58cZvX", + "instagram": "", + "tiktok": "", + "youtube": "", + "twitter": "", + "epicgames": "https://www.fortnite.com/@omega_kube_team" + } + }, + { + "id": 7, + "category": "bot", + "title": "Beta", + "desc": "En cours de développement chez Omega Kube.", + "gradient": "linear-gradient(135deg, #000000, #434343)", + "year": "2026", + "duration": "en cours...", + "features": [ + "en cours..." + ], + "tech": [ + { + "name": "Python", + "icon": "code" + }, + { + "name": "Discord.py", + "icon": "message-circle" + }, + { + "name": "MySQL", + "icon": "database" + }, + { + "name": "Pillow", + "icon": "image" + }, + { + "name": "Autre tech", + "icon": "tool" + } + ], + "stats": [ + { + "icon": "users", + "value": "en cours...", + "label": "Utilisateurs" + }, + { + "icon": "terminal", + "value": "en cours...", + "label": "Commandes" + }, + { + "icon": "credit-card", + "value": "en cours...", + "label": "RP menés" + }, + { + "icon": "activity", + "value": "en cours...", + "label": "Uptime" + } + ], + "images": "assets/images/projects/beta/", + "files": [ + "imgb-1.png", + "imgb-2.png", + "yt:dQw4w9WgXcQ" + ], + "social": { + "discord": "https://discord.gg/FwvNkvu5dy", + "instagram": "", + "tiktok": "", + "youtube": "", + "twitter": "" + } + } +] \ No newline at end of file diff --git a/assets/data/services.json b/assets/data/services.json new file mode 100644 index 0000000..db656f7 --- /dev/null +++ b/assets/data/services.json @@ -0,0 +1,174 @@ +[ + { + "id": "bots", + "nav": { + "label": "Bots Discord", + "icon": "code", + "stamp": {"type": "popular","text": "Populaire"} + }, + "visual": { + "accentFrom": "#8b3a62", + "accentTo": "#a64d79", + "stamp": {"type": "popular","text": "★ Populaire","animated": true} + }, + "title": "Bots Discord RP", + "description": "Des bots entièrement personnalisés pour animer et gérer vos serveurs Role Play. Nous développons des systèmes complets adaptés à votre univers et à vos mécaniques de jeu.", + "highlights": [ + {"value": "2-4","label": "Semaines de dev"}, + {"value": "1 mois","label": "Support inclus"}, + {"value": "100%", "label": "Personnalisable"} + ], + "features": [ + {"icon": "dollar-sign", "title": "Économie virtuelle","desc": "Monnaie, banque, transactions"}, + {"icon": "briefcase","title": "Système de métiers","desc": "Jobs, skills, progression"}, + {"icon": "shield","title": "Combat & Stats","desc": "PvP, PvE, attributs"}, + {"icon": "box","title": "Inventaire avancé","desc": "Items, crafting, échanges"}, + {"icon": "flag","title": "Factions & Guildes","desc": "Clans, territoires, guerres"}, + {"icon": "settings", "title": "Panel Admin","desc": "Interface web de gestion"} + ], + "cta": [ + {"label": "Demander un devis","href": "../index.html#contact", "style": "primary","icon": "message-circle"}, + {"label": "Voir nos réalisations","href": "realisations.html","style": "secondary","icon": "eye"} + ], + "note": [] + }, + { + "id": "maps", + "nav": { + "label": "Maps RP", + "icon": "map", + "stamp": {"type": "soon","text": "Bientôt dispo"} + }, + "visual": { + "accentFrom": "#1a5e8b", + "accentTo": "#3a8bb5", + "stamp": { "type": "soon","text": "✦ Bientôt dispo","animated": true } + }, + "title": "Maps RP", + "description": "Des environnements immersifs créés sur mesure pour vos sessions Role Play. De la ville moderne au village médiéval, nous donnons vie à tous les univers.", + "highlights": [ + {"value": "3-6","label": "Semaines de création"}, + {"value": "50+","label": "Joueurs supportés"}, + {"value": "UEFN","label": "Compatible"} + ], + "features": [ + {"icon": "home","title": "Bâtiments détaillés","desc": "Intérieurs accessibles et déco"}, + {"icon": "sun","title": "Cycle jour/nuit","desc": "Ambiance dynamique"}, + {"icon": "zap","title": "Zones interactives","desc": "Scripts et triggers"}, + {"icon": "cpu","title": "Optimisation","desc": "Performance garantie"}, + {"icon": "map-pin","title": "Points d'intérêt","desc": "Lieux uniques et mémorables"}, + {"icon": "edit-3","title": "Modifications","desc": "Ajustements post-livraison"} + ], + "cta": [ + {"label": "Demander un devis","href": "../index.html#contact","style": "primary","icon": "message-circle"}, + {"label": "Voir nos maps","href": "realisations.html","style": "secondary","icon": "eye"} + ], + "note": [] + }, + { + "id": "graphisme", + "nav": { + "label": "Graphisme", + "icon": "image", + "stamp": null + }, + "visual": { + "accentFrom": "#8b5e3a", + "accentTo": "#b58a5a", + "stamp": null + }, + "title": "Créations Graphiques", + "description": "Une identité visuelle forte et cohérente pour vos projets. Du logo aux bannières, nous créons des visuels qui marquent les esprits et attirent votre communauté.", + "highlights": [ + {"value": "1-2","label": "Semaines"}, + {"value": "∞","label": "Révisions*"}, + {"value": "HD","label": "Qualité"} + ], + "features": [ + {"icon": "hexagon","title": "Logo & Branding","desc": "Identité visuelle complète"}, + {"icon": "layout","title": "Bannières Discord","desc": "Server banner, splash, icône"}, + {"icon": "smile","title": "Emojis custom","desc": "Pack emojis personnalisés"}, + {"icon": "grid","title": "Icônes & Assets","desc": "Items, skills, badges"}, + {"icon": "play-circle","title": "Animations","desc": "GIFs et motion design"}, + {"icon": "book-open","title": "Guide de style","desc": "Charte graphique fournie"} + ], + "cta": [ + {"label": "Demander un devis","href": "../index.html#contact","style": "primary","icon": "message-circle" }, + {"label": "Voir nos créations","href": "realisations.html","style": "secondary","icon": "eye"} + ], + "note": [ + {"value": "*","label": "Révisions illimitées sous conditions, voir FAQ"} + ] + }, + { + "id": "consulting", + "nav": { + "label": "Consulting", + "icon": "users", + "stamp": {"type": "free","text": "Gratuit"} + }, + "visual": { + "accentFrom": "#3a8b5e", + "accentTo": "#5ab57a", + "stamp": {"type": "free","text": "✓ Gratuit","animated": true} + }, + "title": "Consulting & Suivi", + "titleStamp": {"type": "free","text": "Gratuit"}, + "description": "Bénéficiez de notre expérience pour structurer, lancer et développer votre projet RP. Conseils stratégiques et accompagnement personnalisé.", + "highlights": [ + {"value": "50+","label": "Projets accompagnés" }, + {"value": "3 ans","label": "D'expérience"}, + {"value": "24/7","label": "Support Discord"} + ], + "features": [ + {"icon": "search","title": "Audit serveur","desc": "Analyse de l'existant"}, + {"icon": "trending-up","title": "Stratégie croissance","desc": "Plan de développement"}, + {"icon": "user-check","title": "Formation staff","desc": "Équipe modération"}, + {"icon": "heart","title": "Expérience joueur","desc": "Optimisation UX"}, + {"icon": "calendar","title": "Planning events","desc": "Calendrier d'animations"}, + {"icon": "dollar-sign","title": "Monétisation","desc": "Conseils revenus"} + ], + "cta": [ + {"label": "Prendre rendez-vous","href": "../index.html#contact","style": "primary","icon": "message-circle"} + ], + "note": [ + {"value": "✓","label": "Première consultation gratuite et sans engagement"} + ] + }, + { + "id": "pack", + "nav": { + "label": "Pack Complet", + "icon": "package", + "stamp": {"type": "best","text": "Meilleur choix"} + }, + "visual": { + "accentFrom": "#8b3a8b", + "accentTo": "#b55ab5", + "stamp": {"type": "best","text": "✓ Meilleur choix","animated": true} + }, + "title": "Pack Serveur Complet", + "titleStamp": {"type": "promo","text": "-20%"}, + "description": "La solution tout-en-un pour lancer votre projet RP. Bot personnalisé, map Fortnite, identité visuelle et accompagnement : tout est inclus pour un lancement réussi.", + "highlights": [ + {"value": "-20%","label": "VS services séparés*"}, + {"value": "3 mois","label": "Support inclus"}, + {"value": "Clé en main","label": "Prêt à lancer"} + ], + "features": [ + {"icon": "code","title": "Bot Discord RP","desc": "Système complet personnalisé"}, + {"icon": "map","title": "Map RP","desc": "Environnement sur mesure"}, + {"icon": "image","title": "Pack graphique","desc": "Logo, bannières, emojis"}, + {"icon": "server","title": "Config Discord","desc": "Serveur prêt à l'emploi"}, + {"icon": "book","title": "Documentation","desc": "Guides et tutoriels"}, + {"icon": "headphones","title": "Support 3 mois","desc": "Accompagnement lancement"} + ], + "cta": [ + {"label": "Demander un devis pack","href": "../index.html#contact","style": "primary","icon": "message-circle"}, + {"label": "Voir nos packs livrés","href": "realisations.html","style": "secondary","icon": "eye"} + ], + "note": [ + {"value": "*","label": "Réduction de 20% appliquée automatiquement vs services séparés"} + ] + } +] \ No newline at end of file diff --git a/assets/data/team.json b/assets/data/team.json new file mode 100644 index 0000000..c30975a --- /dev/null +++ b/assets/data/team.json @@ -0,0 +1,264 @@ +[ + { + "id": "534003230435442690", + "name": "Nixfix", + "role": "Directeur", + "avatar": "N", + "bio": "Président de l'association et coordinateur des équipes d'Omega Kube, Nixfix donne vie aux identités visuelles des projets RP. Passionné de design graphique, il excelle aussi bien dans la création de logos que dans la gestion de projets. Son style unique allie une esthétique gaming affirmée à un véritable professionnalisme, afin de proposer des visuels percutants et cohérents.", + "stats": [ + { + "value": "6", + "label": "Ans d'exp." + }, + { + "value": "15+", + "label": "Projets" + }, + { + "value": "★★★", + "label": "Expert" + } + ], + "skills": [ + "Polyvalent", + "Gestion de projets", + "Illustrator", + "After Effects", + "Figma", + "UEFN", + "Photoshop", + "Verse" + ], + "social": { + "discord": "", + "twitter": "", + "instagram": "", + "youtube": "", + "tiktok": "", + "github": "" + } + }, + { + "id": "353942721997832195", + "name": "MG", + "role": "Co-Directeur", + "avatar": "M", + "bio": "Je suis un développeur UEFN et Builder Minecraft polyvalent avec une solide expérience dans la création de systèmes pour divers Serveurs RP. J'ai travaillé sur des projets de plus ou moins grande envergure sur diverses plateformes de jeux. J'ai aussi une certaine expérience en gestion de projet et je me montre polyvalent pour beaucoup de tâches", + "stats": [ + { + "value": "6", + "label": "Ans d'exp." + }, + { + "value": "25+", + "label": "Systèmes" + }, + { + "value": "∞", + "label": "Fan de Louis de Funès" + } + ], + "skills": [ + "Polyvalent", + "Gestion de projets", + "UEFN", + "Builder Minecraft" + ], + "social": { + "discord": "", + "twitter": "", + "instagram": "", + "youtube": "", + "tiktok": "", + "github": "" + } + }, + { + "id": "971446412690722826", + "name": "Gameur", + "role": "Agent - Développeur Principal", + "avatar": "G", + "bio": "Avec plus de 3 ans d'expérience dans le self-hosting, j'ai créé des bots pour des communautés de toutes tailles, allant de petits serveurs à des projets d'envergure. Mon expertise couvre la création de commandes personnalisées, l'intégration d'API tierces et la gestion de bases de données pour offrir des fonctionnalités avancées et une expérience utilisateur fluide.", + "stats": [ + { + "value": "3", + "label": "Ans d'exp." + }, + { + "value": "50+", + "label": "Projets" + }, + { + "value": "★★★★", + "label": "Intermédiaire - Avancé" + } + ], + "skills": [ + "Python", + "Discord.py", + "API REST", + "Docker", + "self-hosting", + "Linux", + "Gestion de projets" + ], + "social": { + "discord": "", + "twitter": "", + "instagram": "", + "youtube": "", + "tiktok": "", + "github": "" + } + }, + { + "id": "561485865562406914", + "name": "KIRITO_KMA", + "role": "Agent - Développeur Full-Stack", + "avatar": "K", + "bio": "Développeur Full-Stack passionné, maîtrisent une large gamme de technologies pour créer des solutions complètes et performantes. Mon expertise s'étend du développement backend robuste à la création d'interfaces utilisateur intuitives, en passant par la gestion de bases de données et l'intégration d'API tierces. Mon panel de compétences s'étend également à la mise en place d'environnements de développement et de déploiement efficaces, garantissant ainsi la qualité et la fiabilité de chaque projet sur lequel je travaille.", + "stats": [ + { + "value": "4", + "label": "Ans d'exp." + }, + { + "value": "50+", + "label": "Projets menés" + }, + { + "value": "1000%", + "label": "Maîtrise du shifoumi" + } + ], + "skills": [ + "Dev Full-Stack", + "SEO", + "Map-Maker", + "Bot Discord", + "Scénariste", + "Shifoumi", + "Command Blocks Minecraft" + ], + "social": { + "discord": "", + "twitter": "", + "instagram": "", + "youtube": "", + "tiktok": "", + "github": "" + } + }, + { + "id": "1324439906046574693", + "name": "Lowei", + "role": "Agent - Développeur Backend", + "avatar": "L", + "bio": "Salut ! Je suis un développeur backend passionné par la création de systèmes robustes, performants et dans l'automatisation de tâches. N'hésite pas à checker mes réseaux ci-dessous !", + "stats": [ + { + "value": "5", + "label": "Ans d'exp." + }, + { + "value": "20+", + "label": "Systèmes" + }, + { + "value": "∞", + "label": "Disponibilité" + } + ], + "skills": [ + "Python", + "HTML", + "CSS", + "C, C++", + "Java", + "Blender" + ], + "social": { + "discord": "", + "twitter": "", + "instagram": "", + "youtube": "", + "tiktok": "", + "github": "" + } + }, + { + "id": "899299051080663050", + "name": "Ryou", + "role": "Agent - Modélisation 3D", + "avatar": "R", + "bio": "Hey, je suis Ryou, créatif et développeur passionné par la création sous toutes ses formes : code, 3D, concept art ou musique/sound design. J'aime construire des applications esthétiquement belles et utiles, ou des jeux harmonieux et amusants. Je conçois également des modèles 3D pour VTubers, animations ou jeux vidéo. Mes commissions sont ouvertes, n'hésitez pas à me follow sur mes réseaux !", + "stats": [ + { + "value": "6", + "label": "Ans d'exp." + }, + { + "value": "5+", + "label": "Projets" + }, + { + "value": "15+", + "label": "Commissions réalisées" + } + ], + "skills": [ + "Blender", + "HTML", + "TypeScript", + "JavaScript", + "C, C#, C++", + "Fl Studio", + "Piano, Guitare, Bass" + ], + "social": { + "discord": "", + "twitter": "https://x.com/ryoucafe_1", + "instagram": "https://www.instagram.com/ryoucafe/", + "youtube": "", + "tiktok": "", + "github": "https://github.com/ryoucafe" + } + }, + { + "id": "1151495567256584253", + "name": "Kuby", + "role": "Bot Discord", + "avatar": "K", + "bio": "Kuby est le gardien de la qualité du moindre octets au quetta-octets chez OmégaKube. Aucune commande ne lui échappe. Il execute méticuleusement chaque instructions, chaque commande, chaque interaction pour garantir une expérience sans accroc aux utilisateurs finaux.", + "stats": [ + { + "value": "2", + "label": "Yotta d'exp sur Discord" + }, + { + "value": "500+", + "label": "Commandes réalisées" + }, + { + "value": "0", + "label": "Vulnérabilités" + } + ], + "skills": [ + "Moderation", + "Events", + "Documentation", + "Serveur Discord", + "Administration", + "Bot" + ], + "social": { + "discord": "", + "twitter": "", + "instagram": "", + "youtube": "", + "tiktok": "", + "github": "" + } + } +] \ No newline at end of file diff --git a/assets/fonts/Montserrat/Montserrat-Italic-VariableFont_wght.ttf b/assets/fonts/Montserrat/Montserrat-Italic-VariableFont_wght.ttf new file mode 100644 index 0000000..76e3f9d Binary files /dev/null and b/assets/fonts/Montserrat/Montserrat-Italic-VariableFont_wght.ttf differ diff --git a/assets/fonts/Montserrat/Montserrat-VariableFont_wght.ttf b/assets/fonts/Montserrat/Montserrat-VariableFont_wght.ttf new file mode 100644 index 0000000..451e692 Binary files /dev/null and b/assets/fonts/Montserrat/Montserrat-VariableFont_wght.ttf differ diff --git a/assets/fonts/Montserrat/OFL.txt b/assets/fonts/Montserrat/OFL.txt new file mode 100644 index 0000000..4515774 --- /dev/null +++ b/assets/fonts/Montserrat/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2024 The Montserrat.Git Project Authors (https://github.com/JulietaUla/Montserrat.git) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/fonts/Montserrat/README.txt b/assets/fonts/Montserrat/README.txt new file mode 100644 index 0000000..526747d --- /dev/null +++ b/assets/fonts/Montserrat/README.txt @@ -0,0 +1,81 @@ +Montserrat Variable Font +======================== + +This download contains Montserrat as both variable fonts and static fonts. + +Montserrat is a variable font with this axis: + wght + +This means all the styles are contained in these files: + Montserrat-VariableFont_wght.ttf + Montserrat-Italic-VariableFont_wght.ttf + +If your app fully supports variable fonts, you can now pick intermediate styles +that aren’t available as static fonts. Not all apps support variable fonts, and +in those cases you can use the static font files for Montserrat: + static/Montserrat-Thin.ttf + static/Montserrat-ExtraLight.ttf + static/Montserrat-Light.ttf + static/Montserrat-Regular.ttf + static/Montserrat-Medium.ttf + static/Montserrat-SemiBold.ttf + static/Montserrat-Bold.ttf + static/Montserrat-ExtraBold.ttf + static/Montserrat-Black.ttf + static/Montserrat-ThinItalic.ttf + static/Montserrat-ExtraLightItalic.ttf + static/Montserrat-LightItalic.ttf + static/Montserrat-Italic.ttf + static/Montserrat-MediumItalic.ttf + static/Montserrat-SemiBoldItalic.ttf + static/Montserrat-BoldItalic.ttf + static/Montserrat-ExtraBoldItalic.ttf + static/Montserrat-BlackItalic.ttf + +Get started +----------- + +1. Install the font files you want to use + +2. Use your app's font picker to view the font family and all the +available styles + +Learn more about variable fonts +------------------------------- + + https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts + https://variablefonts.typenetwork.com + https://medium.com/variable-fonts + +In desktop apps + + https://theblog.adobe.com/can-variable-fonts-illustrator-cc + https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts + +Online + + https://developers.google.com/fonts/docs/getting_started + https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide + https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts + +Installing fonts + + MacOS: https://support.apple.com/en-us/HT201749 + Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux + Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows + +Android Apps + + https://developers.google.com/fonts/docs/android + https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts + +License +------- +Please read the full license text (OFL.txt) to understand the permissions, +restrictions and requirements for usage, redistribution, and modification. + +You can use them in your products & projects – print or digital, +commercial or otherwise. + +This isn't legal advice, please consider consulting a lawyer and see the full +license for all details. diff --git a/assets/fonts/Montserrat/static/Montserrat-Black.ttf b/assets/fonts/Montserrat/static/Montserrat-Black.ttf new file mode 100644 index 0000000..2fab7ab Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-Black.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-BlackItalic.ttf b/assets/fonts/Montserrat/static/Montserrat-BlackItalic.ttf new file mode 100644 index 0000000..04d3b47 Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-BlackItalic.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-Bold.ttf b/assets/fonts/Montserrat/static/Montserrat-Bold.ttf new file mode 100644 index 0000000..4033587 Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-Bold.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-BoldItalic.ttf b/assets/fonts/Montserrat/static/Montserrat-BoldItalic.ttf new file mode 100644 index 0000000..0cc5c2c Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-BoldItalic.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-ExtraBold.ttf b/assets/fonts/Montserrat/static/Montserrat-ExtraBold.ttf new file mode 100644 index 0000000..476ec30 Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-ExtraBold.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-ExtraBoldItalic.ttf b/assets/fonts/Montserrat/static/Montserrat-ExtraBoldItalic.ttf new file mode 100644 index 0000000..a1ac9a9 Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-ExtraBoldItalic.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-ExtraLight.ttf b/assets/fonts/Montserrat/static/Montserrat-ExtraLight.ttf new file mode 100644 index 0000000..efaeab0 Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-ExtraLight.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-ExtraLightItalic.ttf b/assets/fonts/Montserrat/static/Montserrat-ExtraLightItalic.ttf new file mode 100644 index 0000000..a8d18de Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-ExtraLightItalic.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-Italic.ttf b/assets/fonts/Montserrat/static/Montserrat-Italic.ttf new file mode 100644 index 0000000..5f08df0 Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-Italic.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-Light.ttf b/assets/fonts/Montserrat/static/Montserrat-Light.ttf new file mode 100644 index 0000000..881f12d Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-Light.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-LightItalic.ttf b/assets/fonts/Montserrat/static/Montserrat-LightItalic.ttf new file mode 100644 index 0000000..b2991d0 Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-LightItalic.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-Medium.ttf b/assets/fonts/Montserrat/static/Montserrat-Medium.ttf new file mode 100644 index 0000000..c9a39ea Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-Medium.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-MediumItalic.ttf b/assets/fonts/Montserrat/static/Montserrat-MediumItalic.ttf new file mode 100644 index 0000000..086dd6e Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-MediumItalic.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-Regular.ttf b/assets/fonts/Montserrat/static/Montserrat-Regular.ttf new file mode 100644 index 0000000..895e220 Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-Regular.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-SemiBold.ttf b/assets/fonts/Montserrat/static/Montserrat-SemiBold.ttf new file mode 100644 index 0000000..161477a Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-SemiBold.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-SemiBoldItalic.ttf b/assets/fonts/Montserrat/static/Montserrat-SemiBoldItalic.ttf new file mode 100644 index 0000000..73dc6c6 Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-SemiBoldItalic.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-Thin.ttf b/assets/fonts/Montserrat/static/Montserrat-Thin.ttf new file mode 100644 index 0000000..c9cf195 Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-Thin.ttf differ diff --git a/assets/fonts/Montserrat/static/Montserrat-ThinItalic.ttf b/assets/fonts/Montserrat/static/Montserrat-ThinItalic.ttf new file mode 100644 index 0000000..e6dfc05 Binary files /dev/null and b/assets/fonts/Montserrat/static/Montserrat-ThinItalic.ttf differ diff --git a/assets/fonts/custom_font_large.otf b/assets/fonts/custom_font_large.otf new file mode 100644 index 0000000..74819b8 Binary files /dev/null and b/assets/fonts/custom_font_large.otf differ diff --git a/assets/fonts/custom_font_small.otf b/assets/fonts/custom_font_small.otf new file mode 100644 index 0000000..8c5eafe Binary files /dev/null and b/assets/fonts/custom_font_small.otf differ diff --git a/assets/images/favicon/android-chrome-192x192.png b/assets/images/favicon/android-chrome-192x192.png new file mode 100644 index 0000000..0bfecf2 Binary files /dev/null and b/assets/images/favicon/android-chrome-192x192.png differ diff --git a/assets/images/favicon/android-chrome-512x512.png b/assets/images/favicon/android-chrome-512x512.png new file mode 100644 index 0000000..ea4db2d Binary files /dev/null and b/assets/images/favicon/android-chrome-512x512.png differ diff --git a/assets/images/favicon/apple-touch-icon.png b/assets/images/favicon/apple-touch-icon.png new file mode 100644 index 0000000..64df795 Binary files /dev/null and b/assets/images/favicon/apple-touch-icon.png differ diff --git a/assets/images/favicon/favicon-16x16.png b/assets/images/favicon/favicon-16x16.png new file mode 100644 index 0000000..3b8f32d Binary files /dev/null and b/assets/images/favicon/favicon-16x16.png differ diff --git a/assets/images/favicon/favicon-32x32.png b/assets/images/favicon/favicon-32x32.png new file mode 100644 index 0000000..e1ad569 Binary files /dev/null and b/assets/images/favicon/favicon-32x32.png differ diff --git a/assets/images/favicon/favicon.ico b/assets/images/favicon/favicon.ico new file mode 100644 index 0000000..a28de91 Binary files /dev/null and b/assets/images/favicon/favicon.ico differ diff --git a/assets/images/favicon/site.webmanifest b/assets/images/favicon/site.webmanifest new file mode 100644 index 0000000..2c53093 --- /dev/null +++ b/assets/images/favicon/site.webmanifest @@ -0,0 +1,13 @@ +{ + "name": "Omega Kube", + "short_name": "Omega Kube", + "description": "L'univers du Role Play réinventé", + "icons": [ + { "src": "/assets/images/favicon/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, + { "src": "/assets/images/favicon/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } + ], + "theme_color": "#0a0a0f", + "background_color": "#0a0a0f", + "display": "standalone", + "start_url": "/" +} diff --git a/assets/images/imgrd-1.jpg b/assets/images/imgrd-1.jpg new file mode 100644 index 0000000..45d57a8 Binary files /dev/null and b/assets/images/imgrd-1.jpg differ diff --git a/assets/images/imgrd-2.png b/assets/images/imgrd-2.png new file mode 100644 index 0000000..9079c10 Binary files /dev/null and b/assets/images/imgrd-2.png differ diff --git a/assets/images/logo.png b/assets/images/logo.png new file mode 100644 index 0000000..c870bcf Binary files /dev/null and b/assets/images/logo.png differ diff --git a/assets/images/old-logo.png b/assets/images/old-logo.png new file mode 100644 index 0000000..fbf01ec Binary files /dev/null and b/assets/images/old-logo.png differ diff --git a/assets/images/partners/red-dust-redemption.jpg b/assets/images/partners/red-dust-redemption.jpg new file mode 100644 index 0000000..45d57a8 Binary files /dev/null and b/assets/images/partners/red-dust-redemption.jpg differ diff --git a/assets/images/partners/rickroll.png b/assets/images/partners/rickroll.png new file mode 100644 index 0000000..5618c62 Binary files /dev/null and b/assets/images/partners/rickroll.png differ diff --git a/assets/images/partners/site-omega.png b/assets/images/partners/site-omega.png new file mode 100644 index 0000000..d39639d Binary files /dev/null and b/assets/images/partners/site-omega.png differ diff --git a/assets/images/partners/the-last-refuge.png b/assets/images/partners/the-last-refuge.png new file mode 100644 index 0000000..04c6538 Binary files /dev/null and b/assets/images/partners/the-last-refuge.png differ diff --git a/assets/images/partners/victorias-vice.png b/assets/images/partners/victorias-vice.png new file mode 100644 index 0000000..8211df4 Binary files /dev/null and b/assets/images/partners/victorias-vice.png differ diff --git a/assets/images/partners/victorias-vicebis.png b/assets/images/partners/victorias-vicebis.png new file mode 100644 index 0000000..16734f2 Binary files /dev/null and b/assets/images/partners/victorias-vicebis.png differ diff --git a/assets/images/projects/beta/imgb-1.png b/assets/images/projects/beta/imgb-1.png new file mode 100644 index 0000000..281729a Binary files /dev/null and b/assets/images/projects/beta/imgb-1.png differ diff --git a/assets/images/projects/beta/imgb-2.png b/assets/images/projects/beta/imgb-2.png new file mode 100644 index 0000000..72101e0 Binary files /dev/null and b/assets/images/projects/beta/imgb-2.png differ diff --git a/assets/images/projects/branding-omega-kube/gifk-4.gif b/assets/images/projects/branding-omega-kube/gifk-4.gif new file mode 100644 index 0000000..378373f Binary files /dev/null and b/assets/images/projects/branding-omega-kube/gifk-4.gif differ diff --git a/assets/images/projects/branding-omega-kube/imgk-1.png b/assets/images/projects/branding-omega-kube/imgk-1.png new file mode 100644 index 0000000..2486539 Binary files /dev/null and b/assets/images/projects/branding-omega-kube/imgk-1.png differ diff --git a/assets/images/projects/branding-omega-kube/imgk-2.png b/assets/images/projects/branding-omega-kube/imgk-2.png new file mode 100644 index 0000000..c870bcf Binary files /dev/null and b/assets/images/projects/branding-omega-kube/imgk-2.png differ diff --git a/assets/images/projects/branding-omega-kube/videok-3.mp4 b/assets/images/projects/branding-omega-kube/videok-3.mp4 new file mode 100644 index 0000000..bb21f30 Binary files /dev/null and b/assets/images/projects/branding-omega-kube/videok-3.mp4 differ diff --git a/assets/images/projects/kuby/imgk-1.png b/assets/images/projects/kuby/imgk-1.png new file mode 100644 index 0000000..9c3656e Binary files /dev/null and b/assets/images/projects/kuby/imgk-1.png differ diff --git a/assets/images/projects/kuby/imgk-1bis.png b/assets/images/projects/kuby/imgk-1bis.png new file mode 100644 index 0000000..6187ffb Binary files /dev/null and b/assets/images/projects/kuby/imgk-1bis.png differ diff --git a/assets/images/projects/site-omega/imgso-1.png b/assets/images/projects/site-omega/imgso-1.png new file mode 100644 index 0000000..49767d3 Binary files /dev/null and b/assets/images/projects/site-omega/imgso-1.png differ diff --git a/assets/images/projects/site-omega/imgso-2.png b/assets/images/projects/site-omega/imgso-2.png new file mode 100644 index 0000000..01f0ba9 Binary files /dev/null and b/assets/images/projects/site-omega/imgso-2.png differ diff --git a/assets/images/projects/site-omega/imgso-3.png b/assets/images/projects/site-omega/imgso-3.png new file mode 100644 index 0000000..eab1c1b Binary files /dev/null and b/assets/images/projects/site-omega/imgso-3.png differ diff --git a/assets/images/projects/site-omega/imgso-4.png b/assets/images/projects/site-omega/imgso-4.png new file mode 100644 index 0000000..a2ccde9 Binary files /dev/null and b/assets/images/projects/site-omega/imgso-4.png differ diff --git a/assets/images/projects/site-omega/imgso-5.png b/assets/images/projects/site-omega/imgso-5.png new file mode 100644 index 0000000..b83e70b Binary files /dev/null and b/assets/images/projects/site-omega/imgso-5.png differ diff --git a/assets/images/projects/site-omega/imgso-6.png b/assets/images/projects/site-omega/imgso-6.png new file mode 100644 index 0000000..b76bcb7 Binary files /dev/null and b/assets/images/projects/site-omega/imgso-6.png differ diff --git a/assets/images/projects/site-omega/imgso-7.png b/assets/images/projects/site-omega/imgso-7.png new file mode 100644 index 0000000..dcc4d6d Binary files /dev/null and b/assets/images/projects/site-omega/imgso-7.png differ diff --git a/assets/images/projects/site-omega/imgso-8.png b/assets/images/projects/site-omega/imgso-8.png new file mode 100644 index 0000000..7201c61 Binary files /dev/null and b/assets/images/projects/site-omega/imgso-8.png differ diff --git a/assets/images/projects/site-omega/imgso-9.jpg b/assets/images/projects/site-omega/imgso-9.jpg new file mode 100644 index 0000000..10f1acd Binary files /dev/null and b/assets/images/projects/site-omega/imgso-9.jpg differ diff --git a/assets/images/projects/victorias-vice-1/TrailerOfficielVV1.mp4 b/assets/images/projects/victorias-vice-1/TrailerOfficielVV1.mp4 new file mode 100644 index 0000000..3caa9b1 Binary files /dev/null and b/assets/images/projects/victorias-vice-1/TrailerOfficielVV1.mp4 differ diff --git a/assets/images/projects/victorias-vice-1/imgvv1-1.jpg b/assets/images/projects/victorias-vice-1/imgvv1-1.jpg new file mode 100644 index 0000000..f897ac2 Binary files /dev/null and b/assets/images/projects/victorias-vice-1/imgvv1-1.jpg differ diff --git a/assets/images/projects/victorias-vice-1/imgvv1-2.jpg b/assets/images/projects/victorias-vice-1/imgvv1-2.jpg new file mode 100644 index 0000000..8eeeb6b Binary files /dev/null and b/assets/images/projects/victorias-vice-1/imgvv1-2.jpg differ diff --git a/assets/images/projects/victorias-vice-1/imgvv1-3.jpg b/assets/images/projects/victorias-vice-1/imgvv1-3.jpg new file mode 100644 index 0000000..856dc3f Binary files /dev/null and b/assets/images/projects/victorias-vice-1/imgvv1-3.jpg differ diff --git a/assets/images/projects/victorias-vice-1/imgvv1-4.jpg b/assets/images/projects/victorias-vice-1/imgvv1-4.jpg new file mode 100644 index 0000000..14cb339 Binary files /dev/null and b/assets/images/projects/victorias-vice-1/imgvv1-4.jpg differ diff --git a/assets/images/projects/victorias-vice-1/imgvv1-5.jpg b/assets/images/projects/victorias-vice-1/imgvv1-5.jpg new file mode 100644 index 0000000..5752188 Binary files /dev/null and b/assets/images/projects/victorias-vice-1/imgvv1-5.jpg differ diff --git a/assets/images/projects/victorias-vice-1/imgvv1-6.jpg b/assets/images/projects/victorias-vice-1/imgvv1-6.jpg new file mode 100644 index 0000000..b2d2a19 Binary files /dev/null and b/assets/images/projects/victorias-vice-1/imgvv1-6.jpg differ diff --git a/assets/images/projects/victorias-vice-1/imgvv1-7.jpg b/assets/images/projects/victorias-vice-1/imgvv1-7.jpg new file mode 100644 index 0000000..e41c425 Binary files /dev/null and b/assets/images/projects/victorias-vice-1/imgvv1-7.jpg differ diff --git a/assets/images/projects/victorias-vice-1/imgvv1-8.jpg b/assets/images/projects/victorias-vice-1/imgvv1-8.jpg new file mode 100644 index 0000000..1093c63 Binary files /dev/null and b/assets/images/projects/victorias-vice-1/imgvv1-8.jpg differ diff --git a/assets/images/projects/victorias-vice-2/imgvv2-1.jpg b/assets/images/projects/victorias-vice-2/imgvv2-1.jpg new file mode 100644 index 0000000..a4c7b2d Binary files /dev/null and b/assets/images/projects/victorias-vice-2/imgvv2-1.jpg differ diff --git a/assets/images/projects/victorias-vice-2/imgvv2-2.jpg b/assets/images/projects/victorias-vice-2/imgvv2-2.jpg new file mode 100644 index 0000000..6f1346a Binary files /dev/null and b/assets/images/projects/victorias-vice-2/imgvv2-2.jpg differ diff --git a/assets/images/projects/victorias-vice-2/imgvv2-3.jpg b/assets/images/projects/victorias-vice-2/imgvv2-3.jpg new file mode 100644 index 0000000..ff467a4 Binary files /dev/null and b/assets/images/projects/victorias-vice-2/imgvv2-3.jpg differ diff --git a/assets/images/projects/vicy/imgvicy-1.png b/assets/images/projects/vicy/imgvicy-1.png new file mode 100644 index 0000000..9b78325 Binary files /dev/null and b/assets/images/projects/vicy/imgvicy-1.png differ diff --git a/assets/images/social/discord1.png b/assets/images/social/discord1.png new file mode 100644 index 0000000..a4ae95c Binary files /dev/null and b/assets/images/social/discord1.png differ diff --git a/assets/images/social/discord2.png b/assets/images/social/discord2.png new file mode 100644 index 0000000..5f21f4b Binary files /dev/null and b/assets/images/social/discord2.png differ diff --git a/assets/images/social/discord3.png b/assets/images/social/discord3.png new file mode 100644 index 0000000..b7266fd Binary files /dev/null and b/assets/images/social/discord3.png differ diff --git a/assets/images/social/epicgames.svg b/assets/images/social/epicgames.svg new file mode 100644 index 0000000..2db178c --- /dev/null +++ b/assets/images/social/epicgames.svg @@ -0,0 +1 @@ +Epic Games \ No newline at end of file diff --git a/assets/images/social/fortnite.svg b/assets/images/social/fortnite.svg new file mode 100644 index 0000000..561e0cf --- /dev/null +++ b/assets/images/social/fortnite.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/images/social/garrysmod.svg b/assets/images/social/garrysmod.svg new file mode 100644 index 0000000..fade355 --- /dev/null +++ b/assets/images/social/garrysmod.svg @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/assets/images/social/hytale.png b/assets/images/social/hytale.png new file mode 100644 index 0000000..ee3d0bb Binary files /dev/null and b/assets/images/social/hytale.png differ diff --git a/assets/images/social/minecraft.svg b/assets/images/social/minecraft.svg new file mode 100644 index 0000000..449e630 --- /dev/null +++ b/assets/images/social/minecraft.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/assets/images/team/1151495567256584253.png b/assets/images/team/1151495567256584253.png new file mode 100644 index 0000000..9c3656e Binary files /dev/null and b/assets/images/team/1151495567256584253.png differ diff --git a/assets/images/team/1324439906046574693.png b/assets/images/team/1324439906046574693.png new file mode 100644 index 0000000..751ac22 Binary files /dev/null and b/assets/images/team/1324439906046574693.png differ diff --git a/assets/images/team/353942721997832195.gif b/assets/images/team/353942721997832195.gif new file mode 100644 index 0000000..b88f572 Binary files /dev/null and b/assets/images/team/353942721997832195.gif differ diff --git a/assets/images/team/534003230435442690.png b/assets/images/team/534003230435442690.png new file mode 100644 index 0000000..4606372 Binary files /dev/null and b/assets/images/team/534003230435442690.png differ diff --git a/assets/images/team/561485865562406914.png b/assets/images/team/561485865562406914.png new file mode 100644 index 0000000..e731d23 Binary files /dev/null and b/assets/images/team/561485865562406914.png differ diff --git a/assets/images/team/971446412690722826.png b/assets/images/team/971446412690722826.png new file mode 100644 index 0000000..3c32313 Binary files /dev/null and b/assets/images/team/971446412690722826.png differ diff --git a/assets/js/feather.min.js b/assets/js/feather.min.js new file mode 100644 index 0000000..07d5009 --- /dev/null +++ b/assets/js/feather.min.js @@ -0,0 +1,13 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.feather=n():e.feather=n()}("undefined"!=typeof self?self:this,function(){return function(e){var n={};function i(t){if(n[t])return n[t].exports;var l=n[t]={i:t,l:!1,exports:{}};return e[t].call(l.exports,l,l.exports,i),l.l=!0,l.exports}return i.m=e,i.c=n,i.d=function(e,n,t){i.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},i.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},i.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(n,"a",n),n},i.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},i.p="",i(i.s=80)}([function(e,n,i){(function(n){var i="object",t=function(e){return e&&e.Math==Math&&e};e.exports=t(typeof globalThis==i&&globalThis)||t(typeof window==i&&window)||t(typeof self==i&&self)||t(typeof n==i&&n)||Function("return this")()}).call(this,i(75))},function(e,n){var i={}.hasOwnProperty;e.exports=function(e,n){return i.call(e,n)}},function(e,n,i){var t=i(0),l=i(11),r=i(33),o=i(62),a=t.Symbol,c=l("wks");e.exports=function(e){return c[e]||(c[e]=o&&a[e]||(o?a:r)("Symbol."+e))}},function(e,n,i){var t=i(6);e.exports=function(e){if(!t(e))throw TypeError(String(e)+" is not an object");return e}},function(e,n){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,n,i){var t=i(8),l=i(7),r=i(10);e.exports=t?function(e,n,i){return l.f(e,n,r(1,i))}:function(e,n,i){return e[n]=i,e}},function(e,n){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,n,i){var t=i(8),l=i(35),r=i(3),o=i(18),a=Object.defineProperty;n.f=t?a:function(e,n,i){if(r(e),n=o(n,!0),r(i),l)try{return a(e,n,i)}catch(e){}if("get"in i||"set"in i)throw TypeError("Accessors not supported");return"value"in i&&(e[n]=i.value),e}},function(e,n,i){var t=i(4);e.exports=!t(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,n){e.exports={}},function(e,n){e.exports=function(e,n){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:n}}},function(e,n,i){var t=i(0),l=i(19),r=i(17),o=t["__core-js_shared__"]||l("__core-js_shared__",{});(e.exports=function(e,n){return o[e]||(o[e]=void 0!==n?n:{})})("versions",[]).push({version:"3.1.3",mode:r?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(e,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t=o(i(43)),l=o(i(41)),r=o(i(40));function o(e){return e&&e.__esModule?e:{default:e}}n.default=Object.keys(l.default).map(function(e){return new t.default(e,l.default[e],r.default[e])}).reduce(function(e,n){return e[n.name]=n,e},{})},function(e,n){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(e,n,i){var t=i(72),l=i(20);e.exports=function(e){return t(l(e))}},function(e,n){e.exports={}},function(e,n,i){var t=i(11),l=i(33),r=t("keys");e.exports=function(e){return r[e]||(r[e]=l(e))}},function(e,n){e.exports=!1},function(e,n,i){var t=i(6);e.exports=function(e,n){if(!t(e))return e;var i,l;if(n&&"function"==typeof(i=e.toString)&&!t(l=i.call(e)))return l;if("function"==typeof(i=e.valueOf)&&!t(l=i.call(e)))return l;if(!n&&"function"==typeof(i=e.toString)&&!t(l=i.call(e)))return l;throw TypeError("Can't convert object to primitive value")}},function(e,n,i){var t=i(0),l=i(5);e.exports=function(e,n){try{l(t,e,n)}catch(i){t[e]=n}return n}},function(e,n){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,n){var i=Math.ceil,t=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?t:i)(e)}},function(e,n,i){var t; +/*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ +/*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ +!function(){"use strict";var i=function(){function e(){}function n(e,n){for(var i=n.length,t=0;t0?l(t(e),9007199254740991):0}},function(e,n,i){var t=i(1),l=i(14),r=i(68),o=i(15),a=r(!1);e.exports=function(e,n){var i,r=l(e),c=0,p=[];for(i in r)!t(o,i)&&t(r,i)&&p.push(i);for(;n.length>c;)t(r,i=n[c++])&&(~a(p,i)||p.push(i));return p}},function(e,n,i){var t=i(0),l=i(11),r=i(5),o=i(1),a=i(19),c=i(36),p=i(37),y=p.get,h=p.enforce,x=String(c).split("toString");l("inspectSource",function(e){return c.call(e)}),(e.exports=function(e,n,i,l){var c=!!l&&!!l.unsafe,p=!!l&&!!l.enumerable,y=!!l&&!!l.noTargetGet;"function"==typeof i&&("string"!=typeof n||o(i,"name")||r(i,"name",n),h(i).source=x.join("string"==typeof n?n:"")),e!==t?(c?!y&&e[n]&&(p=!0):delete e[n],p?e[n]=i:r(e,n,i)):p?e[n]=i:a(n,i)})(Function.prototype,"toString",function(){return"function"==typeof this&&y(this).source||c.call(this)})},function(e,n){var i={}.toString;e.exports=function(e){return i.call(e).slice(8,-1)}},function(e,n,i){var t=i(8),l=i(73),r=i(10),o=i(14),a=i(18),c=i(1),p=i(35),y=Object.getOwnPropertyDescriptor;n.f=t?y:function(e,n){if(e=o(e),n=a(n,!0),p)try{return y(e,n)}catch(e){}if(c(e,n))return r(!l.f.call(e,n),e[n])}},function(e,n,i){var t=i(0),l=i(31).f,r=i(5),o=i(29),a=i(19),c=i(71),p=i(65);e.exports=function(e,n){var i,y,h,x,s,u=e.target,d=e.global,f=e.stat;if(i=d?t:f?t[u]||a(u,{}):(t[u]||{}).prototype)for(y in n){if(x=n[y],h=e.noTargetGet?(s=l(i,y))&&s.value:i[y],!p(d?y:u+(f?".":"#")+y,e.forced)&&void 0!==h){if(typeof x==typeof h)continue;c(x,h)}(e.sham||h&&h.sham)&&r(x,"sham",!0),o(i,y,x,e)}}},function(e,n){var i=0,t=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++i+t).toString(36))}},function(e,n,i){var t=i(0),l=i(6),r=t.document,o=l(r)&&l(r.createElement);e.exports=function(e){return o?r.createElement(e):{}}},function(e,n,i){var t=i(8),l=i(4),r=i(34);e.exports=!t&&!l(function(){return 7!=Object.defineProperty(r("div"),"a",{get:function(){return 7}}).a})},function(e,n,i){var t=i(11);e.exports=t("native-function-to-string",Function.toString)},function(e,n,i){var t,l,r,o=i(76),a=i(0),c=i(6),p=i(5),y=i(1),h=i(16),x=i(15),s=a.WeakMap;if(o){var u=new s,d=u.get,f=u.has,g=u.set;t=function(e,n){return g.call(u,e,n),n},l=function(e){return d.call(u,e)||{}},r=function(e){return f.call(u,e)}}else{var v=h("state");x[v]=!0,t=function(e,n){return p(e,v,n),n},l=function(e){return y(e,v)?e[v]:{}},r=function(e){return y(e,v)}}e.exports={set:t,get:l,has:r,enforce:function(e){return r(e)?l(e):t(e,{})},getterFor:function(e){return function(n){var i;if(!c(n)||(i=l(n)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return i}}}},function(e,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t=Object.assign||function(e){for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{};if("undefined"==typeof document)throw new Error("`feather.replace()` only works in a browser environment.");var n=document.querySelectorAll("[data-feather]");Array.from(n).forEach(function(n){return function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=function(e){return Array.from(e.attributes).reduce(function(e,n){return e[n.name]=n.value,e},{})}(e),o=i["data-feather"];delete i["data-feather"];var a=r.default[o].toSvg(t({},n,i,{class:(0,l.default)(n.class,i.class)})),c=(new DOMParser).parseFromString(a,"image/svg+xml").querySelector("svg");e.parentNode.replaceChild(c,e)}(n,e)})}},function(e,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t,l=i(12),r=(t=l)&&t.__esModule?t:{default:t};n.default=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(console.warn("feather.toSvg() is deprecated. Please use feather.icons[name].toSvg() instead."),!e)throw new Error("The required `key` (icon name) parameter is missing.");if(!r.default[e])throw new Error("No icon matching '"+e+"'. See the complete list of icons at https://feathericons.com");return r.default[e].toSvg(n)}},function(e){e.exports={activity:["pulse","health","action","motion"],airplay:["stream","cast","mirroring"],"alert-circle":["warning","alert","danger"],"alert-octagon":["warning","alert","danger"],"alert-triangle":["warning","alert","danger"],"align-center":["text alignment","center"],"align-justify":["text alignment","justified"],"align-left":["text alignment","left"],"align-right":["text alignment","right"],anchor:[],archive:["index","box"],"at-sign":["mention","at","email","message"],award:["achievement","badge"],aperture:["camera","photo"],"bar-chart":["statistics","diagram","graph"],"bar-chart-2":["statistics","diagram","graph"],battery:["power","electricity"],"battery-charging":["power","electricity"],bell:["alarm","notification","sound"],"bell-off":["alarm","notification","silent"],bluetooth:["wireless"],"book-open":["read","library"],book:["read","dictionary","booklet","magazine","library"],bookmark:["read","clip","marker","tag"],box:["cube"],briefcase:["work","bag","baggage","folder"],calendar:["date"],camera:["photo"],cast:["chromecast","airplay"],"chevron-down":["expand"],"chevron-up":["collapse"],circle:["off","zero","record"],clipboard:["copy"],clock:["time","watch","alarm"],"cloud-drizzle":["weather","shower"],"cloud-lightning":["weather","bolt"],"cloud-rain":["weather"],"cloud-snow":["weather","blizzard"],cloud:["weather"],codepen:["logo"],codesandbox:["logo"],code:["source","programming"],coffee:["drink","cup","mug","tea","cafe","hot","beverage"],columns:["layout"],command:["keyboard","cmd","terminal","prompt"],compass:["navigation","safari","travel","direction"],copy:["clone","duplicate"],"corner-down-left":["arrow","return"],"corner-down-right":["arrow"],"corner-left-down":["arrow"],"corner-left-up":["arrow"],"corner-right-down":["arrow"],"corner-right-up":["arrow"],"corner-up-left":["arrow"],"corner-up-right":["arrow"],cpu:["processor","technology"],"credit-card":["purchase","payment","cc"],crop:["photo","image"],crosshair:["aim","target"],database:["storage","memory"],delete:["remove"],disc:["album","cd","dvd","music"],"dollar-sign":["currency","money","payment"],droplet:["water"],edit:["pencil","change"],"edit-2":["pencil","change"],"edit-3":["pencil","change"],eye:["view","watch"],"eye-off":["view","watch","hide","hidden"],"external-link":["outbound"],facebook:["logo","social"],"fast-forward":["music"],figma:["logo","design","tool"],"file-minus":["delete","remove","erase"],"file-plus":["add","create","new"],"file-text":["data","txt","pdf"],film:["movie","video"],filter:["funnel","hopper"],flag:["report"],"folder-minus":["directory"],"folder-plus":["directory"],folder:["directory"],framer:["logo","design","tool"],frown:["emoji","face","bad","sad","emotion"],gift:["present","box","birthday","party"],"git-branch":["code","version control"],"git-commit":["code","version control"],"git-merge":["code","version control"],"git-pull-request":["code","version control"],github:["logo","version control"],gitlab:["logo","version control"],globe:["world","browser","language","translate"],"hard-drive":["computer","server","memory","data"],hash:["hashtag","number","pound"],headphones:["music","audio","sound"],heart:["like","love","emotion"],"help-circle":["question mark"],hexagon:["shape","node.js","logo"],home:["house","living"],image:["picture"],inbox:["email"],instagram:["logo","camera"],key:["password","login","authentication","secure"],layers:["stack"],layout:["window","webpage"],"life-buoy":["help","life ring","support"],link:["chain","url"],"link-2":["chain","url"],linkedin:["logo","social media"],list:["options"],lock:["security","password","secure"],"log-in":["sign in","arrow","enter"],"log-out":["sign out","arrow","exit"],mail:["email","message"],"map-pin":["location","navigation","travel","marker"],map:["location","navigation","travel"],maximize:["fullscreen"],"maximize-2":["fullscreen","arrows","expand"],meh:["emoji","face","neutral","emotion"],menu:["bars","navigation","hamburger"],"message-circle":["comment","chat"],"message-square":["comment","chat"],"mic-off":["record","sound","mute"],mic:["record","sound","listen"],minimize:["exit fullscreen","close"],"minimize-2":["exit fullscreen","arrows","close"],minus:["subtract"],monitor:["tv","screen","display"],moon:["dark","night"],"more-horizontal":["ellipsis"],"more-vertical":["ellipsis"],"mouse-pointer":["arrow","cursor"],move:["arrows"],music:["note"],navigation:["location","travel"],"navigation-2":["location","travel"],octagon:["stop"],package:["box","container"],paperclip:["attachment"],pause:["music","stop"],"pause-circle":["music","audio","stop"],"pen-tool":["vector","drawing"],percent:["discount"],"phone-call":["ring"],"phone-forwarded":["call"],"phone-incoming":["call"],"phone-missed":["call"],"phone-off":["call","mute"],"phone-outgoing":["call"],phone:["call"],play:["music","start"],"pie-chart":["statistics","diagram"],"play-circle":["music","start"],plus:["add","new"],"plus-circle":["add","new"],"plus-square":["add","new"],pocket:["logo","save"],power:["on","off"],printer:["fax","office","device"],radio:["signal"],"refresh-cw":["synchronise","arrows"],"refresh-ccw":["arrows"],repeat:["loop","arrows"],rewind:["music"],"rotate-ccw":["arrow"],"rotate-cw":["arrow"],rss:["feed","subscribe"],save:["floppy disk"],scissors:["cut"],search:["find","magnifier","magnifying glass"],send:["message","mail","email","paper airplane","paper aeroplane"],settings:["cog","edit","gear","preferences"],"share-2":["network","connections"],shield:["security","secure"],"shield-off":["security","insecure"],"shopping-bag":["ecommerce","cart","purchase","store"],"shopping-cart":["ecommerce","cart","purchase","store"],shuffle:["music"],"skip-back":["music"],"skip-forward":["music"],slack:["logo"],slash:["ban","no"],sliders:["settings","controls"],smartphone:["cellphone","device"],smile:["emoji","face","happy","good","emotion"],speaker:["audio","music"],star:["bookmark","favorite","like"],"stop-circle":["media","music"],sun:["brightness","weather","light"],sunrise:["weather","time","morning","day"],sunset:["weather","time","evening","night"],tablet:["device"],tag:["label"],target:["logo","bullseye"],terminal:["code","command line","prompt"],thermometer:["temperature","celsius","fahrenheit","weather"],"thumbs-down":["dislike","bad","emotion"],"thumbs-up":["like","good","emotion"],"toggle-left":["on","off","switch"],"toggle-right":["on","off","switch"],tool:["settings","spanner"],trash:["garbage","delete","remove","bin"],"trash-2":["garbage","delete","remove","bin"],triangle:["delta"],truck:["delivery","van","shipping","transport","lorry"],tv:["television","stream"],twitch:["logo"],twitter:["logo","social"],type:["text"],umbrella:["rain","weather"],unlock:["security"],"user-check":["followed","subscribed"],"user-minus":["delete","remove","unfollow","unsubscribe"],"user-plus":["new","add","create","follow","subscribe"],"user-x":["delete","remove","unfollow","unsubscribe","unavailable"],user:["person","account"],users:["group"],"video-off":["camera","movie","film"],video:["camera","movie","film"],voicemail:["phone"],volume:["music","sound","mute"],"volume-1":["music","sound"],"volume-2":["music","sound"],"volume-x":["music","sound","mute"],watch:["clock","time"],"wifi-off":["disabled"],wifi:["connection","signal","wireless"],wind:["weather","air"],"x-circle":["cancel","close","delete","remove","times","clear"],"x-octagon":["delete","stop","alert","warning","times","clear"],"x-square":["cancel","close","delete","remove","times","clear"],x:["cancel","close","delete","remove","times","clear"],youtube:["logo","video","play"],"zap-off":["flash","camera","lightning"],zap:["flash","camera","lightning"],"zoom-in":["magnifying glass"],"zoom-out":["magnifying glass"]}},function(e){e.exports={activity:'',airplay:'',"alert-circle":'',"alert-octagon":'',"alert-triangle":'',"align-center":'',"align-justify":'',"align-left":'',"align-right":'',anchor:'',aperture:'',archive:'',"arrow-down-circle":'',"arrow-down-left":'',"arrow-down-right":'',"arrow-down":'',"arrow-left-circle":'',"arrow-left":'',"arrow-right-circle":'',"arrow-right":'',"arrow-up-circle":'',"arrow-up-left":'',"arrow-up-right":'',"arrow-up":'',"at-sign":'',award:'',"bar-chart-2":'',"bar-chart":'',"battery-charging":'',battery:'',"bell-off":'',bell:'',bluetooth:'',bold:'',"book-open":'',book:'',bookmark:'',box:'',briefcase:'',calendar:'',"camera-off":'',camera:'',cast:'',"check-circle":'',"check-square":'',check:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',"chevrons-down":'',"chevrons-left":'',"chevrons-right":'',"chevrons-up":'',chrome:'',circle:'',clipboard:'',clock:'',"cloud-drizzle":'',"cloud-lightning":'',"cloud-off":'',"cloud-rain":'',"cloud-snow":'',cloud:'',code:'',codepen:'',codesandbox:'',coffee:'',columns:'',command:'',compass:'',copy:'',"corner-down-left":'',"corner-down-right":'',"corner-left-down":'',"corner-left-up":'',"corner-right-down":'',"corner-right-up":'',"corner-up-left":'',"corner-up-right":'',cpu:'',"credit-card":'',crop:'',crosshair:'',database:'',delete:'',disc:'',"divide-circle":'',"divide-square":'',divide:'',"dollar-sign":'',"download-cloud":'',download:'',dribbble:'',droplet:'',"edit-2":'',"edit-3":'',edit:'',"external-link":'',"eye-off":'',eye:'',facebook:'',"fast-forward":'',feather:'',figma:'',"file-minus":'',"file-plus":'',"file-text":'',file:'',film:'',filter:'',flag:'',"folder-minus":'',"folder-plus":'',folder:'',framer:'',frown:'',gift:'',"git-branch":'',"git-commit":'',"git-merge":'',"git-pull-request":'',github:'',gitlab:'',globe:'',grid:'',"hard-drive":'',hash:'',headphones:'',heart:'',"help-circle":'',hexagon:'',home:'',image:'',inbox:'',info:'',instagram:'',italic:'',key:'',layers:'',layout:'',"life-buoy":'',"link-2":'',link:'',linkedin:'',list:'',loader:'',lock:'',"log-in":'',"log-out":'',mail:'',"map-pin":'',map:'',"maximize-2":'',maximize:'',meh:'',menu:'',"message-circle":'',"message-square":'',"mic-off":'',mic:'',"minimize-2":'',minimize:'',"minus-circle":'',"minus-square":'',minus:'',monitor:'',moon:'',"more-horizontal":'',"more-vertical":'',"mouse-pointer":'',move:'',music:'',"navigation-2":'',navigation:'',octagon:'',package:'',paperclip:'',"pause-circle":'',pause:'',"pen-tool":'',percent:'',"phone-call":'',"phone-forwarded":'',"phone-incoming":'',"phone-missed":'',"phone-off":'',"phone-outgoing":'',phone:'',"pie-chart":'',"play-circle":'',play:'',"plus-circle":'',"plus-square":'',plus:'',pocket:'',power:'',printer:'',radio:'',"refresh-ccw":'',"refresh-cw":'',repeat:'',rewind:'',"rotate-ccw":'',"rotate-cw":'',rss:'',save:'',scissors:'',search:'',send:'',server:'',settings:'',"share-2":'',share:'',"shield-off":'',shield:'',"shopping-bag":'',"shopping-cart":'',shuffle:'',sidebar:'',"skip-back":'',"skip-forward":'',slack:'',slash:'',sliders:'',smartphone:'',smile:'',speaker:'',square:'',star:'',"stop-circle":'',sun:'',sunrise:'',sunset:'',table:'',tablet:'',tag:'',target:'',terminal:'',thermometer:'',"thumbs-down":'',"thumbs-up":'',"toggle-left":'',"toggle-right":'',tool:'',"trash-2":'',trash:'',trello:'',"trending-down":'',"trending-up":'',triangle:'',truck:'',tv:'',twitch:'',twitter:'',type:'',umbrella:'',underline:'',unlock:'',"upload-cloud":'',upload:'',"user-check":'',"user-minus":'',"user-plus":'',"user-x":'',user:'',users:'',"video-off":'',video:'',voicemail:'',"volume-1":'',"volume-2":'',"volume-x":'',volume:'',watch:'',"wifi-off":'',wifi:'',wind:'',"x-circle":'',"x-octagon":'',"x-square":'',x:'',youtube:'',"zap-off":'',zap:'',"zoom-in":'',"zoom-out":''}},function(e){e.exports={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"}},function(e,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var t=Object.assign||function(e){for(var n=1;n2&&void 0!==arguments[2]?arguments[2]:[];!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),this.name=n,this.contents=i,this.tags=l,this.attrs=t({},o.default,{class:"feather feather-"+n})}return l(e,[{key:"toSvg",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return""+this.contents+""}},{key:"toString",value:function(){return this.contents}}]),e}();n.default=c},function(e,n,i){"use strict";var t=o(i(12)),l=o(i(39)),r=o(i(38));function o(e){return e&&e.__esModule?e:{default:e}}e.exports={icons:t.default,toSvg:l.default,replace:r.default}},function(e,n,i){e.exports=i(0)},function(e,n,i){var t=i(2)("iterator"),l=!1;try{var r=0,o={next:function(){return{done:!!r++}},return:function(){l=!0}};o[t]=function(){return this},Array.from(o,function(){throw 2})}catch(e){}e.exports=function(e,n){if(!n&&!l)return!1;var i=!1;try{var r={};r[t]=function(){return{next:function(){return{done:i=!0}}}},e(r)}catch(e){}return i}},function(e,n,i){var t=i(30),l=i(2)("toStringTag"),r="Arguments"==t(function(){return arguments}());e.exports=function(e){var n,i,o;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(i=function(e,n){try{return e[n]}catch(e){}}(n=Object(e),l))?i:r?t(n):"Object"==(o=t(n))&&"function"==typeof n.callee?"Arguments":o}},function(e,n,i){var t=i(47),l=i(9),r=i(2)("iterator");e.exports=function(e){if(void 0!=e)return e[r]||e["@@iterator"]||l[t(e)]}},function(e,n,i){"use strict";var t=i(18),l=i(7),r=i(10);e.exports=function(e,n,i){var o=t(n);o in e?l.f(e,o,r(0,i)):e[o]=i}},function(e,n,i){var t=i(2),l=i(9),r=t("iterator"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(l.Array===e||o[r]===e)}},function(e,n,i){var t=i(3);e.exports=function(e,n,i,l){try{return l?n(t(i)[0],i[1]):n(i)}catch(n){var r=e.return;throw void 0!==r&&t(r.call(e)),n}}},function(e,n){e.exports=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e}},function(e,n,i){var t=i(52);e.exports=function(e,n,i){if(t(e),void 0===n)return e;switch(i){case 0:return function(){return e.call(n)};case 1:return function(i){return e.call(n,i)};case 2:return function(i,t){return e.call(n,i,t)};case 3:return function(i,t,l){return e.call(n,i,t,l)}}return function(){return e.apply(n,arguments)}}},function(e,n,i){"use strict";var t=i(53),l=i(24),r=i(51),o=i(50),a=i(27),c=i(49),p=i(48);e.exports=function(e){var n,i,y,h,x=l(e),s="function"==typeof this?this:Array,u=arguments.length,d=u>1?arguments[1]:void 0,f=void 0!==d,g=0,v=p(x);if(f&&(d=t(d,u>2?arguments[2]:void 0,2)),void 0==v||s==Array&&o(v))for(i=new s(n=a(x.length));n>g;g++)c(i,g,f?d(x[g],g):x[g]);else for(h=v.call(x),i=new s;!(y=h.next()).done;g++)c(i,g,f?r(h,d,[y.value,g],!0):y.value);return i.length=g,i}},function(e,n,i){var t=i(32),l=i(54);t({target:"Array",stat:!0,forced:!i(46)(function(e){Array.from(e)})},{from:l})},function(e,n,i){var t=i(6),l=i(3);e.exports=function(e,n){if(l(e),!t(n)&&null!==n)throw TypeError("Can't set "+String(n)+" as a prototype")}},function(e,n,i){var t=i(56);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,n=!1,i={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(i,[]),n=i instanceof Array}catch(e){}return function(i,l){return t(i,l),n?e.call(i,l):i.__proto__=l,i}}():void 0)},function(e,n,i){var t=i(0).document;e.exports=t&&t.documentElement},function(e,n,i){var t=i(28),l=i(13);e.exports=Object.keys||function(e){return t(e,l)}},function(e,n,i){var t=i(8),l=i(7),r=i(3),o=i(59);e.exports=t?Object.defineProperties:function(e,n){r(e);for(var i,t=o(n),a=t.length,c=0;a>c;)l.f(e,i=t[c++],n[i]);return e}},function(e,n,i){var t=i(3),l=i(60),r=i(13),o=i(15),a=i(58),c=i(34),p=i(16)("IE_PROTO"),y=function(){},h=function(){var e,n=c("iframe"),i=r.length;for(n.style.display="none",a.appendChild(n),n.src=String("javascript:"),(e=n.contentWindow.document).open(),e.write(" diff --git a/components/favicons.html b/components/favicons.html new file mode 100644 index 0000000..f843b96 --- /dev/null +++ b/components/favicons.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/components/footer.html b/components/footer.html new file mode 100644 index 0000000..e5ca808 --- /dev/null +++ b/components/footer.html @@ -0,0 +1,77 @@ + + diff --git a/components/head.html b/components/head.html new file mode 100644 index 0000000..e69de29 diff --git a/components/header.html b/components/header.html new file mode 100644 index 0000000..7d7ef22 --- /dev/null +++ b/components/header.html @@ -0,0 +1,39 @@ + + diff --git a/components/index/apropos.html b/components/index/apropos.html new file mode 100644 index 0000000..56a7f86 --- /dev/null +++ b/components/index/apropos.html @@ -0,0 +1,42 @@ + +
+
+ +

Qui sommes-nous ?

+

Une équipe passionnée dédiée à la création d'expériences RP uniques

+
+
+
+

Notre Mission

+

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.

+
+
+
50+
+
Projets réalisés
+
+
+
10K+
+
Joueurs actifs
+
+
+
+
Ans d'exp.
+
+
+
+
+
+

Notre Objectif

+

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é.

+
+
+
+
+
+ \ No newline at end of file diff --git a/components/index/contact.html b/components/index/contact.html new file mode 100644 index 0000000..e69de29 diff --git a/components/index/hero.html b/components/index/hero.html new file mode 100644 index 0000000..81f109f --- /dev/null +++ b/components/index/hero.html @@ -0,0 +1,24 @@ + +
+
+
+ Créateurs d'univers RP +
+

+ L'univers du
+ Role Play
+ réinventé +

+

Bots Discord personnalisés, maps Fortnite immersives — des expériences sur mesure pour vos communautés gaming.

+ +
+
\ No newline at end of file diff --git a/components/index/services.html b/components/index/services.html new file mode 100644 index 0000000..bf24eed --- /dev/null +++ b/components/index/services.html @@ -0,0 +1,52 @@ + +
+
+ +

Ce que nous créons

+

Des solutions complètes pour vos projets Role Play

+
+
+
+
+ +
+

Bots Discord

+

Des bots entièrement personnalisés pour animer et gérer tous vos serveurs.

+
    +
  • Systèmes d'économie avancés
  • +
  • Gestion des stats et inventaires
  • +
  • Commandes RP personnalisées
  • +
+
+
+
+ +
+

Maps Fortnite RP

+

Des environnements uniques conçus pour des sessions RP mémorables.

+
    +
  • Design d'environnement immersif
  • +
  • Scénarios narratifs intégrés
  • +
  • Optimisation performance
  • +
+
+
+
+ +
+

Créations Graphiques

+

Identité visuelle et assets graphiques pour vos projets.

+
    +
  • Logos et branding
  • +
  • Bannières et visuels
  • +
  • Assets personnalisés
  • +
+
+
+ +
\ No newline at end of file diff --git a/components/services/hero.html b/components/services/hero.html new file mode 100644 index 0000000..6d7f907 --- /dev/null +++ b/components/services/hero.html @@ -0,0 +1,10 @@ + +
+
+
+ Ce que nous proposons +
+

Nos Services

+

Des solutions complètes et sur mesure pour donner vie à vos projets Role Play les plus ambitieux.

+
+
\ No newline at end of file diff --git a/fautes_orthographe_corrigees.txt b/fautes_orthographe_corrigees.txt new file mode 100644 index 0000000..bf04560 --- /dev/null +++ b/fautes_orthographe_corrigees.txt @@ -0,0 +1,78 @@ +FAUTES D'ORTHOGRAPHE CORRIGEES SUR LE SITE OMEGAKUBE +======================================================== + +Date : 21/03/2026 +Heure : 18:01 + +FICHIERS ANALYSES : +------------------ +- index.html +- pages/services.html +- assets/js/home.js +- assets/js/pages/services.js +- assets/css/main.css +- assets/php/send_mail.php +- assets/data/services.json +- assets/data/team.json + +CORRECTIONS EFFECTUEES : +======================== + +FICHIER : assets/php/send_mail.php +---------------------------------- +1. "Non precis" → "Non précisé" + - Ligne : $body .= "Objet : " . ($data['subject'] ?? 'Non précisé') . "\n"; + - Erreur : accent manquant sur le "é" + +2. "Repondre" → "Répondre" + - Ligne : $body .= "Répondre : " . $data['email'] . "\n"; + - Erreur : accent manquant sur le "é" + +3. "Recu" → "Reçu" + - Ligne : $body .= "Reçu le : " . date('d/m/Y H:i') . "\n"; + - Erreur : accent circonflexe manquant sur le "u" + +4. "ete envoye" → "été envoyé" + - Ligne : 'message' => 'Votre message a bien été envoyé ! Nous vous répondrons rapidement.' + - Erreur : accents manquants sur les "é" + +5. "repondrons" → "répondrons" + - Ligne : 'message' => 'Votre message a bien été envoyé ! Nous vous répondrons rapidement.' + - Erreur : accent manquant sur le "é" + +FICHIER : assets/data/team.json +------------------------------ +1. "platformes" → "plateformes" + - Membre : MG + - Erreur : faute d'orthographe, "plateforme" prend un "a" + +2. "ci dessous" → "ci-dessous" + - Membre : Lowei + - Erreur : mot composé qui doit être relié par un trait d'union + +3. "horizon Et par delà" → "horizons et par-delà" + - Membre : KIRITO_KMA + - Erreurs : + * "horizon" → "horizons" (accord au pluriel) + * "Et" → "et" (minuscule en milieu de phrase) + * "par delà" → "par-delà" (trait d'union obligatoire) + +4. "toucher à tous" → "toucher à tout" + - Membre : Kayrix + - Erreur : accord du pronom indéfini "tout" (masculin singulier) + +TOTAL DES CORRECTIONS : 9 fautes corrigées +=========================================== + +TYPES D'ERREURS RENCONTREES : +---------------------------- +- Accents manquants : 6 erreurs +- Fautes d'orthographe : 1 erreur +- Traits d'union manquants : 2 erreurs +- Accords grammaticaux : 1 erreur + +ETAT FINAL : +=========== +✅ Toutes les fautes d'orthographe ont été corrigées +✅ Le site est fonctionnel avec le serveur LAMP +✅ Accès disponible via http://localhost \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..7dcbe0f --- /dev/null +++ b/index.html @@ -0,0 +1,444 @@ + + + + + + Omega Kube - L'univers du Role Play réinventé + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ Créateurs d'univers Role Play +
+

+ Le RP mérite
+ une expérience
+ de qualité +

+

Bots Discord personnalisés, maps immersives sur tout type de jeux, des expériences sur mesure pour vos communautés Role Play.

+ +
+
+ +
+
+ +

Qui sommes-nous ?

+

Une équipe passionnée dédiée à la création d'expériences RP uniques

+
+
+
+

Notre Mission

+

Omega Kube est né de la passion du Role Play et de l'envie de créer des outils innovants pour toutes les communautés. Nous développons des solutions sur mesure qui priorisent la qualité de l'expérience de jeu.

+

Notre expertise s'étend des bots Discord complexes aux environnements immersifs (Valve Hammer Éditor, UEFN, Minecraft, ...), sans oublier la création graphique. Chaque projet est une nouvelle aventure créative.

+
+
+
27+
+
Projets réalisés
+
+
+
9+
+
Supports différents
+
+
+
4
+
Ans d'exp.
+
+
+
+
+
+

Notre Objectif

+

Créer des outils permettant d'optimiser l'administration de votre serveur ainsi que des serveurs RP où la qualité est privilégiée aux statistiques, afin d'accueillir uniquement des joueurs passionnés par le Role Play.

+
+
+
+
+
+ + +
+
+ +

Ce que nous créons

+

Des solutions complètes pour vos projets Role Play

+
+
+
+
+ +
+

Bots Discord

+

Des bots entièrement personnalisés pour animer et gérer tous vos serveurs.

+
    +
  • Systèmes d'économie avancés
  • +
  • Gestion des stats et inventaires
  • +
  • Commandes RP personnalisées
  • +
+
+
+
+ +
+

Maps Jeu de rôle

+

Des environnements uniques conçus pour des sessions RP mémorables.

+
    +
  • Design d'environnement immersif
  • +
  • Scénarios narratifs intégrés
  • +
  • Optimisation performance
  • +
+
+
+
+ +
+

Créations Graphiques

+

Identité visuelle et assets graphiques pour vos projets.

+
    +
  • Logos et branding
  • +
  • Bannières et visuels
  • +
  • Assets personnalisés
  • +
+
+
+ +
+ +
+
+ +

Les créateurs

+

Cliquez sur un membre pour en savoir plus

+
+ +
+ +
+
+
+ +
+
A
+
+

Alexandre

+

Développeur Principal

+
+
+

Bio du membre...

+
+
+ +
+
+
+ +
+
+ +

Nos réalisations

+

Découvrez quelques-uns de nos projets récents

+
+
+
+ +
+ +
+
+ +

Ils nous font confiance

+

Des projets construits ensemble

+
+ +
+ +
+
+
+ +
+
+ +
+
+

+

Partenaire depuis

+
+
+

+
+
+ +
+
+
+ +
+
+
+ +

Une question avant de nous contacter ?

+

+ Nous avons rassemblé les réponses aux questions les plus fréquentes. + Consultez notre FAQ !
+ Vous y trouverez peut-être exactement ce qu'il vous faut.
+

+
+ + + Consulter la FAQ + +
+
+ +
+
+ +

Parlons de votre projet

+

Un projet RP en tête ? Contactez-nous !

+
+
+
+

Discutons ensemble

+

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.

+ +
+ +
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + +
+ + +
+
+ +
+ +
+
+ + +
+
+
+ + +
+ +
+ +
+ + + +
+
+
+
+ +
+
+
+ + + + + + diff --git a/pages/404.html b/pages/404.html new file mode 100644 index 0000000..946dea2 --- /dev/null +++ b/pages/404.html @@ -0,0 +1,73 @@ + + + + + + 404 - Page non trouvée | Omegakube + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
404
+

Dimension introuvable

+

+ Oups ! Il semblerait que vous ayez traversé un portail défectueux. + Cette page n'existe pas dans notre univers... ou peut-être a-t-elle été téléportée ailleurs ? +

+ +
+ + + + + + diff --git a/pages/404.php b/pages/404.php new file mode 100644 index 0000000..0e21ce7 --- /dev/null +++ b/pages/404.php @@ -0,0 +1,82 @@ + + + + + + + + 404 — Page non trouvée | Omega Kube + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
404
+

Dimension introuvable

+

+ Oups ! Il semblerait que vous ayez traversé un portail défectueux. + Cette page n'existe pas dans notre univers... ou peut-être a-t-elle été téléportée ailleurs ? +

+ +
+ + + + + + diff --git a/pages/cgv.html b/pages/cgv.html new file mode 100644 index 0000000..4adb036 --- /dev/null +++ b/pages/cgv.html @@ -0,0 +1,246 @@ + + + + + + Omegakube - Conditions Générales de Vente + + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+
+
+
+
+
+
+ + + + +
+
+
+
+ + +
+
+ +
+
+

Conditions Générales de Vente

+

Conditions applicables aux prestations de l'association Omega Kube

+
+
+ + + +
+ + + + + diff --git a/pages/faq.html b/pages/faq.html new file mode 100644 index 0000000..6fe4b92 --- /dev/null +++ b/pages/faq.html @@ -0,0 +1,123 @@ + + + + + + Omegakube - FAQ + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ +

Questions fréquentes

+

Tout ce que vous devez savoir avant de nous contacter.

+
+
+ +
+
+
+ +
+
+

Vous n'avez pas trouvé votre réponse ?

+

Notre équipe est disponible pour répondre à toutes vos questions spécifiques. N'hésitez pas à nous contacter directement.

+ +
+
+ +
+ + + + + diff --git a/pages/mentions-legales.html b/pages/mentions-legales.html new file mode 100644 index 0000000..011aa8a --- /dev/null +++ b/pages/mentions-legales.html @@ -0,0 +1,133 @@ + + + + + + Omegakube - Mentions Légales + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+

Mentions Légales

+

Informations légales relatives à l'association Omega Kube

+
+
+ + + +
+ + + + + diff --git a/pages/realisations.html b/pages/realisations.html new file mode 100644 index 0000000..80ba2ef --- /dev/null +++ b/pages/realisations.html @@ -0,0 +1,186 @@ + + + + + + Omegakube - Nos Réalisations + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+
+
+
+
+
+
+ + + + +
+
+
+
+ +
+ + +
+
+
+ Notre portfolio +
+

Nos Réalisations

+

Découvrez les projets que nous avons concrétisés pour nos clients et partenaires.

+
+
+ + +
+
+ +

Projets phares

+

Nos réalisations les plus marquantes

+
+ + +
+ + +
+
+ +

Tous nos projets

+

Cliquez sur un projet pour voir les détails

+
+ + +
+
+ + + + +
+
+ + +
+ +
+ + + +
+ + +
+
+ + + + +
+
+
+ Bot Discord + +
+ +
+ + + +
+ + + +
+ +
+
+
+ +
+
+
+ + +
+
+ +

Prêt à créer ensemble ?

+

Votre projet pourrait être le prochain dans notre portfolio

+
+ +
+ +
+ + + + + diff --git a/pages/services.html b/pages/services.html new file mode 100644 index 0000000..e237a48 --- /dev/null +++ b/pages/services.html @@ -0,0 +1,155 @@ + + + + + + Omegakube - Nos Services + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+
+ +

Comment ça marche ?

+

Un accompagnement clair et structuré, de l'idée à la livraison

+
+ +
+
+
+ +
+
+

Contact

+

Discutons de votre projet et de vos besoins

+
+
+ +
+
+ +
+
+

Devis

+

Proposition détaillée et validation ensemble

+
+
+ +
+
+ +
+
+

Création

+

Développement avec suivi régulier

+
+
+ +
+
+ +
+
+

Livraison

+

Tests, ajustements et support inclus

+
+
+
+
+ + +
+
+ +

Choisissez votre service

+

Cliquez sur un service pour découvrir tous les détails

+
+ +
+ +
+ + +
+
+
+ + +
+
+ +

Pourquoi nous choisir ?

+

Ce qui fait la différence Omega Kube

+
+ +
+
+
+ +
+

Expertise RP

+

5 ans d'expérience dans l'écosystème Role Play. Nous connaissons vos besoins car nous sommes aussi des joueurs.

+
+
+
+ +
+

Accompagnement continu

+

Communication régulière pendant le développement. Vous suivez l'avancement et validez chaque étape.

+
+
+
+ +
+

Support inclus

+

Maintenance et assistance après livraison. Nous restons disponibles pour les ajustements et questions.

+
+
+
+ + +
+
+ +

Discutons de votre projet

+

Contactez-nous pour un devis gratuit et personnalisé

+
+ +
+ +
+ + + + + + \ No newline at end of file