Démarrer un projet
Guide complet pour créer un nouveau site, le déployer en production, et adapter le boilerplate selon vos besoins.
Créer un nouveau projet
1. Copier le boilerplate
Dupliquez le dossier site-system/ et renommez-le avec le nom de votre projet :
cp -r site-system/ mon-projet/
cd mon-projet/
2. Personnaliser la charte graphique
Ouvrez core/css/tokens.css et modifiez les variables CSS :
:root {
/* Couleurs */
--color-primary: #2563eb; /* Couleur principale */
--color-secondary: #7c3aed; /* Couleur secondaire */
--color-bg: #ffffff; /* Fond */
--color-text: #1e293b; /* Texte */
/* Polices */
--font-sans: 'Inter', sans-serif;
--font-heading: 'Inter', sans-serif;
/* Arrondis, espacements, etc. */
}
Voir Design Tokens pour la référence complète.
3. Configurer le site
Éditez config-site.js. Ce fichier centralise la configuration des modules :
- COOKIES_CONFIG : IDs analytics (
ga4,gtm,clarity, etc.), textes du bandeau RGPD, lien vers la politique de confidentialité - BLOG_CONFIG : connexion Baserow (voir section Site sans blog si non utilisé)
- LEGAL_CONFIG : informations légales de l'entreprise (nom, SIRET, adresse, hébergeur, etc.)
Voir Cookies & Analytics pour le détail de chaque champ.
4. Remplir les informations légales
Dans config-site.js, complétez le bloc LEGAL_CONFIG avec vos informations :
window.LEGAL_CONFIG = {
company: 'Ma Societe SAS',
legalForm: 'SAS',
siret: '123 456 789 00000',
registration: 'RCS Paris',
representative: 'Jean Dupont',
address: '123 rue Exemple, 75000 Paris',
phone: '+33 1 23 45 67 89',
email: 'contact@monsite.fr',
website: 'https://monsite.fr',
hosting: {
name: 'OVH',
address: '2 rue Kellermann, 59100 Roubaix',
url: 'https://www.ovh.com',
contact: 'https://www.ovh.com/fr/support/'
},
developer: { // Optionnel, masque si name est vide
name: '', url: '', address: ''
}
};
Les pages mentions-legales.html et confidentialite.html sont fournies
et se remplissent automatiquement avec ces informations. Les champs vides affichent un placeholder
[NOM_DU_CHAMP] pour vous aider à identifier les manques.
N'oubliez pas de configurer aussi privacyUrl dans la bannière cookies
pour que le lien vers la politique de confidentialité apparaisse dans le bandeau :
banner: {
privacyUrl: '/confidentialite.html',
privacyText: 'Politique de confidentialite',
// ...
}
Important : les textes légaux fournis sont des modèles génériques. Faites-les valider par un professionnel du droit avant mise en production.
Voir Pages légales pour le détail de chaque champ.
5. Composants (header, footer, card)
Chaque composant se configure directement dans le HTML via des attributs data-*
(pour les valeurs simples) et des <template data-slot> (pour le contenu HTML riche).
- Header :
data-site-name,data-logo-link,data-logo-src, slotsnav,cta,search - Footer :
data-copyright, slotcontent - Card :
data-title,data-text,data-image,data-image-alt, slotfooter
Les composants (components/*.js) ne sont à modifier que si vous changez la structure HTML. Voir Composants pour le détail.
6. Créer vos pages
Copiez snippets/page.html comme modèle pour chaque nouvelle page. Structure minimale :
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ma Page — Mon Site</title>
<meta name="description" content="Description SEO de la page.">
<!-- Dark mode + Config (synchrone) -->
<script src="core/js/darkmode.js"></script>
<script src="config-site.js"></script>
<!-- CSS (requis) -->
<link rel="stylesheet" href="core/css/tokens.css">
<link rel="stylesheet" href="core/css/base.css">
<link rel="stylesheet" href="core/css/cookies.css">
<!-- CSS (optionnel — ajoutez selon vos besoins) -->
<link rel="stylesheet" href="core/css/animations.css">
<link rel="stylesheet" href="core/css/elements.css">
<link rel="stylesheet" href="core/css/forms.css">
<link rel="stylesheet" href="core/css/grid.css">
<link rel="stylesheet" href="core/css/icons.css">
<!-- <link rel="stylesheet" href="core/css/blog.css"> -->
<!-- Composants (synchrone) -->
<script src="core/js/components.js"></script>
<script src="components/header.js"></script>
<script src="components/footer.js"></script>
<!-- JS interactifs (defer — ajoutez selon vos besoins) -->
<script src="core/js/animations.js" defer></script>
<script src="core/js/elements.js" defer></script>
<script src="core/js/forms.js" defer></script>
<script src="core/js/icons.js" defer></script>
<script src="core/js/params.js" defer></script>
<script src="core/js/cookies.js" defer></script>
</head>
<body>
<!-- Header : attributs + slots -->
<div data-component="header"
data-site-name="Mon Site"
data-logo-link="/index.html">
<template data-slot="nav">
<a href="/index.html">Accueil</a>
<a href="/contact.html">Contact</a>
</template>
</div>
<div class="container">
<!-- Votre contenu ici -->
</div>
<!-- Footer : attributs + slots -->
<div data-component="footer"
data-copyright="© 2026 Mon Site">
<template data-slot="content">
<nav class="footer__links">
<a href="/mentions-legales.html">Mentions legales</a>
<a href="/confidentialite.html">Confidentialite</a>
</nav>
</template>
</div>
</body>
</html>
7. Tester en local
Ouvrez le projet avec VS Code + Live Server ou n'importe quel serveur local :
# Option 1 : VS Code Live Server (extension)
# Clic droit sur index.html → "Open with Live Server"
# Option 2 : Python
python3 -m http.server 8000
# Option 3 : Node.js (npx)
npx serve .
Les liens internes utilisent .html pour fonctionner partout (Live Server, file://, etc.). En production, le .htaccess redirige vers des URLs propres.
Git & GitHub
Versionnez votre projet avec Git et hébergez-le sur GitHub pour collaborer, garder un historique, et faciliter le déploiement.
1. Initialiser Git
Dans le dossier de votre projet :
# Initialiser le dépôt Git
git init
# Ajouter tous les fichiers
git add -A
# Premier commit
git commit -m "Initial commit"
2. Créer le dépôt GitHub
Créez un nouveau dépôt sur github.com/new, puis liez-le à votre projet local :
# Lier le dépôt distant
git remote add origin https://github.com/votre-user/votre-projet.git
# Pousser le code
git push -u origin main
L'option -u configure le tracking : les prochains git push n'auront plus besoin de préciser origin main.
3. Workflow quotidien
Les commandes Git que vous utiliserez au quotidien :
# Voir l'état des fichiers modifiés
git status
# Voir les modifications en détail
git diff
# Ajouter tous les fichiers modifiés
git add -A
# Ajouter un fichier spécifique
git add chemin/du/fichier.html
# Créer un commit avec un message descriptif
git commit -m "Add contact page with form validation"
# Pousser sur GitHub
git push
# Récupérer les dernières modifications (si travail en équipe)
git pull
4. Bonnes pratiques commits
- Un commit = une modification logique (pas 10 changements différents dans un seul commit)
- Messages en anglais, courts et descriptifs :
Add,Fix,Update,Remove - Exemples :
"Add hero section to homepage","Fix mobile nav toggle","Update color tokens"
5. Fichier .gitignore
Assurez-vous que les fichiers sensibles ou inutiles ne sont pas versionnés :
# Fichiers à ignorer dans .gitignore
.env
.DS_Store
Thumbs.db
node_modules/
.claude/
data/consents.csv
Mise en production (Hostinger / Apache)
Déployez votre site sur un hébergement Hostinger (ou tout serveur Apache avec accès SSH) via rsync pour des mises à jour rapides et automatiques.
Prérequis
- Serveur Apache avec
mod_rewriteetmod_headersactivés - PHP 7+ (pour
api/baserow.phpetapi/consent.php) - Certificat SSL (Let's Encrypt ou autre)
- Accès SSH activé sur l'hébergement (Hostinger : plan Premium ou supérieur)
1. Activer et configurer SSH
Sur Hostinger, allez dans hPanel → Avancé → Accès SSH et notez :
- IP du serveur
- Port (généralement
65002chez Hostinger) - Nom d'utilisateur (ex:
u123456789)
2. Générer une clé SSH (si pas déjà fait)
# Générer une clé SSH ed25519
ssh-keygen -t ed25519 -C "votre@email.com"
# Appuyer sur Entrée pour accepter le chemin par défaut
# Choisir un mot de passe (ou Entrée pour aucun)
3. Première connexion SSH
Connectez-vous une première fois pour accepter l'empreinte du serveur :
# Remplacez USER, IP et PORT par vos valeurs
ssh -p PORT USER@IP
# Tapez "yes" pour accepter l'empreinte
# Entrez votre mot de passe SSH
# Une fois connecté, tapez "exit" pour revenir en local
4. Copier la clé publique sur le serveur
Pour ne plus avoir à taper le mot de passe à chaque déploiement :
# Copier la clé publique (demande le mot de passe une dernière fois)
ssh-copy-id -p PORT USER@IP
# Vérifier que la connexion fonctionne sans mot de passe
ssh -p PORT USER@IP "echo 'SSH OK'"
5. Identifier le dossier du domaine
Sur Hostinger, chaque domaine a son propre dossier. Connectez-vous en SSH pour le trouver :
ssh -p PORT USER@IP
ls ~/domains/
# Résultat : monsite.fr autre-site.com ...
exit
Le chemin de déploiement sera : /home/USER/domains/monsite.fr/public_html/
6. Créer le fichier d'exclusions
Créez un fichier .rsync-exclude à la racine du projet pour lister les fichiers à ne pas envoyer sur le serveur :
# .rsync-exclude
# Git
.git/
.gitignore
# Dev tools
CLAUDE.md
.claude/
# Secrets
.env
# Fichiers de dev
generate-sitemap.js
deploy.sh
.rsync-exclude
# OS files
.DS_Store
Thumbs.db
Note : n'excluez que les fichiers de développement. Les dossiers docs/, wireframes/, snippets/ ou tout autre contenu utile en production doivent être conservés.
7. Créer le script de déploiement
Créez un fichier deploy.sh à la racine du projet :
#!/bin/bash
# Deploy site to production
# Usage: ./deploy.sh [--dry-run]
REMOTE_USER="USER"
REMOTE_HOST="IP"
REMOTE_PORT="PORT"
REMOTE_PATH="/home/USER/domains/monsite.fr/public_html/"
LOCAL_PATH="/chemin/vers/mon-projet/"
EXCLUDE_FILE="${LOCAL_PATH}.rsync-exclude"
# Colors
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# Check for --dry-run flag
DRY_RUN=""
if [ "$1" = "--dry-run" ]; then
DRY_RUN="--dry-run"
echo -e "${YELLOW}Mode dry-run : aucun fichier ne sera modifie${NC}"
fi
echo -e "${GREEN}Deploiement vers ${REMOTE_HOST}...${NC}"
rsync -avz --delete \
--exclude-from="$EXCLUDE_FILE" \
-e "ssh -p ${REMOTE_PORT}" \
$DRY_RUN \
"$LOCAL_PATH" \
"${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}"
if [ $? -eq 0 ]; then
echo -e "${GREEN}Deploiement termine !${NC}"
else
echo -e "\033[0;31mErreur lors du deploiement.${NC}"
exit 1
fi
Rendez le script exécutable :
chmod +x deploy.sh
8. Déployer
# Simuler le déploiement (voir ce qui sera envoyé, sans rien modifier)
./deploy.sh --dry-run
# Déployer pour de vrai
./deploy.sh
Comment ça marche :
rsyncne transfère que les fichiers modifiés (très rapide après le premier déploiement)--deletesupprime sur le serveur les fichiers supprimés en local (synchronisation miroir)--dry-runsimule sans rien modifier, parfait pour vérifier avant de déployer
9. Configurer le fichier .env sur le serveur
Le fichier .env n'est pas envoyé par rsync (exclu volontairement). Créez-le directement sur le serveur :
# Se connecter au serveur
ssh -p PORT USER@IP
# Créer le .env dans le dossier du site
cat > ~/domains/monsite.fr/public_html/.env << 'EOF'
SITE_ORIGIN=https://monsite.fr
BASEROW_TOKEN=votre_token_api_ici
BASEROW_URL=https://api.baserow.io
EOF
exit
Ce fichier est automatiquement protégé par le .htaccess (inaccessible depuis le web). SITE_ORIGIN est utilisé par le proxy blog et l'endpoint de consentement pour restreindre les requêtes CORS à votre domaine.
10. Vérifier le .htaccess
Le fichier .htaccess fourni gère automatiquement :
- HTTPS : redirection HTTP → HTTPS (301)
- URLs propres :
/blogau lieu de/blog.html - Page 404 : page d'erreur personnalisée
- Sécurité : headers de sécurité, accès aux dossiers désactivé,
.envprotégé - Anti-cache CDN : désactive le cache LiteSpeed/HCDN sur les fichiers CSS, JS et HTML pour que chaque déploiement soit immédiatement visible (headers
no-cache,CDN-Cache-Control: no-store,CacheLookup off)
Testez que mod_rewrite fonctionne en accédant à https://votre-site.fr/blog (sans .html).
11. Générer le sitemap
node generate-sitemap.js https://votre-site.fr
Cela crée sitemap.xml et robots.txt avec les URLs propres. Soumettez le sitemap dans Google Search Console.
Récap : workflow complet
Une fois tout configuré, le cycle de développement-déploiement est simple :
# 1. Modifier le code en local (Live Server pour prévisualiser)
# 2. Commiter les changements
git add -A
git commit -m "Update hero section design"
# 3. Pousser sur GitHub
git push
# 4. Déployer en production
./deploy.sh
6. Checklist de lancement
- ☐
tokens.css: couleurs principales (--color-primary,--color-secondary) - ☐
tokens.css: polices personnalisées (--font-heading,--font-body) - ☐
tokens.css: arrondis, ombres, conteneur max-width si besoin - ☐ Favicon ajouté (
<link rel="icon">) dans toutes les pages - ☐ Test dark mode : toutes les pages lisibles en mode sombre
config-site.js)- ☐ COOKIES_CONFIG : IDs analytics renseignés (ou vides si non utilisés)
- ☐ COOKIES_CONFIG : textes du bandeau cookies adaptés
- ☐ COOKIES_CONFIG :
privacyUrlpointe vers/confidentialite.html - ☐ COOKIES_CONFIG :
consentEndpointconfiguré (/api/consent.php) - ☐ BLOG_CONFIG : connexion Baserow renseignée (si blog)
- ☐ LEGAL_CONFIG : toutes les infos entreprise remplies (company, SIRET, adresse, etc.)
- ☐ LEGAL_CONFIG : infos hébergeur remplies (nom, adresse, URL)
- ☐ LEGAL_CONFIG : section développeur remplie ou laissée vide (masquée automatiquement)
- ☐
mentions-legales.html: ouvrir et vérifier que toutes les infos s'affichent (pas de[...]) - ☐
confidentialite.html: vérifier le tableau cookies (doit lister les services configurés) - ☐ Bouton « Gérer mes préférences cookies » fonctionnel sur la page confidentialité
- ☐ Bandeau cookies : lien vers la politique de confidentialité visible
- ☐ Footer de chaque page : liens vers mentions légales et confidentialité
- ☐ Textes légaux validés par un professionnel du droit
- ☐
api/consent.phpfonctionnel (tester un accept/refus et vérifierdata/consents.csv)
- ☐ Header : logo, navigation finale, liens corrects
- ☐ Footer : copyright à jour, liens légaux présents
- ☐ Toutes les balises
<title>uniques et descriptives - ☐ Toutes les balises
<meta description>renseignées - ☐
404.html: texte et lien personnalisés - ☐
generate-sitemap.jsexécuté avec l'URL finale - ☐
robots.txtgénéré et correct
- ☐
.env:SITE_ORIGINrenseigné avec l'URL de production - ☐
.env:BASEROW_TOKENrenseigné (si blog) - ☐ HTTPS actif et fonctionnel
- ☐ URLs propres fonctionnelles (
/blogau lieu de/blog.html) - ☐
.htaccess: vérifier que.envest inaccessible depuis le navigateur - ☐
data/: vérifier que le dossier est inaccessible depuis le navigateur - ☐ Page 404 accessible (
/page-inexistante)
- ☐ Test mobile : toutes les pages responsive
- ☐ Test dark mode : lisibilité de toutes les pages
- ☐ Test bandeau cookies : accepter, refuser, personnaliser
- ☐ Test pages légales : infos dynamiques correctes
- ☐ Test blog : listing, article, filtres (si blog actif)
- ☐ Test 404 : page d'erreur personnalisée
- ☐ Test formulaires : validation, envoi (si formulaires actifs)
- ☐ Supprimer les fichiers inutiles du serveur (
docs/,.git/,snippets/)
Site sans blog
Si votre site n'a pas besoin de blog, supprimez les fichiers liés et allégez la configuration.
Fichiers à supprimer
# Pages blog
blog.html # Page listing
blog/ # Dossier contenant article.html
# Proxy API
api/ # Dossier contenant baserow.php
# Fichier environnement (si le blog était le seul usage)
.env
CSS et JS à retirer des pages
Dans chaque fichier HTML, supprimez ces lignes du <head> :
<!-- Supprimer cette ligne CSS -->
<link rel="stylesheet" href="core/css/blog.css">
<!-- Supprimer cette ligne JS -->
<script src="core/js/blog.js" defer></script>
Les fichiers core/css/blog.css et core/js/blog.js peuvent rester dans le dossier core/ sans problème (ils ne seront simplement plus chargés).
Configuration à nettoyer
Dans config-site.js, supprimez ou videz la section BLOG_CONFIG :
/* ---------- BLOG ---------- */
// Supprimez tout ce bloc si pas de blog :
window.BLOG_CONFIG = {
baserow: { url: '', token: '', tableId: '' },
perPage: 12,
dateFormat: 'fr-FR',
defaultImage: '',
articlePage: 'blog/article',
blogPage: 'blog',
};
Navigation à adapter
Retirez le lien « Blog » du slot nav dans le header de chaque page HTML.
Résumé
| Action | Fichiers concernés |
|---|---|
| Supprimer | blog.html, blog/, api/, .env |
Retirer des <head> |
blog.css, blog.js |
| Nettoyer | config-site.js (section BLOG_CONFIG) |
| Adapter | components/header.js (retirer lien Blog) |
Modules optionnels
Vous pouvez aussi retirer d'autres modules selon vos besoins. Chaque module est indépendant :
| Module | CSS | JS | Requis ? |
|---|---|---|---|
| Tokens + Base | tokens.css, base.css |
— | Oui (toujours) |
| Composants | — | components.js |
Oui (header/footer) |
| Éléments | elements.css |
elements.js |
Optionnel |
| Icônes | icons.css |
icons.js |
Optionnel |
| Grid / Bento | grid.css |
— | Optionnel |
| Formulaires | forms.css |
forms.js |
Optionnel |
| Animations | animations.css |
animations.js |
Optionnel |
| Cookies | cookies.css |
cookies.js |
Recommandé (RGPD) |
| Paramètres URL | — | params.js |
Optionnel |
| Blog | blog.css |
blog.js |
Optionnel |
| Dark Mode | — | darkmode.js |
Optionnel |
| Pages légales | — | legal.js |
Recommandé (RGPD) |
Minimum requis : tokens.css + base.css + components.js + vos composants (header.js, footer.js).
Snippets (copier-coller)
Le dossier snippets/ contient un fichier HTML par élément, prêt à copier-coller dans vos pages. Chaque fichier commence par un bloc commentaire listant toutes les classes, attributs et options disponibles.
| Fichier | Contenu |
|---|---|
popup.html |
Popup centré, panneau latéral, bottom sheet, panneau supérieur |
tabs.html |
Tabs basiques + tabs imbriqués |
accordion.html |
Accordion simple + multiple |
slider.html |
Slider avec toutes les options (loop, autoplay, draggable, per-view) |
form.html |
Formulaire simple + multi-step avec validation et conditions |
animations.html |
Animations scroll + clic + SVG |
grid.html |
Grid colonnes + bento layouts |
cookies.html |
Configuration cookies + bandeau RGPD |
darkmode.html |
Toggle dark mode + script à inclure |
page.html |
Page complète (doctype minimal avec tous les CSS/JS prêts) |
icons.html |
Icônes (usage data-icon + options) |
Ces fichiers ne sont pas des pages complètes, mais des fragments HTML à intégrer dans vos pages.