diff --git a/.gitignore b/.gitignore index 4c7caed..5a098f9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +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 index 84ad129..89673b5 100644 --- a/.htaccess +++ b/.htaccess @@ -1,25 +1,125 @@ -# Désactiver l'affichage des dossiers +# ---------------------------------------------------------------------- +# 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 - # Force HTTPS (décommenter en production) - # RewriteCond %{HTTPS} off - # RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + # 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] - # Si le fichier ou dossier demandé n'existe pas → 404 + # 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] - # Dossier sans index → 404 + # 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] -# Page d'erreur Apache native (fallback si mod_rewrite absent) +# 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 index 35f6572..ef41e33 100644 --- a/README.md +++ b/README.md @@ -59,8 +59,8 @@ website/ │ │ ├── social/ # Icônes réseaux gaming (fortnite.svg, epicgames.svg) │ │ └── favicon/ │ ├── fonts/ # OmegaLarge, OmegaSmall, Montserrat -│ └── php/ -│ └── send_mail.php # Formulaire de contact (JSON POST) +│ └── python/ +│ └── send_mail.py # Formulaire de contact CGI (JSON POST) ``` --- @@ -212,8 +212,8 @@ Les icônes sont issues de [Feather Icons](https://feathericons.com/). ## 🌐 Déploiement -- **Serveur** : PHP requis uniquement pour `404.php` et `send_mail.php` -- **Contact** : configurer l'adresse email destinataire dans `assets/php/send_mail.php` (`$to`) +- **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 @@ -245,7 +245,7 @@ Toutes les couleurs sont des variables CSS définies dans `main.css`. Les textes |---|---| | HTML5 / CSS3 | Structure et styles, thème dark/light | | JavaScript ES6+ | Logique, composants, données JSON | -| PHP | Formulaire de contact, page 404 | +| 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 | 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/legal.css b/assets/css/legal.css index 3322083..8459e8a 100644 --- a/assets/css/legal.css +++ b/assets/css/legal.css @@ -1,33 +1,46 @@ -/* assets/css/legal.css - minimal rules for legal pages */ - -/* Layout background patterns */ -.geo-bg { position:absolute; inset:0; background:radial-gradient(#0f1724 0%, transparent 40%); z-index:0; } -.grid-pattern { position:absolute; inset:0; background-image: repeating-linear-gradient(45deg, rgba(255,255,255,0.02) 0 1px, transparent 1px 20px); z-index:0; } +/* assets/css/legal.css - styles pour les pages légales */ /* Hero */ -.page-hero { display:flex; align-items:center; justify-content:center; padding:3rem 1rem; background:var(--hero-bg); color:var(--text-on-hero); } -.page-hero .hero-content { max-width:1100px; text-align:center; } +.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 (text-first layout) */ -.legal-content { padding:2.25rem 1rem; background:transparent; color:var(--text); } -.legal-container { max-width:900px; margin:0 auto; display:block; } -.legal-section { margin-bottom:1.25rem; } -.legal-section h2 { font-size:1.1rem; margin:0 0 .5rem 0; font-weight:700; display:block; } -.legal-card { background:transparent; padding:0; border-radius:0; box-shadow:none; border:none; } -.legal-card p, .legal-card ul { margin:0 0 .75rem 0; line-height:1.6; color:var(--text); } -.page-hero { padding:1.5rem 1rem; background:transparent; color:var(--text); text-align:left; } -.page-hero .hero-content h1 { font-size:1.6rem; margin-bottom:.25rem; } -.page-hero .hero-content p { margin:0 0 .5rem 0; } - - -/* Footer */ -footer .footer-content { display:flex; gap:1rem; flex-wrap:wrap; align-items:center; } -.footer-bottom { text-align:center; padding:1rem 0; font-size:.9rem; } - -/* Nav / responsive */ -#navbar.scrolled { backdrop-filter: blur(4px); box-shadow:0 6px 18px rgba(2,6,23,.12); } -.nav-links { display:flex; gap:1rem; list-style:none; } -.nav-links a.active, .nav-links a[aria-current="true"] { font-weight:700; color:var(--accent); } -.nav-links.active { display:block; } -.mobile-toggle { display:none; /* show via media query */ } -@media (max-width:880px) { .nav-links { display:none; } .mobile-toggle { display:block; } } +/* 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 index bb4669d..04a081a 100644 --- a/assets/css/main.css +++ b/assets/css/main.css @@ -264,8 +264,11 @@ nav.scrolled { } .logo-icon img { - width: 100%; - height: 100%; + display: block; + max-width: 100%; + max-height: 100%; + width: auto; + height: auto; object-fit: contain; } diff --git a/assets/data/team.json b/assets/data/team.json index 77a4cb7..c30975a 100644 --- a/assets/data/team.json +++ b/assets/data/team.json @@ -1,226 +1,264 @@ -[ - { - "id": "534003230435442690", - "name": "Nixfix", - "role": "Directeur", - "avatar": "N", - "bio": "Président de l'association et cordinateur 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": "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": "" - } - } +[ + { + "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/images/favicon/site.webmanifest b/assets/images/favicon/site.webmanifest index 45dc8a2..2c53093 100644 --- a/assets/images/favicon/site.webmanifest +++ b/assets/images/favicon/site.webmanifest @@ -1 +1,13 @@ -{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file +{ + "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/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(" - -
@@ -144,7 +146,6 @@
-
@@ -153,8 +154,7 @@
-
@@ -189,7 +188,6 @@
-
@@ -197,8 +195,7 @@

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

- -
+
-
@@ -216,12 +212,10 @@
-
-
-

${item.a}

+

${window.escapeHTML(item.a)}

`).join('')} diff --git a/pages/mentions-legales.html b/pages/mentions-legales.html index 77ce863..011aa8a 100644 --- a/pages/mentions-legales.html +++ b/pages/mentions-legales.html @@ -3,10 +3,22 @@ - Mentions Légales — Omega Kube - + Omegakube - Mentions Légales + + + + + + + + + + + + + - + @@ -117,27 +129,5 @@ - diff --git a/pages/realisations.html b/pages/realisations.html index de22fab..80ba2ef 100644 --- a/pages/realisations.html +++ b/pages/realisations.html @@ -3,8 +3,20 @@ - Nos Réalisations — Omega Kube - + Omegakube - Nos Réalisations + + + + + + + + + + + + + - - - -
-
-

Kuby API Dashboard

-
- Affiche les réponses de l’API Flask: /api/status, /api/user/&​lt;id&​gt;, /api/guilds, /api/guild/&​lt;id&​gt; -
-
-
- -
-
-
-

- Statut du bot - non chargé -

-
- - Affiche le statut global. -
-
{}
-
- -
-

- Rechercher un utilisateur - /api/user/&​lt;id&​gt; -

-
- - -
- - - -
{}
-
- -
-

- Serveurs du bot - /api/guilds -

-
- - Clique un serveur pour charger ses détails. -
- -
- -
{}
-
- -
-

- Détails d’un serveur - /api/guild/&​lt;id&​gt; -

-
- - - Astuce: tu peux aussi cliquer un serveur dans la liste au-dessus. -
- - - -
{}
-
-
-
- - - - \ No newline at end of file