feat: ajouter la section Compétences (6e bloc)

This commit is contained in:
devcodetools committed 2026-09-17 07:01:05 +02:00
1 parent a0d312a884
commit 92aaafb4aa
13 files changed
+75 -47

No files matched your search

+14 -9
View File
@@ -5,26 +5,28 @@
- **Aucun serveur** : le « modèle de données » = structure de l'état applicatif + son image persistée dans **localStorage**.
- **Une seule clé de stockage** versionnée : `cv-maker:v1`.
- **Toutes les zones sont du Markdown brut** (chaînes de caractères). Le rendu HTML est calculé à la volée, jamais stocké.
- Les expériences sont une **liste d'objets** (avec identifiant stable), contrairement aux 5 zones simples.
- Les expériences sont une **liste d'objets** (avec identifiant stable), contrairement aux 6 zones simples.
## 2. Contracts TypeScript
`lib/types/cv.ts` :
```ts
/** Identifiant des 5 zones de saisie éditées par onglets. */
/** Identifiant des 6 zones de saisie éditées par onglets. */
export type CVTabId =
| "accroche"
| "etatCivil"
| "formations"
| "competences"
| "softSkills"
| "centresInteret";
/** Ordre d'affichage des onglets (1 → 5). */
/** Ordre d'affichage des onglets (1 → 6). */
export const CV_TAB_ORDER: CVTabId[] = [
"accroche",
"etatCivil",
"formations",
"competences",
"softSkills",
"centresInteret",
];
@@ -32,7 +34,7 @@ export const CV_TAB_ORDER: CVTabId[] = [
/** Métadonnées d'affichage d'un onglet. */
export interface CVTabMeta {
id: CVTabId;
numero: 1 | 2 | 3 | 4 | 5; // numéro affiché sur l'onglet
numero: 1 | 2 | 3 | 4 | 5 | 6; // numéro affiché sur l'onglet
label: string; // libellé court de l'onglet
}
@@ -40,8 +42,9 @@ export const CV_TABS: Record<CVTabId, CVTabMeta> = {
accroche: { id: "accroche", numero: 1, label: "Accroche" },
etatCivil: { id: "etatCivil", numero: 2, label: "État civil" },
formations: { id: "formations", numero: 3, label: "Formations" },
softSkills: { id: "softSkills", numero: 4, label: "Soft skills" },
centresInteret: { id: "centresInteret", numero: 5, label: "Centres d'intérêt" },
competences: { id: "competences", numero: 4, label: "Compétences" },
softSkills: { id: "softSkills", numero: 5, label: "Soft skills" },
centresInteret: { id: "centresInteret", numero: 6, label: "Centres d'intérêt" },
};
/** Une expérience professionnelle. */
@@ -59,8 +62,9 @@ export interface CVCareerData {
accroche: string; // zone 1
etatCivil: string; // zone 2
formations: string; // zone 3
softSkills: string; // zone 4
centresInteret: string; // zone 5
competences: string; // zone 4
softSkills: string; // zone 5
centresInteret: string; // zone 6
experiences: Experience[]; // liste, ordre = ordre d'affichage dans le CV
}
@@ -81,6 +85,7 @@ export function createDefaultCVData(): CVCareerData {
accroche: "",
etatCivil: "",
formations: "",
competences: "",
softSkills: "",
centresInteret: "",
experiences: [],
@@ -141,7 +146,7 @@ Regroupe toute la logique d'édition du CV, façade unique pour les composants :
export interface UseCVDataReturn {
data: CVCareerData;
setText(tab: CVTabId, value: string): void; // édition d'une zone 1..5
setText(tab: CVTabId, value: string): void; // édition d'une zone 1..6
addExperience(titre: string, contenu: string): void; // ajoute en fin de liste
updateExperience(id: string, titre: string, contenu: string): void;
removeExperience(id: string): void; // suppression + confirmation côté UI