docs: add comprehensive project documentation (DOCUMENTATION.md)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
20c8280e4a
commit
3c97378c46
1 changed files with 256 additions and 0 deletions
256
DOCUMENTATION.md
Normal file
256
DOCUMENTATION.md
Normal file
|
|
@ -0,0 +1,256 @@
|
||||||
|
# CV Web — Stéphane Liabeuf
|
||||||
|
|
||||||
|
> CV en ligne auto-hébergé, multi-versions et multi-thèmes, déployé automatiquement via Forgejo + Coolify.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Présentation du projet
|
||||||
|
|
||||||
|
Ce projet est un **CV interactif 100 % auto-hébergé**, conçu pour être présenté à des interlocuteurs différents (recruteurs, clients, DSI, équipes UX) avec une version adaptée à chaque cible, le tout à partir d'un seul fichier HTML et de fichiers de données JSON interchangeables.
|
||||||
|
|
||||||
|
Le site est accessible à l'adresse : **https://cv.stephaneliabeuf.fr**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architecture technique
|
||||||
|
|
||||||
|
### Principe fondamental
|
||||||
|
|
||||||
|
L'ensemble du rendu est assuré par un **seul fichier `index.html`** qui :
|
||||||
|
|
||||||
|
1. Lit le paramètre d'URL `?cv=` pour sélectionner le fichier JSON à charger
|
||||||
|
2. Fetche le JSON correspondant via `fetch()`
|
||||||
|
3. Injecte dynamiquement tout le contenu dans le DOM (hero, nav, expériences, compétences, secteurs, formation, footer)
|
||||||
|
4. Applique le thème visuel choisi (stocké en `localStorage`)
|
||||||
|
|
||||||
|
Aucun framework, aucun bundler, aucune dépendance serveur — le site est du **HTML/CSS/JS vanilla** servi par Nginx.
|
||||||
|
|
||||||
|
### Fichiers du projet
|
||||||
|
|
||||||
|
```
|
||||||
|
cv-web-liabeuf/
|
||||||
|
├── index.html ← Moteur de rendu unique (HTML + CSS + JS)
|
||||||
|
├── cv-data.json ← Version maître (Directeur Conseil Service)
|
||||||
|
├── cv-data-ux.json ← Version UX & Digital Manager
|
||||||
|
├── cv-data-dsi.json ← Version Directeur SI & Transformation Digitale
|
||||||
|
├── infrastructure.html ← Page dédiée à la stack technique du projet
|
||||||
|
├── favicon.svg ← Favicon SVG initiales SL + dégradé Cornerstone CGI
|
||||||
|
├── DOCUMENTATION.md ← Ce fichier
|
||||||
|
└── .gitignore ← Exclut .claude/ (dossier de travail Claude Code)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Versions du CV
|
||||||
|
|
||||||
|
Le paramètre `?cv=` dans l'URL permet de charger une version différente du CV sans changer l'URL de base :
|
||||||
|
|
||||||
|
| URL | Fichier JSON | Cible |
|
||||||
|
|-----|-------------|-------|
|
||||||
|
| `cv.stephaneliabeuf.fr` | `cv-data.json` | Version généraliste (défaut) |
|
||||||
|
| `cv.stephaneliabeuf.fr?cv=ux` | `cv-data-ux.json` | Recruteurs UX / Digital |
|
||||||
|
| `cv.stephaneliabeuf.fr?cv=dsi` | `cv-data-dsi.json` | DSI / Directions SI |
|
||||||
|
|
||||||
|
Le paramètre `?cv=` est **transparent** : il n'est pas affiché dans l'interface, seule l'URL change. Il est automatiquement propagé vers la page `infrastructure.html` et conservé lors du retour au CV.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Structure d'un fichier JSON de données
|
||||||
|
|
||||||
|
Chaque fichier JSON suit la même structure :
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"identity": {
|
||||||
|
"prenom": "Stéphane",
|
||||||
|
"nom": "Liabeuf",
|
||||||
|
"titre": "...",
|
||||||
|
"entreprise": "CGI Group",
|
||||||
|
"localisation": "Clermont-Ferrand",
|
||||||
|
"accroche": "...",
|
||||||
|
"description": "...",
|
||||||
|
"disponibilite": "...",
|
||||||
|
"contact": {
|
||||||
|
"email": "",
|
||||||
|
"telephone": "",
|
||||||
|
"linkedin": "https://www.linkedin.com/in/stephaneliabeuf/",
|
||||||
|
"github": "",
|
||||||
|
"site": "https://www.stephaneliabeuf.fr"
|
||||||
|
},
|
||||||
|
"seo": {
|
||||||
|
"title": "...",
|
||||||
|
"description": "...",
|
||||||
|
"keywords": "...",
|
||||||
|
"og_image": "...",
|
||||||
|
"canonical": "..."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"stats": [ { "valeur": "25+", "label": "années XP" } ],
|
||||||
|
"experiences": [
|
||||||
|
{
|
||||||
|
"groupe": "CGI // Directeur Conseil Service",
|
||||||
|
"groupe_style": "primary",
|
||||||
|
"postes": [
|
||||||
|
{
|
||||||
|
"periode": "...",
|
||||||
|
"entreprise": "...",
|
||||||
|
"role": "...",
|
||||||
|
"programme": "...",
|
||||||
|
"objectif": "...",
|
||||||
|
"description": "...",
|
||||||
|
"resultats": ["..."],
|
||||||
|
"tags": ["Tag:mag", "Tag:grn"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"competences": [
|
||||||
|
{
|
||||||
|
"categorie": "Techniques",
|
||||||
|
"items": [
|
||||||
|
{ "nom": "Gestion de projet", "annees": "25A", "niveau": 100, "label": "EXPERT" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"secteurs": ["User Experience", "E-Commerce", "..."],
|
||||||
|
"formation": [
|
||||||
|
{ "annee": "1999", "diplome": "...", "etablissement": "...", "details": "..." }
|
||||||
|
],
|
||||||
|
"certifications": ["CMMI", "PMI (2005)", "..."]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Système de tags colorés
|
||||||
|
|
||||||
|
Les tags d'expérience acceptent un suffixe de couleur :
|
||||||
|
|
||||||
|
| Syntaxe | Couleur |
|
||||||
|
|---------|---------|
|
||||||
|
| `"Tag:mag"` | Magenta / accent |
|
||||||
|
| `"Tag:grn"` | Vert succès |
|
||||||
|
| `"Tag"` (sans suffixe) | Couleur neutre du thème |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Thèmes visuels
|
||||||
|
|
||||||
|
Le site propose 4 thèmes accessibles via le **menu burger** (icône ≡ en haut à droite) :
|
||||||
|
|
||||||
|
| Thème | Identifiant | Ambiance |
|
||||||
|
|-------|------------|---------|
|
||||||
|
| ⚡ Cyberpunk | `cyberpunk` | Fond noir, néons cyan/magenta, police Orbitron |
|
||||||
|
| 💥 Bande Dessinée | `bd` | Fond papier, bulles, ombres portées, Comic Neue |
|
||||||
|
| 💼 IT Professionnel | `itpro` | Bleu corporate, clean, Inter |
|
||||||
|
| ◆ CGI | `cgi` | Branding officiel CGI — violet #5236AB, dégradé Cornerstone |
|
||||||
|
|
||||||
|
Le thème choisi est persisté en `localStorage` et restauré à chaque visite.
|
||||||
|
|
||||||
|
Le **dégradé Cornerstone CGI** (`#E31937 → #A82465 → #5236AB`) est appliqué sur le prénom, les bordures hero, les barres de compétences et les éléments d'accent du thème CGI.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fonctionnalités
|
||||||
|
|
||||||
|
### Navigation & UX
|
||||||
|
- **Barre de progression de lecture** — fine barre colorée (adaptée au thème) en `position: fixed; top: 0` qui avance au scroll
|
||||||
|
- **Ancre active dans la nav** — `IntersectionObserver` sur les 4 sections, highlight du lien courant
|
||||||
|
- **Scroll reveal** — les sections apparaissent en `fadeIn` à l'entrée dans le viewport
|
||||||
|
- **Typing effect** — animation de saisie sur le badge "Bienvenue sur le CV en ligne de"
|
||||||
|
|
||||||
|
### SEO & partage
|
||||||
|
- **Métadonnées OG dynamiques** — `og:title`, `og:description`, `og:image`, `twitter:card` injectés depuis le champ `seo` du JSON, spécifiques à chaque version `?cv=`
|
||||||
|
- **Schema.org Person** — données structurées JSON-LD injectées dynamiquement
|
||||||
|
- **Favicon SVG** — initiales SL sur fond dégradé Cornerstone, rendu parfait dans tous les navigateurs
|
||||||
|
|
||||||
|
### Export
|
||||||
|
- **Bouton ⬇ PDF** dans la nav — déclenche `window.print()` avec un CSS `@media print` dédié : fond blanc, typo Georgia, sections lisibles, progress bar et boutons masqués
|
||||||
|
|
||||||
|
### Multi-versions
|
||||||
|
- **Routing JSON par URL** — `?cv=ux` → `cv-data-ux.json`, `?cv=dsi` → `cv-data-dsi.json`, défaut → `cv-data.json`
|
||||||
|
- **Propagation du paramètre** — le lien "Voir mon infrastructure" et le bouton "Retour au CV" conservent le `?cv=` actif
|
||||||
|
|
||||||
|
### Page Infrastructure
|
||||||
|
- Page `infrastructure.html` décrivant la stack complète : Edition → Forgejo → Coolify → Nginx → HTTPS
|
||||||
|
- Lien retour dynamique vers `index.html?cv={param}` via `URLSearchParams`
|
||||||
|
- Favicon et bouton retour intégrés
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Infrastructure de déploiement
|
||||||
|
|
||||||
|
```
|
||||||
|
Local (dev)
|
||||||
|
│
|
||||||
|
├── Antigravity (GUI Git)
|
||||||
|
├── Claude Code (IA — worktree isolé)
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
Forgejo (forge.stephaneliabeuf.fr)
|
||||||
|
│ Auto-hébergé · Dépôt privé · Historique complet
|
||||||
|
│
|
||||||
|
▼ webhook push
|
||||||
|
Coolify (orchestrateur auto-hébergé)
|
||||||
|
│ Détecte chaque push sur main · Build · Rolling update
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
Conteneur Nginx
|
||||||
|
│ Sert les fichiers statiques (HTML, CSS, JS, JSON, SVG)
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
https://cv.stephaneliabeuf.fr
|
||||||
|
└── SSL/TLS géré par Coolify (Let's Encrypt)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Workflow de développement
|
||||||
|
|
||||||
|
1. **Claude Code** travaille dans un **worktree git isolé** (`/.claude/worktrees/...`)
|
||||||
|
2. Les modifications sont commitées et poussées directement sur `main` (pas de PR)
|
||||||
|
3. Coolify détecte le push et redéploie automatiquement
|
||||||
|
4. Le développeur fait `git pull` en local pour resynchroniser son repo
|
||||||
|
|
||||||
|
Le worktree est exclu du dépôt via `.gitignore` (`.claude/`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ajouter une nouvelle version de CV
|
||||||
|
|
||||||
|
1. Créer `cv-data-{nom}.json` en copiant la structure de `cv-data.json`
|
||||||
|
2. Adapter `identity`, `stats`, `experiences`, `competences`, `secteurs`, `formation`
|
||||||
|
3. Ajouter `{nom}` à la liste `cvAllowed` dans `index.html` :
|
||||||
|
```javascript
|
||||||
|
const cvAllowed = ['ux', 'dsi', '{nom}'];
|
||||||
|
```
|
||||||
|
4. Commiter et pusher — Coolify déploie automatiquement
|
||||||
|
5. Accès : `https://cv.stephaneliabeuf.fr?cv={nom}`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ajouter un nouveau thème
|
||||||
|
|
||||||
|
1. Dans `index.html`, ajouter un bloc CSS `[data-theme="montheme"] { ... }` en ciblant les sélecteurs existants
|
||||||
|
2. Ajouter le bouton dans `#theme-menu` :
|
||||||
|
```html
|
||||||
|
<button class="theme-btn btn-montheme" onclick="setTheme('montheme')">🎨 MON THÈME</button>
|
||||||
|
```
|
||||||
|
3. Ajouter le style du bouton `.theme-btn.btn-montheme { ... }`
|
||||||
|
4. Ajouter `'montheme'` dans la liste de validation de `setTheme()`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Technologies utilisées
|
||||||
|
|
||||||
|
| Composant | Technologie |
|
||||||
|
|-----------|-------------|
|
||||||
|
| Rendu | HTML5 / CSS3 / JS vanilla |
|
||||||
|
| Fonts | Google Fonts (Orbitron, Share Tech Mono, Comic Neue, Inter) |
|
||||||
|
| Icône | SVG inline (favicon) |
|
||||||
|
| Hébergement | Nginx (conteneur Docker via Coolify) |
|
||||||
|
| Git | Forgejo (auto-hébergé) |
|
||||||
|
| CI/CD | Coolify (webhook → deploy automatique) |
|
||||||
|
| SSL | Let's Encrypt via Coolify |
|
||||||
|
| Dev IA | Claude Code (Anthropic) |
|
||||||
|
| GUI Git | Antigravity |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Documentation — Mai 2026*
|
||||||
Loading…
Reference in a new issue