31 Commits
Author SHA1 Message Date
cedric 4d6a94e251 fix: remove cdn 2026-07-22 21:22:56 +04:00
cedric f0fd5eeca1 fix: npm audit fix 2026-07-22 21:22:36 +04:00
cedric 1b05d2f9a4 chore: change la licence 2026-07-22 21:22:22 +04:00
cedric bb680f60b0 Revert "feat: servir les images via le CDN BunnyCDN"
This reverts commit 58dd9297e0.
2026-07-22 21:12:34 +04:00
cedric d0fc7207f2 typo 2026-07-13 23:07:45 +04:00
cedric 66da280a50 typo: correction des liens des partenaires + ajout d'autres plateformes 2026-07-13 21:39:48 +04:00
cedric 742a275958 fix(hero): retire l'effet machine à écrire sur INTERNATIONALE 2026-07-13 21:30:31 +04:00
cedric e3b562afcf fix(nav): synchronise les fermetures du menu burger (lien, clic extérieur) avec les classes CSS 2026-07-13 21:26:33 +04:00
cedric 284e29f6d5 fix(nav): corrige le menu mobile invisible après fermeture puis agrandissement 2026-07-13 19:19:00 +04:00
cedric 2f16ccb4b8 fix(nav): fait apparaître le burger dès 1100px pour éviter un menu tassé 2026-07-13 19:13:54 +04:00
cedric 4307c80bd6 feat: add more links in partners 2026-07-13 19:13:09 +04:00
cedric 17540980af feat: remonte Partenaires en item principal du menu, aligné sur l'ordre de la page 2026-07-13 19:09:56 +04:00
cedric da094adaad feat: place la section Partenaires avant DJANGOKAM 2026-07-13 19:05:20 +04:00
cedric 5f5e581d99 feat: permet plusieurs liens par partenaire 2026-07-13 18:57:44 +04:00
cedric 851b03c60b feat: remonte la section Partenaires et rend le lien de plateforme dynamique par partenaire 2026-07-13 18:52:47 +04:00
cedric db5fc5240c fix: réintègre la section Partenaires manquante de l'accueil 2026-07-13 18:49:00 +04:00
cedric 1644d2606f docs: mise à jour de la documentation suite aux évolutions récentes
- README.md : services, projets, liens sociaux, structure, sécurité et copyright 2026
- CHANGELOG.md : ajout d'une section Unreleased (headers HTTP, HTTPS, CSP, FEDIVERSE.OKI, réseaux sociaux, o2switch)
- CONTRIBUTING.md : correction des exemples, ajout du filtre CDN et note sécurité
- SEO.md : plateformes sociales et checklist HTTPS/hreflang à jour
2026-07-09 03:37:51 +04:00
cedric d3afa0ca1d fix(contact): lien Labola vers l'organisation
- Met à jour le lien Labola de la section Code & Développement vers l'organisation Gitea
2026-07-09 03:31:27 +04:00
cedric de4fd1d54c fix(footer): lien Labola vers le dépôt du site
- Remplace le lien générique Labola par le repo o-k-i.net
2026-07-09 03:30:43 +04:00
cedric b650a52591 fix(footer): retire Telegram et remet WhatsApp comme contact
- Supprime le lien Telegram du footer
- Rétablit le lien WhatsApp de contact (wa.me) dans le footer
2026-07-09 03:28:33 +04:00
cedric 1189141937 fix(contact/footer): distingue les chaînes PAWOL.NU et met à jour WhatsApp
- Met à jour le lien WhatsApp vers la chaîne publique
- Regroupe WhatsApp et Telegram sous une section Chaînes PAWOL.NU
- Affiche les titres de section dans la page contact pour distinguer les chaînes
- Met à jour les tooltips du footer pour indiquer les chaînes PAWOL.NU
2026-07-09 02:38:30 +04:00
cedric e2df9c0501 fix(legal): remplace OVH par o2switch dans les mentions légales
- Met à jour l'hébergeur et l'adresse postale en français et en anglais
2026-07-09 02:26:28 +04:00
cedric 964149e0bb fix(footer): année du copyright dynamique à la génération du site
- Remplace l'année en dur par un shortcode Eleventy {% year %}
- Supprime le champ copyright obsolète des JSON i18n
2026-07-09 02:17:53 +04:00
cedric 46a039d2d2 fix(contact/footer): retire X (Twitter) et TikTok des contacts et du footer
- Supprime X et TikTok des JSON de contact (FR/EN)
- Retire les liens X et TikTok du footer
- Supprime les branches de rendu d'icônes X et TikTok dans contact.njk
2026-07-08 23:27:19 +04:00
cedric c27f37f979 fix(contact/footer): retire Stoat des contacts et du footer
- Supprime l'entrée Stoat des JSON de contact (FR/EN)
- Retire le lien Stoat du footer
- Supprime la branche de rendu d'icône Stoat dans contact.njk
2026-07-08 23:16:27 +04:00
cedric 6559ac39a4 fix(contact/footer): met à jour le lien d'invitation Discord 2026-07-08 11:48:16 +04:00
cedric f1a9fa63e0 fix(clients): récupère les logos distants en local et sert via le CDN
- Télécharge les logos de kaubuntu.com, kaubuntu.re et kbm.gp
- Les place dans src/assets/images/clients/
- Met à jour les JSON FR/EN pour utiliser les chemins locaux
- Applique le filtre cdn dans le template clients.njk
2026-07-08 07:49:39 +04:00
cedric 646d3b676f feat(projects): ajoute FEDIVERSE.OKI dans la section projets
- Ajoute la fiche fediverse.o-k-i.net en FR et EN
- Description basée sur le README du dépôt FEDIVERSE-OKI
2026-07-08 07:38:52 +04:00
cedric 37eeee07dd fix(redirection): redirige HTTP vers HTTPS via .htaccess
- Ajoute les règles mod_rewrite pour forcer HTTPS
- Gère les reverse proxies via X-Forwarded-Proto
- Exclut le chemin Let's Encrypt .well-known/acme-challenge
2026-07-07 23:59:52 +04:00
cedric 36d1e307bd security(headers): ajoute les en-têtes HTTP de sécurité et refactorise les scripts inline pour CSP
- Ajoute .htaccess avec HSTS, CSP, X-Frame-Options, X-Content-Type-Options,
  Referrer-Policy et Permissions-Policy
