Le Portail Kodeix met à votre disposition un éditeur visuel en direct ("inline editor"). Cet outil vous permet de modifier les textes, les images et les boutons de votre site web en temps réel sans connaissances techniques.
Accès rapide : Connectez-vous sur votre espace Portail, cliquez sur Mes Sites, puis sur Éditeur Visuel. Votre site s'affichera au milieu de l'écran entouré des outils d'édition.
Comment repérer les zones modifiables ?
Lorsque le mode édition est actif, passez le curseur de votre souris sur les éléments du site. Toutes les sections modifiables s'entourent d'un encadré en pointillés bleus et affichent une icône de crayon.
Guide Client : Modifier du contenu
1. Modifier un texte
Cliquez simplement sur le texte que vous souhaitez modifier. Le curseur d'édition apparaît. Tapez votre nouveau texte. Pour les sections plus longues (comme les Conditions Générales CGU/CGV), vous pouvez effectuer des retours à la ligne avec la touche Entrée.
2. Remplacer une image
Survolez l'image que vous désirez remplacer. Un bouton bleu Changer l'image apparaît en haut à droite de celle-ci. Cliquez dessus pour choisir un nouveau fichier image (PNG, JPG, WebP) depuis votre ordinateur. L'image se téléverse et se met à jour automatiquement.
3. Personnaliser un bouton ou un lien de contact
Certains boutons (par exemple le bouton de contact WhatsApp ou le bouton d'appel) affichent un bouton d'édition au survol. Il vous permet de modifier à la fois le texte affiché sur le bouton et son lien (comme votre numéro de téléphone ou l'adresse e-mail associée).
4. Ajouter ou supprimer des articles (CGU / CGV)
Sur les pages juridiques (CGU/CGV), l'administrateur dispose de deux boutons spécifiques :
Ajouter un article : Crée instantanément un nouvel article à la fin du document.
Supprimer l'article : Supprime définitivement l'article concerné du contrat.
Guide Client : Enregistrer ou annuler les modifications
Afin de vous offrir une navigation fluide et rapide sans lenteur, toutes vos modifications sont d'abord conservées en mémoire.
Important : Un point orange et la mention Modifié s'affichent sur les blocs modifiés tant qu'ils ne sont pas enregistrés en base de données.
La barre de validation flottante
Dès votre première modification, une barre bleue apparaît au bas de l'écran :
Enregistrer les modifications : Publie instantanément toutes vos modifications en ligne pour les visiteurs.
Annuler les modifications : Annule tous vos changements en cours et recharge la page avec la version précédente.
Guide Développeur : Architecture Multi-Docker
L'écosystème Next.js / MongoDB isole chaque site client dans un conteneur Docker. Le Portail centralisé communique avec les conteneurs clients via une base de données partagée et un protocole SSO.
Déclaration d'un nouveau site client
Pour intégrer un nouveau site dans l'écosystème, ajoutez-le dans le tableau AVAILABLE_SITES du fichier T:\Kodeix\Portail Kodeix\lib\sites.ts :
TypeScript (lib/sites.ts)
export interface SiteConfig {
id: string; // Identifiant unique
name: string; // Nom
description: string; // Description
url: string; // URL en production
localUrl: string; // URL locale de dev (ex: http://localhost:3003)
}
export const AVAILABLE_SITES: SiteConfig[] = [
{
id: "nouveau-site",
name: "Nouveau Site Client",
description: "Site vitrine",
url: "https://nouveau-site.fr",
localUrl: "http://localhost:3003"
}
];
Attribution de droits
Pour qu'un utilisateur du Portail puisse administrer ce site, ajoutez l'ID du site (ex: "nouveau-site") dans le tableau sites de son document MongoDB dans la collection user.
Guide Développeur : Authentification SSO (JWT)
Le Portail génère un token JWT signé avec une clé partagée ADMIN_SECRET_KEY. Ce token est envoyé au conteneur client pour créer une session d'administration locale sécurisée.
Route d'auto-login client
Le site client doit implémenter une API de connexion SSO dans app/api/auth/sso/route.ts :
TypeScript (Next.js Route Handler)
import { NextRequest, NextResponse } from 'next/server';
import crypto from 'crypto';
function verifyJwt(token: string, secret: string): any {
try {
const [headerB64, payloadB64, signatureB64] = token.split('.');
const expectedSig = crypto
.createHmac('sha256', secret)
.update(`${headerB64}.${payloadB64}`)
.digest('base64url');
if (expectedSig !== signatureB64) return null;
const payload = JSON.parse(Buffer.from(payloadB64, 'base64url').toString());
if (payload.exp && Date.now() / 1000 > payload.exp) return null;
return payload;
} catch {
return null;
}
}
export async function GET(req: NextRequest) {
const { searchParams } = new URL(req.url);
const token = searchParams.get('token');
if (!token) return new NextResponse('Token manquant', { status: 400 });
const secretKey = process.env.ADMIN_SECRET_KEY || 'default-secret-key';
const decoded = verifyJwt(token, secretKey);
if (!decoded || !decoded.authenticated) {
return new NextResponse('Non autorisé', { status: 403 });
}
const response = NextResponse.redirect(new URL('/?editMode=true', req.url));
response.cookies.set('admin_session', 'true', {
httpOnly: true,
secure: true,
sameSite: 'none', // Nécessaire car le site est embarqué dans l'iframe du Portail
maxAge: 60 * 60 * 2, // 2 heures
path: '/',
});
return response;
}
Guide Développeur : Les composants du CMS
Le système d'édition repose sur le composant parent SettingsProvider et les composants d'édition visuels associés.
Configuration de l'API de sauvegarde groupée
Pour minimiser les appels réseaux et optimiser les performances, l'API côté client doit accepter les mises à jour groupées (Bulk Write) sur le modèle de configuration MongoDB :
TypeScript (Next.js Settings API)
import { NextRequest, NextResponse } from 'next/server';
import connectDB from '@/lib/mongodb';
import Setting from '@/models/Setting';
export async function PUT(req: NextRequest) {
try {
await connectDB();
if (req.cookies.get('admin_session')?.value !== 'true') {
return new NextResponse('Non autorisé', { status: 401 });
}
const { changes } = await req.json(); // format: { [key]: value }
if (!changes) return new NextResponse('Données manquantes', { status: 400 });
const bulkOps = Object.entries(changes).map(([key, value]) => ({
updateOne: {
filter: { key },
update: { $set: { value } },
upsert: true
}
}));
await Setting.bulkWrite(bulkOps);
return NextResponse.json({ success: true });
} catch (error: any) {
return new NextResponse(error.message, { status: 500 });
}
}
Utilisation des composants CMS dans vos pages
EditableText
Rend un bloc de texte modifiable avec l'attribut contentEditable.
Chaque conteneur Next.js doit être compilé avec le mode de sortie standalone pour minimiser l'usage mémoire.
1. Dockerfile Standardisé
Dockerfile
FROM node:18-alpine AS base
FROM base AS deps
WORKDIR /app
COPY package.json package-lock.json* ./
RUN npm ci
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
ENV NEXT_TELEMETRY_DISABLED 1
RUN npm run build
FROM base AS runner
WORKDIR /app
ENV NODE_ENV production
ENV PORT 3000
ENV HOSTNAME "0.0.0.0"
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]
2. Configuration Reverse Proxy (Nginx)
Le reverse proxy assure l'acheminement des sous-domaines vers les conteneurs Docker appropriés :
This section serves as a direct instruction set for AI coding assistants modifying or expanding client sites within the Kodeix CMS eco-system.
Attention AI Agent: You MUST read and follow these directives. Failure to adhere to these rules violates project structural and aesthetic guidelines.
Rule 1: Maintain Codebase Cleanliness
No Emojis in Code files: You are strictly forbidden from placing emoji characters inside HTML tags, text nodes, page layouts, or source code. Always use modern, responsive SVG vector graphics or React-icons.
Preserve Unrelated Comments: Do not remove existing JSDoc documentation, code comments, or configuration files unless requested.
Local Scratch Storage: Store temporary test scripts or database seeders only inside the designated /scratch directory under the conversation identifier. Do not pollute the main repository.
AI System Directives: Aesthetics & Design System
Every interface must feel premium, fluid, and visually harmonious. Follow these styling restrictions when generating components or adjusting Tailwind CSS grids:
Typography Limit
NEVER use font-black (weight 900) or extra heavy weights. Title weights must be restricted to font-bold (700) maximum to maintain elegant font hierarchies.
Border Roundings
Card blocks, grid items, and gallery images must utilize soft, modern borders. Apply Tailwind classes like rounded-xl (12px) or rounded-2xl (16px) exclusively.
Tactile Feedback
Ensure that all interactive elements, buttons, cards, social icons, and dropdown toggles feature a responsive micro-interaction scaling class: active:scale-95.
Color Harmonies & Theme Best Practices
Custom HSL Colors: Do not utilize default saturated raw colors (e.g. standard Tailwind `bg-red-500` or raw hex `#ff0000`). Prefer HSL variables synced with the active theme context.
Dark Mode Consistency: Maintain light/dark theme variables using the [data-theme="dark"] attribute or system preferences. Ensure text maintains high contrast ratios in both modes.
Glassmorphism: Use backdrop-filter: blur(12px) alongside transparent white/black borders to construct premium modern headers and floating bars.
AI System Directives: CMS & Hydration Standards
Inline visual CMS editing requires a decoupled data-binding architecture. Ensure your changes do not conflict with React's reconciliation steps.
Hydration Warning: Wrapping inline text components inside nested block-level containers (like a <div> inside an <h1> or <p>) triggers severe client-side React hydration errors, which crashes the DOM and leaves page opacity at 0.
Preventing Hydration Warnings
Dynamic Element Selection in EditableText: Use a dynamic React wrapper tag based on the target element. E.g., if rendering an as="span", ensure the outer element is typed as a span so that HTML nesting remains semantic and valid.
Server-Side Pre-Rendering (SSR): To eliminate text flickering during load (layout shift), ensure that layout.tsx fetches settings directly from the MongoDB database at build/request time and initializes the `SettingsProvider` context via initialSettings.
Whitespace Control: Long text fields (e.g. Terms of Service, Legal Articles) must respect line breaks. Always apply the CSS style white-space: pre-line or Tailwind's whitespace-pre-line on editable text containers.
All updates must pass build integration tests and remain fully optimized for SEO crawler indexing.
1. End-to-End Testing (Selectors)
To enable Playwright and Cypress test suites to easily interact with dynamic fields:
Every editable element must contain a unique, static id attribute.
Buttons, text inputs, and link wrappers should include a data attribute (e.g. data-testid="cms-save-btn") for easy selection.
2. SEO Best Practices
Heading Hierarchy: Ensure there is only one<h1> element per page.
Meta Tag Definition: Always append proper metadata descriptions and localized SEO fields to the Next.js page files.
Alt Text Accessibility: Always supply descriptive alt texts dynamically to <img> tags. For EditableImage, save the alt text dynamically alongside its URL if possible.