chore init
This commit is contained in:
1 parent
1b7406b1d3
commit
a0d312a884
60 files changed
+5046
-125
No files matched your search
@@ -0,0 +1,145 @@
|
||||
# 01 — Analyse fonctionnelle
|
||||
|
||||
## 1. Contexte et objectif
|
||||
|
||||
CV-Maker est une application web **sans backend** permettant à un utilisateur de créer son CV rapidement, en saisissant le contenu en **Markdown** dans des zones de saisie et en visualisant le résultat en **temps réel** sur une feuille au **format A4**.
|
||||
|
||||
- **Utilisateur cible** : une personne unique, sur poste de travail (desktop).
|
||||
- **Aucune donnée n'est envoyée à un serveur** : tout est stocké dans le navigateur (localStorage).
|
||||
- **Notation (ECF CDA)** : le projet sert de support pédagogique et doit démontrer : maîtrise de Next.js/React, composants réutilisables, gestion d'état, persistance locale, sécurité de rendu, capacité de documentation.
|
||||
|
||||
## 2. Périmètre fonctionnel
|
||||
|
||||
### 2.1 Fonctions principales (issue du GOAL.md)
|
||||
|
||||
| Réf. | Fonction | Description |
|
||||
| --- | --- | --- |
|
||||
| F1 | Éditeur temps réel | Saisie Markdown dans le panneau gauche → rendu HTML temps réel dans le panneau droit |
|
||||
| F2 | Preview A4 | Panneau droit matérialisé en feuille A4 (210 × 297 mm), impeccable à l'impression |
|
||||
| F3 | Persistance | Sauvegarde automatique dans localStorage à chaque frappe ; données restaurées au rechargement |
|
||||
| F4 | Impression PDF | Bouton d'impression → export PDF via la boîte de dialogue du navigateur |
|
||||
| F5 | Gestion des expériences | Ajout / modification / suppression d'expériences professionnelles |
|
||||
| F6 | Page documentation | Page d'aide expliquant l'utilisation et la syntaxe Markdown |
|
||||
| F7 | Page Mentions légales | Page d'information « mentions légales / vie privée » |
|
||||
| F8 | PWA | Application web installable hors-ligne (nice to have côté objectif, prévue au cahier des charges) |
|
||||
|
||||
### 2.2 Responsive / device
|
||||
|
||||
- **Desktop first** : l'expérience est optimisée pour un écran large.
|
||||
- **Tablette et mobile : nice to have** ; minimum acceptable = interface utilisable sans casse majeure. Pas de refonte dédiée.
|
||||
|
||||
## 3. Maquette fonctionnelle de l'écran principal `/`
|
||||
|
||||
### 3.1 Agencement général
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────┐
|
||||
│ Barre d'application (logo, titre, boutons : imprimer, doc) │
|
||||
├───────────────────────────────┬──────────────────────────────┤
|
||||
│ Panneau GAUCHE │ Panneau DROIT │
|
||||
│ 1/3 de la largeur │ 2/3 de la largeur │
|
||||
│ │ │
|
||||
│ [Tabs 1 ▸ 2 ▸ 3 ▸ 4 ▸ 5] │ ┌────────────────────────┐ │
|
||||
│ │ │ Feuille A4 │ │
|
||||
│ [MarkdownTextarea : │ │ ┌────────────────────┐ │ │
|
||||
│ zone active] │ │ │ Header accroche │ │ │
|
||||
│ │ │ └────────────────────┘ │ │
|
||||
│ ── SÉPARATEUR ── │ │ ┌───────┬────────────┐ │ │
|
||||
│ [Zone EXPÉRIENCES] │ │ │ 1/3 │ 2/3 │ │ │
|
||||
│ [+ Ajouter] │ │ │ Etat │ Expériences│ │ │
|
||||
│ • 1. Titre exp [Modif] [×] │ │ │ civil │ profession.│ │ │
|
||||
│ • 2. Titre exp [Modif] [×] │ │ │ Forma-│ ... │ │ │
|
||||
│ │ │ │ tions │ │ │ │
|
||||
│ │ │ │ Soft │ │ │ │
|
||||
│ │ │ │ skills│ │ │ │
|
||||
│ │ │ │ Centr.│ │ │ │
|
||||
│ │ │ │ intérêt│ │ │ │
|
||||
│ │ │ └───────┴────────────┘ │ │
|
||||
│ │ └────────────────────────┘ │
|
||||
└───────────────────────────────┴──────────────────────────────┘
|
||||
```
|
||||
|
||||
### 3.2 Panneau latéral gauche — saisie
|
||||
|
||||
#### Structure
|
||||
|
||||
- **Zones 1 à 5** gérées par un **système d'onglets (tabs)** numérotés de 1 à 5. Un seul onglet actif à la fois ; chaque onglet affiche une `textarea` Markdown dédiée.
|
||||
|
||||
| N° onglet | Zone | Champ(s) du CV associé(s) | Préfixe de navigation |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | Message d'accroche | En-tête du CV (sous le nom/poste) | |
|
||||
| 2 | État civil + contacts | Nom, prénom, adresse, e-mail, téléphone, **site web**, **lien GitHub** | |
|
||||
| 3 | Formations | Liste des formations / diplômes | |
|
||||
| 4 | Soft skills | Compétences comportementales | |
|
||||
| 5 | Centres d'intérêt | Loisirs, activités | |
|
||||
|
||||
- **Zone « Expériences »** : fonctionne **hors du système d'onglets**. Elle est toujours visible sous la zone d'onglets. Elle sert à saisir **toutes les expériences professionnelles**, une par une.
|
||||
|
||||
#### Interactions zone expériences
|
||||
|
||||
1. **Bouton `+`** : ajoute une nouvelle expérience.
|
||||
2. Une **liste numérotée** s'affiche sous la zone de saisie : chaque entrée affiche le titre de l'expérience avec deux actions :
|
||||
- **`Modifier`** (bouton édition) : recharge le contenu de l'expérience dans la zone de saisie pour modification ;
|
||||
- **`×`** (bouton suppression) : supprime l'expérience (avec confirmation).
|
||||
3. Toute nouvelle expérience s'ajoute **en bas** de la section « Expériences professionnelles » du CV : l'ordre d'affichage suit **l'ordre de saisie** (la 1ʳᵉ expérience ajoutée reste en haut, numérotée 1).
|
||||
4. La liste est numérotée dans l'ordre d'affichage (1, 2, 3… correspondant à la position dans le CV).
|
||||
|
||||
### 3.3 Panneau latéral droit — preview A4
|
||||
|
||||
- Une seule feuille blanche au **format A4** (210 × 297 mm), avec une marge définie, représentant 1 page de CV.
|
||||
- **Header** (toute la largeur de la feuille) : rendu de l'**onglet 1 — message d'accroche**.
|
||||
- **Colonne gauche (1/3 de la largeur utile)** : rendus des sections correspondant aux **onglets 2 à 5** :
|
||||
- État civil (zone 2) : contacts, site web, GitHub ;
|
||||
- Formations (zone 3) ;
|
||||
- Soft skills (zone 4) ;
|
||||
- Centres d'intérêt (zone 5).
|
||||
- **Colonne droite (2/3 de la largeur utile)** : rendu des **expériences professionnelles**, sous le titre fixe **« Expériences professionnelles »**.
|
||||
- Le rendu est **temps réel** : toute frappe dans une zone de saisie met à jour la zone cible correspondante instantanément.
|
||||
|
||||
### 3.4 Barre d'application (en-tête de l'application)
|
||||
|
||||
Éléments minimaux :
|
||||
- Nom applicatif « CV-Maker » / logo ;
|
||||
- Bouton **Imprimer / PDF** (déclenche `window.print()`) ;
|
||||
- Boutons **Importer JSON** puis **Exporter JSON** (partage de CV entre appareils) ;
|
||||
- Bouton **Réinitialiser** (après confirmation) ;
|
||||
- Lien vers la page **Documentation** ;
|
||||
- Pied de page : lien vers la page **Mentions légales** ;
|
||||
- Sauvegarde automatique silencieuse (aucun indicateur de statut — inutile vu l'enregistrement à chaque frappe).
|
||||
|
||||
## 4. Pages
|
||||
|
||||
| Route | Rôle |
|
||||
| --- | --- |
|
||||
| `/` | Éditeur principal (2 colonnes) |
|
||||
| `/documentation` | Aide : prise en main + rappel syntaxe Markdown supportée |
|
||||
| `/mentions-legales` | Informations vie privée / traitement des données (localOnly) |
|
||||
|
||||
## 5. Contraintes transverses
|
||||
|
||||
- **Desktop first** : design optimisé ≥ 1024 px ; grille responsive en repli simple (colonnes empilées) sous 768 px.
|
||||
- **No backend** : aucune API, aucun appel réseau. Les pages `/documentation` et `/mentions-legales` sont statiques.
|
||||
- **Rendu Markdown sécurisé** : HTML produit par `marked` puis **assaini par DOMPurify** avant injection.
|
||||
- **Performance de rendu** : rendu Markdown synchrone (contenus de taille « CV »), tolérable en temps réel.
|
||||
- **Persistance robuste** : écriture localStorage à chaque frappe de la zone active, lecture au chargement, gestion des erreurs (quota, navigateur bloqué, JSON corrompu).
|
||||
|
||||
## 6. Règles de gestion (résumé formalisé)
|
||||
|
||||
| Règle | Description |
|
||||
| --- | --- |
|
||||
| RG1 | Toute modification d'un champ (textarea ou liste expériences) est persistée immédiatement dans localStorage. |
|
||||
| RG2 | Au chargement, si une sauvegarde existe, l'état de l'application est restauré (toutes les zones). |
|
||||
| RG3 | Si aucune sauvegarde ou sauvegarde corrompue/non compatible → données par défaut (zones vides), sauvegarde initiale créée. |
|
||||
| RG4 | Un seul onglet actif ; la navigation entre onglets ne modifie pas les contenus des autres onglets. |
|
||||
| RG5 | L'ajout d'une expérience place cette expérience en tête de la preview « Expériences professionnelles ». |
|
||||
| RG6 | Chaque expérience possède un identifiant unique stable (UUID) — jamais l'index de liste. |
|
||||
| RG7 | L'impression n'interrompt pas la persistance ; le rendu imprimé = rendu de la feuille A4 uniquement (les panneaux d'édition sont masqués en impression). |
|
||||
| RG8 | Le HTML saisi (via Markdown brut) est neutralisé s'il contient du JavaScript/sans sécurisation → DOMPurify obligatoire avant `dangerouslySetInnerHTML`. |
|
||||
|
||||
## 7. Hors périmètre (v1)
|
||||
|
||||
- Multi-utilisateurs / comptes / cloud ;
|
||||
- Édition collaborative ;
|
||||
- Drag & drop de réorganisation des expériences (prévu comme évolution) ;
|
||||
- Export multi-formats autres que PDF (Docx, JSON…) ;
|
||||
- Tests automatisés (prévus en v2, cf. `07-plan-tests.md` pour la recette manuelle).
|
||||
Reference in new issue
Block a user