- Déplace les scripts inline (thème, redirection de langue) vers des fichiers JS externes
- Remplace les onclick inline par des écouteurs d'événements dans main.js
- Configure Eleventy pour copier .htaccess à la racine du site
2026-07-07 23:56:56 +04:00
cedric 8dac00d692 feat: page de dons bilingue et retrait de la section de l'accueil 2026-07-07 11:13:47 +04:00
44 changed files with 533 additions and 324 deletions
+20
View File
@@ -1,5 +1,25 @@
# Changelog
## [Unreleased]
### 🛡️ Sécurité
-**Headers HTTP de sécurité** : ajout d'un `.htaccess` Apache avec `Strict-Transport-Security`, `Content-Security-Policy`, `X-Frame-Options`, `X-Content-Type-Options`, `Referrer-Policy` et `Permissions-Policy`
-**Redirection HTTP → HTTPS** : forçage du HTTPS via `mod_rewrite`
-**CSP stricte** : refactorisation des scripts inline en fichiers externes et suppression des gestionnaires `onclick` inline
### 🎬 Contenu
-**Nouveau projet** : ajout de `FEDIVERSE.OKI` dans la section projets
-**Logos clients** : récupération locale des logos distants et service via le CDN
-**Réseaux sociaux** : mise à jour du lien Discord, retrait de Stoat, X (Twitter) et TikTok
-**Chaînes PAWOL.NU** : distinction visuelle dans la page contact entre les chaînes WhatsApp/Telegram et les autres moyens de contact
-**Mentions légales** : hébergeur mis à jour (OVH → o2switch)
-**Footer** : année du copyright générée automatiquement via un shortcode Eleventy
-**Liens Labola** : lien footer vers le dépôt du site, lien contact vers l'organisation Gitea
### 🔧 Technique
- ✅ Shortcode Eleventy `{% year %}` pour l'année en cours
- ✅ Événements JS attachés dans `main.js` pour les accordéons FAQ et les dons personnalisés
## Version 2.1.0 - Design Afrofuturisme Caribéen (2025-11-05)
### 🌓 Système de Thème Clair/Sombre
+43 -30
View File
@@ -1,17 +1,16 @@
# Guide de contribution
Merci de votre intérêt pour contribuer au site dE l'ORGANISATION KA INTERNATIONALE !
Merci de votre intérêt pour contribuer au site de l'ORGANISATION KA INTERNATIONALE !
## Ajouter du contenu
### Ajouter un service Fédiverse
### Ajouter un service hébergé
Éditez `src/_data/services.json` :
Éditez `src/_data/i18n/fr/services.json` (et la version `en/`) :
```json
{
"name": "NOM_DU_SERVICE",
"icon": "🎯",
"platform": "Nom de la plateforme",
"description": "Description du service",
"url": "https://service.o-k-i.net/",
@@ -21,20 +20,25 @@ Merci de votre intérêt pour contribuer au site dE l'ORGANISATION KA INTERNATIO
### Ajouter un projet web
Éditez `src/_data/projects.json` :
Éditez `src/_data/i18n/fr/projects.json` (et la version `en/`) :
```json
{
"name": "NOM.PROJET",
"icon": "📱",
"domain": "nom.projet",
"description": "Description du projet"
"description": "Description du projet",
"url": "https://nom.projet/"
}
```
### Ajouter un client ou partenaire
Pour les logos, privilégiez une image locale dans `src/assets/images/` et utilisez le filtre `| cdn` dans les templates. Les URLs distantes fonctionnent mais ne passent pas par le CDN.
### Ajouter une valeur
Éditez `src/_data/values.json` :
Éditez `src/_data/i18n/fr/values.json` (et la version `en/`) :
```json
{
@@ -46,7 +50,7 @@ Merci de votre intérêt pour contribuer au site dE l'ORGANISATION KA INTERNATIO
### Modifier la navigation
Éditez `src/_data/navigation.json` :
Éditez `src/_data/i18n/fr/navigation.json` (et la version `en/`) :
```json
{
@@ -58,18 +62,15 @@ Merci de votre intérêt pour contribuer au site dE l'ORGANISATION KA INTERNATIO
Pour un lien externe, mettez `"external": true`.
### Ajouter une section de contact
### Modifier les informations de contact
Éditez `src/_data/contact.json` :
Les liens de contact sont regroupés par section dans `src/_data/i18n/fr/contact.json` (et la version `en/`). L'icône affichée est déterminée automatiquement à partir du texte du lien (`whatsapp`, `telegram`, `discord`, `labola`, `kontak`/`mail`).
```json
{
"title": "🔗 Titre de la section",
"title": "💬 Communauté",
"links": [
{
"text": "Nom du lien",
"url": "https://example.com"
}
{ "text": "Discord", "url": "https://discord.gg/DPvUCA8dD" }
]
}
```
@@ -78,17 +79,19 @@ Pour un lien externe, mettez `"external": true`.
Les styles sont dans `src/assets/css/styles.css`.
### Variables CSS disponibles
### Variables CSS principales
```css
--bleu-ocean: #003566;
--jaune-soleil: #FFB700;
--rouge-resistance: #D62828;
--vert-terre: #2A9134;
--orange-communaute: #FB8500;
--noir-profond: #0A0908;
--blanc-lumiere: #F7F7F2;
--violet-fedi: #6364FF;
--or-oki: #E8A625;
--noir-oki: #000000;
--vert-oki: #00A854;
--rouge-oki: #ED1C4C;
--blanc-creme: #F7F7F2;
--noir-profond: #1A1A1A;
--gris-sombre: #2A2A2A;
--or-clair: #F5BD4F;
--vert-clair: #00C569;
--rouge-clair: #FF2D5F;
```
## Créer une nouvelle page
@@ -108,9 +111,11 @@ description: Description pour le SEO
</section>
```
2. Ajoutez le lien dans `src/_data/navigation.json` si nécessaire
2. Ajoutez le lien dans `src/_data/i18n/fr/navigation.json` (et `en/`) si nécessaire.
3. Reconstruisez le site : `npm run build`
3. Mettez à jour `src/sitemap.xml`.
4. Reconstruisez le site : `npm run build`.
## Modifier un partial
@@ -118,11 +123,15 @@ Les partials sont dans `src/_includes/partials/` :
- `nav.njk` - Navigation
- `hero.njk` - Section hero (accueil)
- `fediverse.njk` - Services Fédiverse
- `services.njk` - Services hébergés
- `projects.njk` - Projets web
- `mission.njk` - Mission et valeurs
- `hosting.njk` - Services d'hébergement
- `support.njk` - Section dons
- `clients.njk` - Clients / organisations ayant fait confiance
- `partners.njk` - Partenaires
- `faq.njk` - Questions fréquentes
- `engagement.njk` - Appels à l'action
- `contact.njk` - Informations de contact
- `footer.njk` - Pied de page
@@ -133,7 +142,7 @@ Les partials sont dans `src/_includes/partials/` :
git checkout -b feature/ma-fonctionnalite
```
2. Faites vos modifications
2. Faites vos modifications.
3. Testez localement :
```bash
@@ -151,7 +160,7 @@ Les partials sont dans `src/_includes/partials/` :
git commit -m "Description de vos changements"
```
6. Poussez et créez une pull request :
6. Poussez et créez une merge request :
```bash
git push origin feature/ma-fonctionnalite
```
@@ -174,6 +183,10 @@ Les partials sont dans `src/_includes/partials/` :
- Commentaires en français
- Gestion des erreurs
### Sécurité
- Ne pas ajouter de scripts inline sans ajuster la CSP dans `src/.htaccess`.
- Conserver les headers de sécurité lors d'une modification du serveur.
## Questions ?
Contactez-nous à kontak@o-k-i.net ou ouvrez une issue sur Codeberg.
Contactez-nous à kontak@o-k-i.net ou ouvrez une issue sur [Labola](https://labola.o-k-i.net/ORGANISATION-KA-INTERNATIONALE/o-k-i.net).
+40 -21
View File
@@ -1,6 +1,6 @@
# o-k-i.net V2
Site web officiel de **ORGANISATION KA INTERNATIONALE (OKI)** - Version 2 construite avec 11ty (Eleventy).
Site web officiel de **ORGANISATION KA INTERNATIONALE (OKI)** - Version 2 construite avec 11ty (Eleventy).
## À propos
@@ -16,6 +16,7 @@ Pas aux GAFAM qui en font leur business. Pas d'algorithmes aveugles, pas de cens
- **Nunjucks** - Moteur de templates
- **CSS personnalisé** - Sans framework
- **JavaScript Vanilla** - Interactions et animations
- **Apache `.htaccess`** - Headers de sécurité et redirection HTTPS
## Structure du projet
@@ -23,14 +24,17 @@ Pas aux GAFAM qui en font leur business. Pas d'algorithmes aveugles, pas de cens
o-k-i.net-V2/
├── src/
│ ├── _data/ # Données JSON (services, projets, valeurs, etc.)
│ │ └── i18n/ # Fichiers de traduction FR/EN
│ ├── _includes/
│ │ ├── layouts/ # Layouts de base
│ │ └── partials/ # Composants réutilisables
│ ├── assets/
│ │ ├── css/ # Feuilles de style
│ │ ├── js/ # Scripts JavaScript
│ │ └── images/ # Images
── index.njk # Page d'accueil
│ │ └── images/ # Images (logos, clients, etc.)
── .htaccess # Headers de sécurité et rewrite rules
│ ├── index.njk # Page d'accueil
│ └── mentions-legales.njk
├── _site/ # Site généré (git ignoré)
├── eleventy.config.js # Configuration 11ty
└── package.json
@@ -40,8 +44,8 @@ o-k-i.net-V2/
```bash
# Cloner le dépôt
git clone https://codeberg.org/OKI/o-k-i.net-V2.git
cd o-k-i.net-V2
git clone https://labola.o-k-i.net/ORGANISATION-KA-INTERNATIONALE/o-k-i.net.git
cd o-k-i.net
# Installer les dépendances
npm install
@@ -69,16 +73,21 @@ npm run build
### Modifier les données
Les données du site sont organisées dans `src/_data/` :
Les données du site sont organisées dans `src/_data/i18n/fr/` et `src/_data/i18n/en/` :
- `site.json` - Informations générales du site
- `services.json` - Services Fédiverse (KUTE, GADE, BOKANTAJ, MIZIK)
- `projects.json` - Projets web (FEDIVERSE OKI, OKI.RE, NUVEL.NU, JWE.OVH, GONG.GP)
- `partners.json` - Partenaires (Joukawouvè, Aktivist Vybz #AKV)
- `services.json` - Services hébergés (BOKANTE, GADE, NIYAJ, KUTE)
- `projects.json` - Projets web (PAWOL.NU, GONG.GP, FEDIVERSE.OKI)
- `partners.json` - Partenaires (Joukawouvè, cyber-mawonaj, Aktivist Vybz #AKV)
- `clients.json` - Clients / organisations ayant fait confiance à OKI
- `values.json` - Valeurs de l'organisation
- `contact.json` - Informations de contact
- `contact.json` - Informations de contact (groupées par section)
- `navigation.json` - Liens de navigation
### Images et CDN
Les images locales placées dans `src/assets/images/` sont automatiquement copiées dans `_site/assets/images/`. Le filtre `| cdn` appliqué dans les templates préfixe les chemins commençant par `/` avec l'URL du pull zone BunnyCDN définie dans `src/_data/cdn.json`.
### Modifier les styles
Les styles sont dans `src/assets/css/styles.css`. La charte graphique est basée sur les couleurs du logo officiel d'OKI :
@@ -104,6 +113,7 @@ Les styles sont dans `src/assets/css/styles.css`. La charte graphique est basée
## Fonctionnalités
- ✅ Design responsive et moderne
- ✅ Bilingue FR/EN
- ✅ Animations fluides
- ✅ Navigation mobile
- ✅ Scroll smooth
@@ -112,14 +122,18 @@ Les styles sont dans `src/assets/css/styles.css`. La charte graphique est basée
- ✅ Performance optimisée
- ✅ Logo et favicon intégrés
- ✅ Charte graphique basée sur le logo officiel
- ✅ Headers de sécurité HTTP (CSP, HSTS, XFO, etc.)
- ✅ Redirection automatique HTTP → HTTPS
- ✅ Année du footer générée automatiquement
### SEO & Référencement
- ✅ Meta tags Open Graph (Facebook, LinkedIn)
- ✅ Twitter Cards
- ✅ Twitter / X Cards
- ✅ JSON-LD Structured Data (Schema.org)
- ✅ Sitemap.xml
- ✅ Robots.txt
- ✅ Balises canonical
- ✅ Hreflang FR/EN
- ✅ Meta description personnalisées
- ✅ Mots-clés pertinents
@@ -127,19 +141,20 @@ Les styles sont dans `src/assets/css/styles.css`. La charte graphique est basée
1. **Hero** - Présentation de l'organisation avec accroche percutante
2. **Solutions** - Segmentation par public (associations, entreprises, citoyens)
3. **Fédiverse** - Services alternatifs (GADE, BOKANTAJ, MIZIK, KUTE)
4. **Projets Web** - Nos projets (FEDIVERSE OKI, OKI.RE, NUVEL.NU, JWE.OVH, GONG.GP)
3. **Services hébergés** - Alternatives libres (BOKANTE, GADE, NIYAJ, KUTE)
4. **Projets Web** - Nos projets (PAWOL.NU, GONG.GP, FEDIVERSE.OKI)
5. **Mission** - Valeurs et objectifs avec message anti-GAFAM
6. **Hébergement** - Services d'hébergement et infrastructure
7. **Support** - Options de dons (Stripe, Liberapay, Ko-fi)
8. **Partenaires** - Joukawouvè, cyber-mawonaj, Aktivist Vybz #AKV
9. **FAQ** - Questions fréquentes avec storytelling sur le nom "Ka"
10. **Engagement** - Formulaire de contact et appels à l'action
11. **Contact** - Liens vers réseaux sociaux et plateformes
9. **Ils nous ont fait confiance** - KA Ubuntu, KBM
10. **FAQ** - Questions fréquentes avec storytelling sur le nom "Ka"
11. **Engagement** - Appels à l'action
12. **Contact** - Email, WhatsApp, Discord, chaînes PAWOL.NU, Labola
## Contribution
Les contributions sont les bienvenues ! N'hésitez pas à ouvrir une issue ou une pull request sur [Codeberg](https://codeberg.org/OKI/o-k-i.net-V2).
Les contributions sont les bienvenues ! N'hésitez pas à ouvrir une issue ou une pull request sur [Labola](https://labola.o-k-i.net/ORGANISATION-KA-INTERNATIONALE/o-k-i.net).
## Licence
@@ -154,14 +169,18 @@ La licence AGPL-V3 est une licence de logiciel libre qui garantit :
Voir le fichier [LICENSE](LICENSE) pour plus de détails ou consultez : https://www.gnu.org/licenses/agpl-3.0.html
© 2024 ORGANISATION KA INTERNATIONALE
© 2026 ORGANISATION KA INTERNATIONALE
## Liens
- 🌐 [Site web](https://o-k-i.net)
- 📺 [GADE (PeerTube)](https://gade.o-k-i.net/)
- 🐦 [BOKANTAJ (Pleroma)](https://bokantaj.o-k-i.net/)
- 🎵 [MIZIK (Funkwhale)](https://mizik.o-k-i.net/library)
- 🐘 [BOKANTE (Mastodon)](https://bokante.o-k-i.net/)
- ☁️ [NIYAJ (Nextcloud)](https://niyaj.o-k-i.net/)
- 🎙️ [KUTE (Castopod)](https://kute.o-k-i.net/)
- 💻 [Codeberg](https://codeberg.org/OKI)
- 💬 [Discord](https://discord.gg/DPvUCA8dD)
- 📱 [WhatsApp](https://wa.me/262692229740)
- 📢 [Chaîne WhatsApp PAWOL.NU](https://whatsapp.com/channel/0029VbCv7N9AjPXTxygrRu1w)
- ✈️ [Chaîne Telegram PAWOL.NU](https://t.me/OrganisationKA)
- 💻 [Labola (Gitea)](https://labola.o-k-i.net/ORGANISATION-KA-INTERNATIONALE)
- 📧 kontak@o-k-i.net
+4 -3
View File
@@ -70,7 +70,7 @@ Données structurées conformes à Schema.org pour améliorer l'affichage dans l
- Description
- Adresse physique (Basse-Terre, Guadeloupe)
- Email de contact
- Liens vers les plateformes sociales (GADE, BOKANTAJ, MIZIK, KUTE, Codeberg, Liberapay)
- Liens vers les plateformes sociales (GADE, BOKANTE, NIYAJ, KUTE, Discord, Labola, Liberapay)
- Statut : Organisation à but non lucratif
## 🔍 Optimisations par page
@@ -182,7 +182,8 @@ curl http://localhost:8080/ | grep -E "(og:|twitter:)"
- [x] Logo haute résolution (512x512)
- [ ] Images avec attributs alt
- [ ] Performance optimale (Lighthouse score)
- [ ] Mobile-friendly (déjà responsive)
- [ ] HTTPS activé configurer en production)
- [x] Mobile-friendly (déjà responsive)
- [x] HTTPS activé et HSTS configuré
- [x] Hreflang FR/EN pour les versions multilingues
- [ ] Google Search Console configuré
- [ ] Analytics installé (optionnel, respectueux RGPD)
+6 -8
View File
@@ -1,5 +1,3 @@
const cdn = require("./src/_data/cdn.json");
module.exports = function(eleventyConfig) {
// Locale-aware content: `t` resolves to the content bundle for the page's locale (fr by default)
eleventyConfig.addGlobalData("eleventyComputed", {
@@ -7,12 +5,6 @@ module.exports = function(eleventyConfig) {
t: (data) => data.i18n[data.locale || "fr"]
});
// Serve local images through the BunnyCDN pull zone; leaves external URLs untouched
eleventyConfig.addFilter("cdn", (path) => {
if (typeof path !== "string" || !path.startsWith("/")) return path;
return cdn.url + path;
});
// Copy assets folders to output
eleventyConfig.addPassthroughCopy("src/assets");
@@ -20,12 +12,18 @@ module.exports = function(eleventyConfig) {
eleventyConfig.addPassthroughCopy("src/robots.txt");
eleventyConfig.addPassthroughCopy("src/sitemap.xml");
// Copy Apache security headers config to the site root
eleventyConfig.addPassthroughCopy({ "src/.htaccess": ".htaccess" });
// Watch CSS files for changes
eleventyConfig.addWatchTarget("src/assets/css/");
// Watch JS files for changes
eleventyConfig.addWatchTarget("src/assets/js/");
// Dynamic current-year shortcode for the footer
eleventyConfig.addShortcode("year", () => new Date().getFullYear().toString());
// Configure browser sync to reload on CSS changes
eleventyConfig.setBrowserSyncConfig({
files: ['_site/assets/css/**/*.css', '_site/assets/js/**/*.js']
+66 -36
View File
@@ -7,7 +7,7 @@
"": {
"name": "o-k-i.net-v2",
"version": "1.0.0",
"license": "ISC",
"license": "AGPL-3.0",
"devDependencies": {
"@11ty/eleventy": "^3.1.2"
}
@@ -278,9 +278,9 @@
}
},
"node_modules/anymatch/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -410,9 +410,9 @@
}
},
"node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"version": "1.1.16",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz",
"integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -844,9 +844,9 @@
}
},
"node_modules/gray-matter/node_modules/js-yaml": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"version": "3.15.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz",
"integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1035,10 +1035,20 @@
}
},
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz",
"integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/puzrin"
},
{
"type": "github",
"url": "https://github.com/sponsors/nodeca"
}
],
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
@@ -1078,19 +1088,29 @@
}
},
"node_modules/linkify-it": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
"integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz",
"integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/puzrin"
},
{
"type": "github",
"url": "https://github.com/sponsors/markdown-it"
}
],
"license": "MIT",
"dependencies": {
"uc.micro": "^2.0.0"
}
},
"node_modules/liquidjs": {
"version": "10.24.0",
"resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.24.0.tgz",
"integrity": "sha512-TAUNAdgwaAXjjcUFuYVJm9kOVH7zc0mTKxsG9t9Lu4qdWjB2BEblyVIYpjWcmJLMGgiYqnGNJjpNMHx0gp/46A==",
"version": "10.27.2",
"resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.27.2.tgz",
"integrity": "sha512-kvknfAEtOHjHkAAv7GxLEJh8ghpMQm3Fc4uWVyF7hERSTsSRsdC7saWs0p5aDG7GDcWsu5o+T4232O+8KZO55w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1126,15 +1146,25 @@
}
},
"node_modules/markdown-it": {
"version": "14.1.0",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
"integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
"version": "14.3.0",
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz",
"integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/puzrin"
},
{
"type": "github",
"url": "https://github.com/sponsors/markdown-it"
}
],
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1",
"entities": "^4.4.0",
"linkify-it": "^5.0.0",
"entities": "^4.5.0",
"linkify-it": "^5.0.2",
"mdurl": "^2.0.0",
"punycode.js": "^2.3.1",
"uc.micro": "^2.1.0"
@@ -1216,9 +1246,9 @@
}
},
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
"integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -1358,9 +1388,9 @@
}
},
"node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
"integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1474,9 +1504,9 @@
}
},
"node_modules/readdirp/node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1675,9 +1705,9 @@
"license": "MIT"
},
"node_modules/ws": {
"version": "8.18.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
"integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
"version": "8.21.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz",
"integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==",
"dev": true,
"license": "MIT",
"engines": {
+28
View File
@@ -0,0 +1,28 @@
<IfModule mod_rewrite.c>
RewriteEngine On
# Redirect HTTP to HTTPS, including behind reverse proxies
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
<IfModule mod_headers.c>
# Force HTTPS for one year
Header always set Strict-Transport-Security "max-age=31536000"
# Prevent MIME sniffing
Header always set X-Content-Type-Options "nosniff"
# Prevent clickjacking (also enforced via CSP frame-ancestors)
Header always set X-Frame-Options "DENY"
# Control referrer leakage
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Restrict browser features
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=(), usb=(), magnetometer=(), gyroscope=()"
# Content Security Policy (no unsafe-inline/unsafe-eval in script-src)
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://organisationka.b-cdn.net; font-src 'self' https://fonts.gstatic.com; connect-src 'self'; frame-ancestors 'none'; base-uri 'self'; form-action 'self'; object-src 'none'"
</IfModule>
-3
View File
@@ -1,3 +0,0 @@
{
"url": "https://organisationka.b-cdn.net"
}
+3 -3
View File
@@ -8,21 +8,21 @@
"name": "KA UBUNTU",
"domain": "kaubuntu.com",
"url": "https://kaubuntu.com",
"logo": "https://kaubuntu.com/wp-content/uploads/2026/04/logo-ka-ubuntu.png",
"logo": "/assets/images/clients/kaubuntu-com.png",
"description": "Pan-Africanist and pro-independence political movement from Réunion. Fighting for the self-determination of Réunion and African unity. \"I am because we are.\""
},
{
"name": "KA UBUNTU — Media hub",
"domain": "kaubuntu.re",
"url": "https://kaubuntu.re",
"logo": "https://kaubuntu.re/img/logo.png",
"logo": "/assets/images/clients/kaubuntu-re.png",
"description": "Centralised media aggregator for Ka Ubuntu: YouTube videos, articles, Instagram and TikTok brought together on a single page. Progressive web application (PWA)."
},
{
"name": "KBM Ka Pou Nou Bwè é Manjé",
"domain": "kbm.gp",
"url": "https://kbm.gp",
"logo": "https://kbm.gp/images/logo-1024.webp",
"logo": "/assets/images/clients/kbm.gp.webp",
"description": "Movement for the emancipation and food sovereignty of the Guadeloupean people. Community radio Radyo Bòkaz, podcasts, lakou and local farming."
}
]
+6 -9
View File
@@ -5,29 +5,26 @@
{
"title": "🌐 Web & Contact",
"links": [
{ "text": "kontak@o-k-i.net", "url": "mailto:kontak@o-k-i.net" },
{ "text": "WhatsApp +262 692 22 974 0", "url": "https://wa.me/262692229740" }
{ "text": "kontak@o-k-i.net", "url": "mailto:kontak@o-k-i.net" }
]
},
{
"title": "💬 Social networks",
"title": "📢 PAWOL.NU channels",
"links": [
{ "text": "Telegram", "url": "https://t.me/OrganisationKA" },
{ "text": "X (Twitter)", "url": "https://x.com/OrganisationKA" },
{ "text": "TikTok", "url": "https://www.tiktok.com/@organisationka" }
{ "text": "WhatsApp channel", "url": "https://whatsapp.com/channel/0029VbCv7N9AjPXTxygrRu1w" },
{ "text": "Telegram channel", "url": "https://t.me/OrganisationKA" }
]
},
{
"title": "💬 Community",
"links": [
{ "text": "Discord", "url": "https://discord.gg/a2r9NYNM" },
{ "text": "Stoat", "url": "https://stt.gg/FzqPKhbG" }
{ "text": "Discord", "url": "https://discord.gg/DPvUCA8dD" }
]
},
{
"title": "💻 Code & Development",
"links": [
{ "text": "Labola (Gitea)", "url": "https://labola.o-k-i.net/" }
{ "text": "Labola (Gitea)", "url": "https://labola.o-k-i.net/ORGANISATION-KA-INTERNATIONALE" }
]
}
]
+2 -1
View File
@@ -1,9 +1,10 @@
[
{ "text": "Solutions", "url": "/en/#solutions" },
{ "text": "Our projects", "url": "/en/#projets" },
{ "text": "Partners", "url": "/en/#partenaires" },
{ "text": "DJANGOKAM", "url": "/en/#djangokam" },
{ "text": "Services", "url": "/en/#hebergement" },
{ "text": "Donate", "url": "/en/#dons" },
{ "text": "Donate", "url": "/en/donate/" },
{
"text": "Resources",
"children": [
+18 -9
View File
@@ -2,25 +2,34 @@
"section_title": "Our",
"section_title_accent": "Partners",
"section_subtitle": "They share our values and help enrich our free digital ecosystem",
"link_text": "Discover on GADE",
"items": [
{
"name": "Joukawouvè",
"logo": "/assets/images/joukawouve.png",
"description": "Sharing Guadeloupean and international news.",
"url": "https://gade.o-k-i.net/accounts/joukawouve"
},
{
"name": "cyber-mawonaj",
"logo": "/assets/images/cyber_mawonaj.jpg",
"description": "Towards digital mawonaj - Winning your freedom also runs through the digital world.",
"url": "https://gade.o-k-i.net/c/cyber_mawonaj/videos"
"links": [
{ "url": "https://kute.o-k-i.net/@joukawouve", "text": "Discover on KUTE" },
{ "url": "https://bokante.o-k-i.net/@joukawouve", "text": "Discover on BOKANTE" },
{ "url": "https://gade.o-k-i.net/accounts/joukawouve", "text": "Discover on GADE" }
]
},
{
"name": "Aktivist Vybz #AKV",
"logo": "/assets/images/akv.png",
"description": "Committed selectors and DJs, with content focused on activism and cultural expression.",
"url": "https://gade.o-k-i.net/accounts/aktivist_vybz_akv"
"links": [
{ "url": "https://mizik.o-k-i.net/channels/aktivistvybzakv", "text": "Discover on MIZIK" },
{ "url": "https://gade.o-k-i.net/c/aktivist_vybz-1_channel/videos", "text": "Discover on GADE" }
]
},
{
"name": "cyber-mawonaj",
"logo": "/assets/images/cyber_mawonaj.jpg",
"description": "Towards digital mawonaj - Winning your freedom also runs through the digital world.",
"links": [
{ "url": "https://bokante.o-k-i.net/@cybermawonaj", "text": "Discover on BOKANTE" },
{ "url": "https://gade.o-k-i.net/c/cyber.mawonaj/videos", "text": "Discover on GADE" }
]
}
]
}
+7
View File
@@ -16,6 +16,13 @@
"domain": "gong.gp",
"description": "Historical documents from the GONG",
"url": "https://gong.gp/"
},
{
"name": "FEDIVERSE.OKI",
"icon": "🎬",
"domain": "fediverse.o-k-i.net",
"description": "Independent multimedia platform: PeerTube videos, Mastodon feed, Castopod podcasts and WordPress articles",
"url": "https://fediverse.o-k-i.net/"
}
]
}
-1
View File
@@ -4,7 +4,6 @@
"description": "We build custom web applications for grassroots associations, collectives and activist organisations, with rates that match your means.",
"url": "https://o-k-i.net",
"email": "kontak@o-k-i.net",
"copyright": "© 2025 ORGANISATION KA INTERNATIONALE",
"tagline": "Digital tools in service of your struggles",
"og_tagline": "Taking back control of our internet",
"keywords": "OKI, ORGANISATION KA INTERNATIONALE, custom web application, activist associations, web development, digital sovereignty, solidarity pricing, free software, Guadeloupe, Martinique, Caribbean, ethical digital, Castopod, KUTE, ethical hosting, GAFAM alternative",
+3 -3
View File
@@ -8,21 +8,21 @@
"name": "KA UBUNTU",
"domain": "kaubuntu.com",
"url": "https://kaubuntu.com",
"logo": "https://kaubuntu.com/wp-content/uploads/2026/04/logo-ka-ubuntu.png",
"logo": "/assets/images/clients/kaubuntu-com.png",
"description": "Mouvement politique panafricaniste et indépendantiste réunionnais. Lutte pour l'autodétermination de La Réunion et l'unité africaine. \"Je suis parce que nous sommes.\""
},
{
"name": "KA UBUNTU — Hub multimédia",
"domain": "kaubuntu.re",
"url": "https://kaubuntu.re",
"logo": "https://kaubuntu.re/img/logo.png",
"logo": "/assets/images/clients/kaubuntu-re.png",
"description": "Agrégateur multimédia centralisé pour Ka Ubuntu : vidéos YouTube, articles, Instagram et TikTok réunis en une seule page. Application web progressive (PWA)."
},
{
"name": "KBM Ka Pou Nou Bwè é Manjé",
"domain": "kbm.gp",
"url": "https://kbm.gp",
"logo": "https://kbm.gp/images/logo-1024.webp",
"logo": "/assets/images/clients/kbm.gp.webp",
"description": "Mouvement pour l'émancipation et la souveraineté alimentaire du peuple guadeloupéen. Radio communautaire Radyo Bòkaz, podcasts, lakou et agriculture locale."
}
]
+6 -9
View File
@@ -5,29 +5,26 @@
{
"title": "🌐 Web & Contact",
"links": [
{ "text": "kontak@o-k-i.net", "url": "mailto:kontak@o-k-i.net" },
{ "text": "WhatsApp +262 692 22 974 0", "url": "https://wa.me/262692229740" }
{ "text": "kontak@o-k-i.net", "url": "mailto:kontak@o-k-i.net" }
]
},
{
"title": "💬 Réseaux sociaux",
"title": "📢 Chaînes PAWOL.NU",
"links": [
{ "text": "Telegram", "url": "https://t.me/OrganisationKA" },
{ "text": "X (Twitter)", "url": "https://x.com/OrganisationKA" },
{ "text": "TikTok", "url": "https://www.tiktok.com/@organisationka" }
{ "text": "WhatsApp channel", "url": "https://whatsapp.com/channel/0029VbCv7N9AjPXTxygrRu1w" },
{ "text": "Telegram channel", "url": "https://t.me/OrganisationKA" }
]
},
{
"title": "💬 Communauté",
"links": [
{ "text": "Discord", "url": "https://discord.gg/a2r9NYNM" },
{ "text": "Stoat", "url": "https://stt.gg/FzqPKhbG" }
{ "text": "Discord", "url": "https://discord.gg/DPvUCA8dD" }
]
},
{
"title": "💻 Code & Développement",
"links": [
{ "text": "Labola (Gitea)", "url": "https://labola.o-k-i.net/" }
{ "text": "Labola (Gitea)", "url": "https://labola.o-k-i.net/ORGANISATION-KA-INTERNATIONALE" }
]
}
]
+2 -1
View File
@@ -1,9 +1,10 @@
[
{ "text": "Solutions", "url": "/#solutions" },
{ "text": "Nos projets", "url": "/#projets" },
{ "text": "Partenaires", "url": "/#partenaires" },
{ "text": "DJANGOKAM", "url": "/#djangokam" },
{ "text": "Services", "url": "/#hebergement" },
{ "text": "Dons", "url": "/#dons" },
{ "text": "Dons", "url": "/dons/" },
{
"text": "Ressources",
"children": [
+18 -9
View File
@@ -2,25 +2,34 @@
"section_title": "Nos",
"section_title_accent": "Partenaires",
"section_subtitle": "Ils partagent nos valeurs et contribuent à enrichir notre écosystème numérique libre",
"link_text": "Découvrir sur GADE",
"items": [
{
"name": "Joukawouvè",
"logo": "/assets/images/joukawouve.png",
"description": "Partage de l'actualité guadeloupéenne et internationale.",
"url": "https://gade.o-k-i.net/accounts/joukawouve"
},
{
"name": "cyber-mawonaj",
"logo": "/assets/images/cyber_mawonaj.jpg",
"description": "Vers le mawonaj numérique - Conquérir sa liberté passe aussi par le numérique.",
"url": "https://gade.o-k-i.net/c/cyber_mawonaj/videos"
"links": [
{ "url": "https://kute.o-k-i.net/@joukawouve", "text": "Découvrir sur KUTE" },
{ "url": "https://bokante.o-k-i.net/@joukawouve", "text": "Découvrir sur BOKANTE" },
{ "url": "https://gade.o-k-i.net/accounts/joukawouve", "text": "Découvrir sur GADE" }
]
},
{
"name": "Aktivist Vybz #AKV",
"logo": "/assets/images/akv.png",
"description": "Sélecteurs et DJs engagés, avec un contenu axé sur l'activisme et l'expression culturelle.",
"url": "https://gade.o-k-i.net/accounts/aktivist_vybz_akv"
"links": [
{ "url": "https://mizik.o-k-i.net/channels/aktivistvybzakv", "text": "Découvrir sur MIZIK" },
{ "url": "https://gade.o-k-i.net/c/aktivist_vybz-1_channel/videos", "text": "Découvrir sur GADE" }
]
},
{
"name": "cyber-mawonaj",
"logo": "/assets/images/cyber_mawonaj.jpg",
"description": "Vers le mawonaj numérique - Conquérir sa liberté passe aussi par le numérique.",
"links": [
{ "url": "https://bokante.o-k-i.net/@cybermawonaj", "text": "Découvrir sur BOKANTE" },
{ "url": "https://gade.o-k-i.net/c/cyber.mawonaj/videos", "text": "Découvrir sur GADE" }
]
}
]
}
+7
View File
@@ -16,6 +16,13 @@
"domain": "gong.gp",
"description": "Documents historiques du GONG",
"url": "https://gong.gp/"
},
{
"name": "FEDIVERSE.OKI",
"icon": "🎬",
"domain": "fediverse.o-k-i.net",
"description": "Plateforme multimédia indépendante : vidéos PeerTube, fil Mastodon, podcasts Castopod et articles WordPress",
"url": "https://fediverse.o-k-i.net/"
}
]
}
-1
View File
@@ -4,7 +4,6 @@
"description": "Nous développons des applications web sur mesure pour les associations, collectifs et organisations militantes, avec des tarifs adaptés à vos moyens.",
"url": "https://o-k-i.net",
"email": "kontak@o-k-i.net",
"copyright": "© 2025 ORGANISATION KA INTERNATIONALE",
"tagline": "Le numérique au service de vos luttes",
"og_tagline": "Prenons le contrôle de notre internet",
"keywords": "OKI, ORGANISATION KA INTERNATIONALE, application web sur mesure, associations militantes, développement web, souveraineté numérique, tarifs solidaires, logiciel libre, Guadeloupe, Martinique, Caraïbes, numérique éthique, Castopod, KUTE, hébergement libre, alternative GAFAM",
+9 -44
View File
@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="{{ locale }}">
<html lang="{{ locale }}" data-locale="{{ locale }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -23,7 +23,7 @@
<meta property="og:url" content="https://o-k-i.net{{ page.url or '/' }}">
<meta property="og:title" content="{% if title %}{{ title }}{% else %}{{ t.site.name }} - {{ t.site.og_tagline }}{% endif %}">
<meta property="og:description" content="{{ description or t.site.description }}">
<meta property="og:image" content="{{ '/assets/images/logo-512x512.png' | cdn }}">
<meta property="og:image" content="https://o-k-i.net/assets/images/logo-512x512.png">
<meta property="og:image:width" content="512">
<meta property="og:image:height" content="512">
<meta property="og:image:alt" content="Logo {{ t.site.name }}">
@@ -35,13 +35,13 @@
<meta name="twitter:url" content="https://o-k-i.net{{ page.url or '/' }}">
<meta name="twitter:title" content="{% if title %}{{ title }}{% else %}{{ t.site.name }} - {{ t.site.og_tagline }}{% endif %}">
<meta name="twitter:description" content="{{ description or t.site.description }}">
<meta name="twitter:image" content="{{ '/assets/images/logo-512x512.png' | cdn }}">
<meta name="twitter:image" content="https://o-k-i.net/assets/images/logo-512x512.png">
<meta name="twitter:image:alt" content="Logo {{ t.site.name }}">
<!-- Favicons -->
<link rel="icon" type="image/x-icon" href="{{ '/assets/images/favicon.ico' | cdn }}">
<link rel="icon" type="image/png" sizes="512x512" href="{{ '/assets/images/logo-512x512.png' | cdn }}">
<link rel="apple-touch-icon" href="{{ '/assets/images/logo-512x512.png' | cdn }}">
<link rel="icon" type="image/x-icon" href="/assets/images/favicon.ico">
<link rel="icon" type="image/png" sizes="512x512" href="/assets/images/logo-512x512.png">
<link rel="apple-touch-icon" href="/assets/images/logo-512x512.png">
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
@@ -59,7 +59,7 @@
"name": "{{ t.site.name }}",
"alternateName": "{{ t.site.shortName }}",
"url": "https://o-k-i.net",
"logo": "{{ '/assets/images/logo-512x512.png' | cdn }}",
"logo": "https://o-k-i.net/assets/images/logo-512x512.png",
"description": "{{ t.site.description }}",
"address": {
"@type": "PostalAddress",
@@ -100,43 +100,8 @@
}
</script>
<script>
(function() {
// Récupérer le thème stocké ou détecter le thème système
const storedTheme = localStorage.getItem('oki-theme');
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
let theme = storedTheme;
// Si pas de préférence stockée, utiliser le thème système
if (!storedTheme) {
theme = systemPrefersDark ? 'dark' : 'light';
}
// Appliquer le thème immédiatement
if (theme === 'light') {
document.documentElement.classList.add('light-theme');
}
})();
</script>
<script>
(function() {
// Redirection automatique selon la langue du navigateur, sauf choix explicite déjà mémorisé
var pref = localStorage.getItem('oki-lang-pref');
if (pref) return;
var browserLang = (navigator.language || navigator.userLanguage || '').toLowerCase();
var wantsEnglish = browserLang.indexOf('en') === 0;
var currentLocale = '{{ locale }}';
if (wantsEnglish && currentLocale !== 'en') {
window.location.replace('/en/' + window.location.hash);
} else if (!wantsEnglish && currentLocale === 'en') {
window.location.replace('/' + window.location.hash);
}
})();
</script>
<script src="/assets/js/theme.js"></script>
<script src="/assets/js/lang-redirect.js"></script>
</head>
<body>
{% include "partials/nav.njk" %}
+21 -22
View File
@@ -7,28 +7,27 @@
</div>
<div class="contact-socials">
{% for section in t.contact.sections %}
{% for link in section.links %}
{% set lname = link.text.toLowerCase() %}
<a href="{{ link.url }}" title="{{ link.text }}"{% if link.url.startsWith('http') %} target="_blank" rel="noopener noreferrer"{% endif %} class="contact-social-link">
{% if 'kontak' in lname or 'mail' in lname %}
{% include "icons/email.svg" %}
{% elif 'whatsapp' in lname %}
{% include "icons/whatsapp.svg" %}
{% elif 'telegram' in lname %}
{% include "icons/telegram.svg" %}
{% elif 'twitter' in lname or 'x (' in lname %}
{% include "icons/x.svg" %}
{% elif 'tiktok' in lname %}
{% include "icons/tiktok.svg" %}
{% elif 'discord' in lname %}
{% include "icons/discord.svg" %}
{% elif 'stoat' in lname %}
{% include "icons/stoat.svg" %}
{% elif 'labola' in lname or 'gitea' in lname %}
{% include "icons/gitea.svg" %}
{% endif %}
</a>
{% endfor %}
<div class="contact-socials-group">
<h3 class="contact-socials-title">{{ section.title }}</h3>
<div class="contact-socials-row">
{% for link in section.links %}
{% set lname = link.text.toLowerCase() %}
<a href="{{ link.url }}" title="{{ link.text }}"{% if link.url.startsWith('http') %} target="_blank" rel="noopener noreferrer"{% endif %} class="contact-social-link">
{% if 'kontak' in lname or 'mail' in lname %}
{% include "icons/email.svg" %}
{% elif 'whatsapp' in lname %}
{% include "icons/whatsapp.svg" %}
{% elif 'telegram' in lname %}
{% include "icons/telegram.svg" %}
{% elif 'discord' in lname %}
{% include "icons/discord.svg" %}
{% elif 'labola' in lname or 'gitea' in lname %}
{% include "icons/gitea.svg" %}
{% endif %}
</a>
{% endfor %}
</div>
</div>
{% endfor %}
</div>
</section>
+3 -3
View File
@@ -4,7 +4,7 @@
<h2>{{ t.djangokam.titre }} <span class="accent-text">{{ t.djangokam.titreAccent }}</span></h2>
<p class="section-subtitle">{{ t.djangokam.accroche }}</p>
<img src="{{ '/assets/images/djangokam-portrait.webp' | cdn }}" alt="Portrait officiel de DJANGOKAM" class="djangokam-portrait" width="512" height="512" loading="lazy">
<img src="/assets/images/djangokam-portrait.webp" alt="Portrait officiel de DJANGOKAM" class="djangokam-portrait" width="512" height="512" loading="lazy">
<blockquote class="djangokam-highlight">
{{ t.djangokam.message_cle }}
@@ -19,7 +19,7 @@
<figure class="djangokam-duo">
<a href="{{ t.djangokam.duo.url }}" target="_blank" rel="noopener noreferrer">
<img src="{{ t.djangokam.duo.image | cdn }}" alt="{{ t.djangokam.duo.alt }}" loading="lazy">
<img src="{{ t.djangokam.duo.image }}" alt="{{ t.djangokam.duo.alt }}" loading="lazy">
<figcaption>{{ t.djangokam.duo.legende }}</figcaption>
</a>
</figure>
@@ -39,7 +39,7 @@
{% for clip in t.djangokam.clips %}
<figure class="djangokam-clip">
<a href="{{ clip.url }}" target="_blank" rel="noopener noreferrer">
<img src="{{ clip.image | cdn }}" alt="{{ clip.alt }}" loading="lazy">
<img src="{{ clip.image }}" alt="{{ clip.alt }}" loading="lazy">
<figcaption>{{ clip.titre }}</figcaption>
</a>
</figure>
+1 -1
View File
@@ -8,7 +8,7 @@
<div class="faq-container">
{% for item in t.faq.items %}
<div class="faq-item">
<button class="faq-question" onclick="this.parentElement.classList.toggle('active')">
<button class="faq-question">
<span>{{ item.question }}</span>
<span class="faq-icon">+</span>
</button>
+3 -15
View File
@@ -5,7 +5,7 @@
{{ t.site.name }}
</p>
<p class="footer-meta">
{{ t.site.copyright }} | {{ t.site.tagline }}
© {% year %} {{ t.site.name }} | {{ t.site.tagline }}
</p>
<p class="footer-legal">
<a href="{% if locale == 'en' %}/en/legal-notice/{% else %}/mentions-legales/{% endif %}">
@@ -19,22 +19,10 @@
<a href="https://wa.me/262692229740" target="_blank" rel="noopener noreferrer" title="WhatsApp" class="social-link">
{% include "icons/whatsapp.svg" %}
</a>
<a href="https://t.me/OrganisationKA" target="_blank" rel="noopener noreferrer" title="Telegram" class="social-link">
{% include "icons/telegram.svg" %}
</a>
<a href="https://x.com/OrganisationKA" target="_blank" rel="noopener noreferrer" title="X" class="social-link">
{% include "icons/x.svg" %}
</a>
<a href="https://www.tiktok.com/@organisationka" target="_blank" rel="noopener noreferrer" title="TikTok" class="social-link">
{% include "icons/tiktok.svg" %}
</a>
<a href="https://discord.gg/a2r9NYNM" target="_blank" rel="noopener noreferrer" title="Discord" class="social-link">
<a href="https://discord.gg/DPvUCA8dD" target="_blank" rel="noopener noreferrer" title="Discord" class="social-link">
{% include "icons/discord.svg" %}
</a>
<a href="https://stt.gg/FzqPKhbG" target="_blank" rel="noopener noreferrer" title="Stoat" class="social-link">
{% include "icons/stoat.svg" %}
</a>
<a href="https://labola.o-k-i.net/" target="_blank" rel="noopener noreferrer" title="Labola (Gitea)" class="social-link">
<a href="https://labola.o-k-i.net/ORGANISATION-KA-INTERNATIONALE/o-k-i.net" target="_blank" rel="noopener noreferrer" title="Code source sur Labola (Gitea)" class="social-link">
{% include "icons/gitea.svg" %}
</a>
</div>
+3 -3
View File
@@ -1,7 +1,7 @@
<nav>
<div class="nav-container">
<a href="/" class="logo">
<img src="{{ '/assets/images/logo-512x512.png' | cdn }}" alt="{{ t.site.shortName }} Logo" class="logo-image">
<img src="/assets/images/logo-512x512.png" alt="{{ t.site.shortName }} Logo" class="logo-image">
<span>{{ t.site.shortName }}</span>
</a>
<ul class="nav-links">
@@ -31,9 +31,9 @@
{% endfor %}
</ul>
{% if locale == 'en' %}
<a href="#" class="lang-switch" onclick="localStorage.setItem('oki-lang-pref','fr'); switchLanguage('fr'); return false;">{{ t.ui.lang_switch_label }}</a>
<a href="#" class="lang-switch" data-lang="fr">{{ t.ui.lang_switch_label }}</a>
{% else %}
<a href="#" class="lang-switch" onclick="localStorage.setItem('oki-lang-pref','en'); switchLanguage('en'); return false;">{{ t.ui.lang_switch_label }}</a>
<a href="#" class="lang-switch" data-lang="en">{{ t.ui.lang_switch_label }}</a>
{% endif %}
<button id="theme-toggle" class="theme-toggle" aria-label="{{ t.ui.theme_toggle }}" title="{{ t.ui.theme_toggle }}">
<span class="theme-icon theme-icon-dark">🌙</span>
+10 -6
View File
@@ -7,16 +7,20 @@
<div class="partners-grid">
{% for partner in t.partners.items %}
<a href="{{ partner.url }}" target="_blank" rel="noopener noreferrer" class="partner-card">
<div class="partner-card">
<div class="partner-logo-container">
<img src="{{ partner.logo | cdn }}" alt="Logo {{ partner.name }}" class="partner-logo">
<img src="{{ partner.logo }}" alt="Logo {{ partner.name }}" class="partner-logo">
</div>
<h3>{{ partner.name }}</h3>
<p class="partner-description">{{ partner.description }}</p>
<span class="partner-link">
{{ t.partners.link_text }} →
</span>
</a>
<div class="partner-links">
{% for link in partner.links %}
<a href="{{ link.url }}" target="_blank" rel="noopener noreferrer" class="partner-link">
{{ link.text }} →
</a>
{% endfor %}
</div>
</div>
{% endfor %}
</div>
</div>
+2 -2
View File
@@ -26,7 +26,7 @@
<div class="custom-donation-form">
<input type="number" id="customAmountOneTime" placeholder="{{ t.support.custom_amount_placeholder }}" min="1" class="custom-amount-input">
<span class="currency-symbol">{{ t.support.one_time_suffix }}</span>
<button onclick="handleCustomDonation('oneTime')" class="custom-donation-btn custom-donation-btn-primary">
<button data-donation-type="oneTime" class="custom-donation-btn custom-donation-btn-primary">
{{ t.support.custom_amount_btn }}
</button>
</div>
@@ -49,7 +49,7 @@
<div class="custom-donation-form">
<input type="number" id="customAmountMonthly" placeholder="{{ t.support.custom_amount_placeholder }}" min="1" class="custom-amount-input custom-amount-input-monthly">
<span class="currency-symbol">{{ t.support.monthly_suffix }}</span>
<button onclick="handleCustomDonation('monthly')" class="custom-donation-btn custom-donation-btn-secondary">
<button data-donation-type="monthly" class="custom-donation-btn custom-donation-btn-secondary">
{{ t.support.custom_monthly_btn }}
</button>
</div>
+76 -9
View File
@@ -385,7 +385,7 @@ html.light-theme .theme-icon-light {
right: -5%;
width: 55%;
height: 100%;
background: url('https://organisationka.b-cdn.net/assets/images/logo-512x512.png') center / contain no-repeat;
background: url('/assets/images/logo-512x512.png') center / contain no-repeat;
opacity: 0.05;
pointer-events: none;
}
@@ -959,8 +959,6 @@ html.light-theme .hero::before {
padding: 2.5rem;
text-align: center;
transition: transform 0.2s ease, border-color 0.2s ease;
text-decoration: none;
color: inherit;
display: flex;
flex-direction: column;
align-items: center;
@@ -1002,6 +1000,13 @@ html.light-theme .hero::before {
font-family: var(--font-body);
}
.partner-links {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 0.6rem;
}
.partner-link {
color: var(--or-oki);
font-weight: 600;
@@ -1009,11 +1014,17 @@ html.light-theme .hero::before {
align-items: center;
gap: 0.4rem;
font-family: var(--font-body);
transition: gap 0.2s ease;
font-size: 0.95rem;
padding: 0.4rem 0.9rem;
border: 1px solid var(--or-oki);
border-radius: 999px;
text-decoration: none;
transition: background 0.2s ease, gap 0.2s ease;
}
.partner-card:hover .partner-link {
gap: 0.75rem;
.partner-link:hover {
background: rgba(253, 184, 19, 0.12);
gap: 0.6rem;
}
/* Support Section */
@@ -1197,13 +1208,32 @@ html.light-theme .hero::before {
}
.contact-socials {
display: flex;
flex-direction: column;
align-items: center;
gap: 2rem;
max-width: 1200px;
margin: 0 auto;
}
.contact-socials-group {
text-align: center;
}
.contact-socials-title {
font-size: 0.85rem;
font-weight: 600;
color: var(--or-oki);
margin-bottom: 0.75rem;
opacity: 0.9;
}
.contact-socials-row {
display: flex;
justify-content: center;
align-items: center;
gap: 1.5rem;
flex-wrap: wrap;
max-width: 1200px;
margin: 0 auto;
}
.contact-social-link {
@@ -1231,6 +1261,13 @@ html.light-theme .hero::before {
@media (min-width: 768px) {
.contact-socials {
flex-direction: row;
align-items: flex-start;
justify-content: center;
gap: 3rem;
}
.contact-socials-row {
gap: 2rem;
}
@@ -1467,15 +1504,43 @@ input[type="number"]:focus {
}
/* Responsive */
@media (max-width: 768px) {
@media (max-width: 1100px) {
.nav-links {
display: none;
}
.nav-links.mobile-open {
display: flex;
position: absolute;
top: 100%;
left: 0;
right: 0;
flex-direction: column;
padding: 1rem;
border-top: 2px solid var(--or-oki);
background: rgba(0, 0, 0, 0.98);
}
html.light-theme .nav-links.mobile-open {
background: rgba(255, 248, 231, 0.98);
}
.nav-container {
gap: 1rem;
}
.menu-toggle.open span:nth-child(1) {
transform: rotate(45deg) translateY(8px);
}
.menu-toggle.open span:nth-child(2) {
opacity: 0;
}
.menu-toggle.open span:nth-child(3) {
transform: rotate(-45deg) translateY(-8px);
}
.theme-toggle {
padding: 0.4rem 0.6rem;
font-size: 1rem;
@@ -1509,7 +1574,9 @@ input[type="number"]:focus {
padding: 0.4rem 0;
font-size: 0.9rem;
}
}
@media (max-width: 768px) {
.hero h1 {
font-size: 2rem;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

+15
View File
@@ -0,0 +1,15 @@
(function() {
// Redirection automatique selon la langue du navigateur, sauf choix explicite déjà mémorisé
var pref = localStorage.getItem('oki-lang-pref');
if (pref) return;
var browserLang = (navigator.language || navigator.userLanguage || '').toLowerCase();
var wantsEnglish = browserLang.indexOf('en') === 0;
var currentLocale = document.documentElement.dataset.locale || 'fr';
if (wantsEnglish && currentLocale !== 'en') {
window.location.replace('/en/' + window.location.hash);
} else if (!wantsEnglish && currentLocale === 'en') {
window.location.replace('/' + window.location.hash);
}
})();
+44 -58
View File
@@ -21,13 +21,6 @@
// Sauvegarder la préférence
localStorage.setItem('oki-theme', newTheme);
// Mettre à jour le menu mobile si ouvert
const navLinks = document.querySelector('.nav-links');
if (navLinks && navLinks.style.display === 'flex') {
const background = newTheme === 'light' ? 'rgba(255, 248, 231, 0.98)' : 'rgba(0, 0, 0, 0.98)';
navLinks.style.background = background;
}
// Mettre à jour les styles de la nav en fonction du scroll actuel
const nav = document.querySelector('nav');
const currentScroll = window.pageYOffset;
@@ -67,6 +60,18 @@
// Ajouter l'événement au bouton
themeToggle?.addEventListener('click', toggleTheme);
// Language switcher links
document.querySelectorAll('.lang-switch').forEach(function(link) {
link.addEventListener('click', function(e) {
e.preventDefault();
var lang = this.dataset.lang;
if (lang) {
localStorage.setItem('oki-lang-pref', lang);
switchLanguage(lang);
}
});
});
})();
// Language switch with page mapping
@@ -83,6 +88,7 @@ function switchLanguage(lang) {
}
newPath = newPath.replace('/press/', '/presse/');
newPath = newPath.replace('/legal-notice/', '/mentions-legales/');
newPath = newPath.replace('/donate/', '/dons/');
} else {
// Switch to English
if (!currentPath.startsWith('/en/')) {
@@ -92,6 +98,7 @@ function switchLanguage(lang) {
}
newPath = newPath.replace('/presse/', '/press/');
newPath = newPath.replace('/mentions-legales/', '/legal-notice/');
newPath = newPath.replace('/dons/', '/donate/');
}
window.location.href = newPath;
@@ -120,32 +127,18 @@ let menuOpen = false;
menuToggle?.addEventListener('click', () => {
menuOpen = !menuOpen;
if (menuOpen) {
// Déterminer le fond selon le thème actuel
const isLightTheme = document.documentElement.classList.contains('light-theme');
const background = isLightTheme ? 'rgba(255, 248, 231, 0.98)' : 'rgba(0, 0, 0, 0.98)';
navLinks.classList.toggle('mobile-open', menuOpen);
menuToggle.classList.toggle('open', menuOpen);
});
navLinks.style.display = 'flex';
navLinks.style.position = 'absolute';
navLinks.style.top = '100%';
navLinks.style.left = '0';
navLinks.style.right = '0';
navLinks.style.background = background;
navLinks.style.flexDirection = 'column';
navLinks.style.padding = '1rem';
navLinks.style.borderTop = '2px solid #E8A625';
// Animate menu toggle
menuToggle.children[0].style.transform = 'rotate(45deg) translateY(8px)';
menuToggle.children[1].style.opacity = '0';
menuToggle.children[2].style.transform = 'rotate(-45deg) translateY(-8px)';
} else {
navLinks.style.display = 'none';
// Reset menu toggle
menuToggle.children[0].style.transform = '';
menuToggle.children[1].style.opacity = '1';
menuToggle.children[2].style.transform = '';
// Si la fenêtre est agrandie au-delà du breakpoint mobile pendant que le
// menu est ouvert, on réinitialise son état pour éviter qu'il reste caché
// ou en position absolue quand la nav desktop redevient visible.
window.addEventListener('resize', () => {
if (menuOpen && window.innerWidth > 1100) {
menuOpen = false;
navLinks.classList.remove('mobile-open');
menuToggle.classList.remove('open');
}
});
@@ -153,10 +146,8 @@ menuToggle?.addEventListener('click', () => {
document.addEventListener('click', (e) => {
if (menuOpen && !menuToggle.contains(e.target) && !navLinks.contains(e.target)) {
menuOpen = false;
navLinks.style.display = 'none';
menuToggle.children[0].style.transform = '';
menuToggle.children[1].style.opacity = '1';
menuToggle.children[2].style.transform = '';
navLinks.classList.remove('mobile-open');
menuToggle.classList.remove('open');
}
});
@@ -165,10 +156,8 @@ navLinks?.querySelectorAll('a').forEach(link => {
link.addEventListener('click', () => {
if (menuOpen) {
menuOpen = false;
navLinks.style.display = 'none';
menuToggle.children[0].style.transform = '';
menuToggle.children[1].style.opacity = '1';
menuToggle.children[2].style.transform = '';
navLinks.classList.remove('mobile-open');
menuToggle.classList.remove('open');
}
});
});
@@ -288,24 +277,6 @@ function createNetworkLine() {
// Initialize network lines
createNetworkLine();
// Dynamic typing effect for hero subtitle
const subtitle = document.querySelector('.hero-subtitle');
if (subtitle) {
const text = subtitle.textContent;
subtitle.textContent = '';
let index = 0;
function typeWriter() {
if (index < text.length) {
subtitle.textContent += text.charAt(index);
index++;
setTimeout(typeWriter, 100);
}
}
setTimeout(typeWriter, 800);
}
// Add hover effect to project cards with tilt
document.querySelectorAll('.project-card, .service-card').forEach(card => {
card.addEventListener('mousemove', (e) => {
@@ -375,3 +346,18 @@ function handleCustomDonation(type) {
window.location.href = stripeUrl;
}
// FAQ accordion toggle
document.querySelectorAll('.faq-question').forEach(button => {
button.addEventListener('click', () => {
button.parentElement.classList.toggle('active');
});
});
// Custom donation buttons
document.querySelectorAll('.custom-donation-btn').forEach(button => {
button.addEventListener('click', () => {
const type = button.dataset.donationType;
if (type) handleCustomDonation(type);
});
});
+17
View File
@@ -0,0 +1,17 @@
(function() {
// Récupérer le thème stocké ou détecter le thème système
const storedTheme = localStorage.getItem('oki-theme');
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
let theme = storedTheme;
// Si pas de préférence stockée, utiliser le thème système
if (!storedTheme) {
theme = systemPrefersDark ? 'dark' : 'light';
}
// Appliquer le thème immédiatement
if (theme === 'light') {
document.documentElement.classList.add('light-theme');
}
})();
+12
View File
@@ -0,0 +1,12 @@
---
layout: layouts/base.njk
title: Dons
description: Soutenez ORGANISATION KA INTERNATIONALE par un don ponctuel ou mensuel via Stripe, Liberapay ou Ko-fi.
---
<section class="press-hero">
<h1>{{ t.support.section_title }} <span class="accent-text">{{ t.support.section_title_accent }}</span></h1>
<p class="press-lede">{{ t.support.lede }}</p>
</section>
{% include "partials/support.njk" %}
+12
View File
@@ -0,0 +1,12 @@
---
layout: layouts/base.njk
title: Donate
description: Support ORGANISATION KA INTERNATIONALE with a one-time or monthly donation through Stripe, Liberapay or Ko-fi.
---
<section class="press-hero">
<h1>{{ t.support.section_title }} <span class="accent-text">{{ t.support.section_title_accent }}</span></h1>
<p class="press-lede">{{ t.support.lede }}</p>
</section>
{% include "partials/support.njk" %}
+1 -1
View File
@@ -5,12 +5,12 @@ layout: layouts/base.njk
{% include "partials/hero.njk" %}
{% include "partials/publics.njk" %}
{% include "partials/projects.njk" %}
{% include "partials/partners.njk" %}
{% include "partials/djangokam.njk" %}
{% include "partials/mission.njk" %}
{% include "partials/hosting.njk" %}
{% include "partials/clients.njk" %}
{% include "partials/fediverse.njk" %}
{% include "partials/support.njk" %}
{% include "partials/faq.njk" %}
{% include "partials/engagement.njk" %}
{% include "partials/contact.njk" %}
+2 -2
View File
@@ -37,8 +37,8 @@ description: Legal notice and legal information of ORGANISATION KA INTERNATIONAL
</li>
<li style="margin-bottom: 1rem;">
<strong style="color: var(--or-oki);">Hosting Provider:</strong><br>
OVH<br>
2 rue Kellermann, 59100 Roubaix
o2switch<br>
222-224 Boulevard Gustave Flaubert, 63000 Clermont-Ferrand, France
</li>
<li style="margin-bottom: 1rem;">
<strong style="color: var(--or-oki);">Data Protection Officer:</strong><br>
+4 -4
View File
@@ -30,16 +30,16 @@ description: Press resources for DJANGOKAM, the first Caribbean AI artist produc
<div class="press-visual-grid">
{% for visual in t.press.visuals %}
<div class="press-visual">
<a href="{{ visual.image | cdn }}" target="_blank" rel="noopener noreferrer">
<img src="{{ visual.image | cdn }}" alt="{{ visual.caption }}" loading="lazy">
<a href="{{ visual.image }}" target="_blank" rel="noopener noreferrer">
<img src="{{ visual.image }}" alt="{{ visual.caption }}" loading="lazy">
<span class="press-visual-caption">{{ visual.caption }}</span>
</a>
<a href="{{ ('/assets/press/' + visual.pdf) | cdn }}" class="press-visual-pdf-link">{{ t.press.visual_pdf_label }}</a>
<a href="{{ ('/assets/press/' + visual.pdf) }}" class="press-visual-pdf-link">{{ t.press.visual_pdf_label }}</a>
</div>
{% endfor %}
</div>
<div class="press-visuals-pdf">
<a href="{{ ('/assets/press/' + t.press.visuals_pdf_file) | cdn }}" class="btn btn-primary">{{ t.press.visuals_pdf_label }} →</a>
<a href="{{ ('/assets/press/' + t.press.visuals_pdf_file) }}" class="btn btn-primary">{{ t.press.visuals_pdf_label }} →</a>
</div>
</div>
</section>
+1 -1
View File
@@ -5,12 +5,12 @@ layout: layouts/base.njk
{% include "partials/hero.njk" %}
{% include "partials/publics.njk" %}
{% include "partials/projects.njk" %}
{% include "partials/partners.njk" %}
{% include "partials/djangokam.njk" %}
{% include "partials/mission.njk" %}
{% include "partials/hosting.njk" %}
{% include "partials/clients.njk" %}
{% include "partials/fediverse.njk" %}
{% include "partials/support.njk" %}
{% include "partials/faq.njk" %}
{% include "partials/engagement.njk" %}
{% include "partials/contact.njk" %}
+2 -2
View File
@@ -38,8 +38,8 @@ description: Mentions légales et informations juridiques de l'ORGANISATION KA I
</li>
<li style="margin-bottom: 1rem;">
<strong style="color: var(--or-oki);">Hébergeur :</strong><br>
OVH<br>
2 rue Kellermann, 59100 Roubaix
o2switch<br>
222-224 Boulevard Gustave Flaubert, 63000 Clermont-Ferrand
</li>
<li style="margin-bottom: 1rem;">
<strong style="color: var(--or-oki);">Délégué à la protection des données :</strong><br>
+4 -4
View File
@@ -30,16 +30,16 @@ description: Ressources presse pour DJANGOKAM, premier artiste IA caribéen prod
<div class="press-visual-grid">
{% for visual in t.press.visuals %}
<div class="press-visual">
<a href="{{ visual.image | cdn }}" target="_blank" rel="noopener noreferrer">
<img src="{{ visual.image | cdn }}" alt="{{ visual.caption }}" loading="lazy">
<a href="{{ visual.image }}" target="_blank" rel="noopener noreferrer">
<img src="{{ visual.image }}" alt="{{ visual.caption }}" loading="lazy">
<span class="press-visual-caption">{{ visual.caption }}</span>
</a>
<a href="{{ ('/assets/press/' + visual.pdf) | cdn }}" class="press-visual-pdf-link">{{ t.press.visual_pdf_label }}</a>
<a href="{{ ('/assets/press/' + visual.pdf) }}" class="press-visual-pdf-link">{{ t.press.visual_pdf_label }}</a>
</div>
{% endfor %}
</div>
<div class="press-visuals-pdf">
<a href="{{ ('/assets/press/' + t.press.visuals_pdf_file) | cdn }}" class="btn btn-primary">{{ t.press.visuals_pdf_label }} →</a>
<a href="{{ ('/assets/press/' + t.press.visuals_pdf_file) }}" class="btn btn-primary">{{ t.press.visuals_pdf_label }} →</a>
</div>
</div>
</section>
+12
View File
@@ -24,6 +24,18 @@
<changefreq>monthly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://o-k-i.net/dons/</loc>
<lastmod>2026-07-07</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://o-k-i.net/en/donate/</loc>
<lastmod>2026-07-07</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://o-k-i.net/mentions-legales/</loc>
<lastmod>2025-01-05</lastmod>