maj-doc-complete
27
.cursor/skills/site-portfolio-evolution/SKILL.md
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
name: site-portfolio-evolution
|
||||||
|
description: Workflow pour evoluer le site portfolio (Next/Strapi) avec doc interne, captures et Git. Utiliser pour changements front, UI ou architecture du depot.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Evolution du site portfolio
|
||||||
|
|
||||||
|
## Sources
|
||||||
|
|
||||||
|
- Doc interne : `docs-site-interne/`
|
||||||
|
- Operationnel : `CONFIGURATION_SITE.md`
|
||||||
|
- Visuel : `docs-site-interne/captures/` et `captures/INDEX.md`
|
||||||
|
|
||||||
|
## Sequence
|
||||||
|
|
||||||
|
1. **Reflexion** — Objectif, routes, fichiers. Si impact visuel : noter les IDs dans `captures/INDEX.md`.
|
||||||
|
2. **Choix** — Changement minimal, coherent avec l'existant.
|
||||||
|
3. **Modification** — Pas d'elargissement de scope implicite.
|
||||||
|
4. **Validation** — Test local des pages touchees.
|
||||||
|
5. **Si probleme** — `git restore` / retour branche propre.
|
||||||
|
6. **Si OK** — Mettre a jour `docs-site-interne` (fichiers concernes), `feuille-de-route.md` ou `etat-actuel.md` si besoin, puis **captures** pour les sections modifiees.
|
||||||
|
|
||||||
|
## Regles
|
||||||
|
|
||||||
|
- Petites mises a jour doc apres chaque lot utile.
|
||||||
|
- Pas de donnees sensibles sur captures admin (flouter).
|
||||||
|
- Preferer WebP dans `captures/`.
|
||||||
46
docs-site-interne/01-architecture.md
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# Architecture globale
|
||||||
|
|
||||||
|
**Dernière mise à jour :** 2026-04-01
|
||||||
|
|
||||||
|
## Schéma logique
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
flowchart LR
|
||||||
|
Browser[Navigateur]
|
||||||
|
Next[Next.js :3000]
|
||||||
|
Strapi[Strapi :1337]
|
||||||
|
FastAPI[FastAPI :8000]
|
||||||
|
Ollama[Ollama :11434]
|
||||||
|
RemoteAPI[api.fernandgrascalvet.com]
|
||||||
|
|
||||||
|
Browser --> Next
|
||||||
|
Next -->|"fetch REST (getApiUrl)"| Strapi
|
||||||
|
Next -->|"fetch REST"| RemoteAPI
|
||||||
|
Next -->|"/api/proxy → llmapi.*"| FastAPI
|
||||||
|
FastAPI --> Ollama
|
||||||
|
```
|
||||||
|
|
||||||
|
En **développement local**, le front appelle souvent **Strapi sur `localhost:1337`** (voir `getApiUrl`). En **production**, les appels client pointent vers **`https://api.fernandgrascalvet.com`**.
|
||||||
|
|
||||||
|
Le **chatbot** ne parle pas à FastAPI en local par défaut : la route `app/api/proxy/route.js` appelle **`https://llmapi.fernandgrascalvet.com/ask`** (URL absolue).
|
||||||
|
|
||||||
|
## Services et ports
|
||||||
|
|
||||||
|
| Service | Port local typique | Rôle |
|
||||||
|
|---------|-------------------|------|
|
||||||
|
| Next.js | 3000 | Site public, rewrites `/api/*` → Strapi distant (voir `next.config.ts`) |
|
||||||
|
| Strapi | 1337 | CMS, REST `/api/*` |
|
||||||
|
| FastAPI (`llm-api/api.py`) | 8000 | Pont HTTP vers Ollama `/api/generate` |
|
||||||
|
| Ollama | 11434 | Inférence LLM (modèle `mistral` dans le code actuel) |
|
||||||
|
|
||||||
|
## Fichiers clés
|
||||||
|
|
||||||
|
- `next.config.ts` — rewrites, `NEXT_PUBLIC_API_URL`, domaines images.
|
||||||
|
- `app/utils/getApiUrl.ts` — choix de l’URL Strapi (local vs prod, client vs serveur).
|
||||||
|
- `app/api/proxy/route.js` — proxy vers l’API LLM **hébergée** (`llmapi.fernandgrascalvet.com`).
|
||||||
|
- `llm-api/api.py` — implémentation FastAPI locale (Ollama).
|
||||||
|
|
||||||
|
## Points d’attention
|
||||||
|
|
||||||
|
1. **`next.config` rewrites** : les requêtes vers `/api/*` côté Next sont renvoyées vers l’URL Strapi configurée — **conflit sémantique** avec la route Next `app/api/proxy` (chemin différent : le proxy est sous `/api/proxy`, pas sous le rewrite générique de la même façon ; à vérifier selon l’ordre de matching Next).
|
||||||
|
2. **`app/utils/config.ts`** expose `API_URL` avec défaut `localhost:1337`, alors que `next.config.ts` utilise par défaut le domaine de prod : usages distincts, ne pas les confondre.
|
||||||
58
docs-site-interne/02-frontend-next.md
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# Frontend Next.js
|
||||||
|
|
||||||
|
**Dernière mise à jour :** 2026-04-01
|
||||||
|
|
||||||
|
## Stack
|
||||||
|
|
||||||
|
- **Next.js** 15.x, **React** 18, **TypeScript** (fichiers `.tsx`/`.ts`) avec fichiers **`.jsx`/`.js`** encore présents.
|
||||||
|
- **Tailwind CSS** + `@tailwindcss/typography`.
|
||||||
|
- Rendu riche Strapi : `@strapi/blocks-react-renderer`, **react-markdown** + rehype/remark.
|
||||||
|
|
||||||
|
## Routes (App Router)
|
||||||
|
|
||||||
|
| Chemin | Fichier | Notes |
|
||||||
|
|--------|---------|--------|
|
||||||
|
| `/` | `app/page.tsx` | Accueil : `GET /api/homepages?populate=*` |
|
||||||
|
| `/portfolio` | `app/portfolio/page.jsx` | Liste projets |
|
||||||
|
| `/portfolio/[slug]` | `app/portfolio/[slug]/page.tsx` | Détail projet (`fetchData('projects', slug)`) |
|
||||||
|
| `/competences` | `app/competences/page.jsx` | Liste compétences |
|
||||||
|
| `/competences/[slug]` | `app/competences/[slug]/page.tsx` | Détail (`fetchData('competences', slug)`) |
|
||||||
|
| `/contact` | `app/contact/page.js` | Formulaire → Strapi `messages` |
|
||||||
|
| `/admin/messages` | `app/admin/messages/page.tsx` | Consultation messages (côté Next) |
|
||||||
|
| `/api/proxy` | `app/api/proxy/route.js` | Proxy GET vers API LLM distante |
|
||||||
|
|
||||||
|
## Layout
|
||||||
|
|
||||||
|
- `app/layout.tsx` — **Client Component** (`"use client"`). Header fixe, menu burger mobile, fond décoratif, **Footer**, compteur de visites **localStorage** (`visitCount`).
|
||||||
|
|
||||||
|
## Données Strapi
|
||||||
|
|
||||||
|
- **`getApiUrl()`** (`app/utils/getApiUrl.ts`) :
|
||||||
|
- Côté **navigateur** : si hostname est local / LAN → `http://localhost:1337`, sinon → `https://api.fernandgrascalvet.com`.
|
||||||
|
- Côté **serveur** : `process.env.NEXT_PUBLIC_API_URL` ou défaut `https://api.fernandgrascalvet.com`.
|
||||||
|
- **`fetchData`** (`app/utils/fetchData.ts`) : collection + `slug`, populate `picture`, `cache: "no-store"`.
|
||||||
|
- **Accueil** (`app/page.tsx`) : `homepages`, retry 3×, timeout 10 s.
|
||||||
|
|
||||||
|
## Configuration Next
|
||||||
|
|
||||||
|
- `next.config.ts` : `rewrites` de `/api/:path*` vers `${API_URL}/api/:path*` où `API_URL` vient de `NEXT_PUBLIC_API_URL` ou défaut production.
|
||||||
|
- `images.domains` : `localhost`, `api.fernandgrascalvet.com`.
|
||||||
|
|
||||||
|
## Composants notables
|
||||||
|
|
||||||
|
- Carrousels : `Carousel.tsx`, `CarouselCompetences.tsx` (swiper / react-responsive-carousel).
|
||||||
|
- Sections : `ContentSection.tsx`, `ContentSectionCompetences*.tsx`.
|
||||||
|
- `ContactForm.tsx` → `sendMessage.ts`.
|
||||||
|
- `ChatBot.js` → `askAI.js` → `/api/proxy`.
|
||||||
|
- `ModalGlossaire.tsx` — glossaire (données Strapi selon usage dans les pages).
|
||||||
|
|
||||||
|
## Fichiers clés (liste courte)
|
||||||
|
|
||||||
|
```
|
||||||
|
app/layout.tsx
|
||||||
|
app/page.tsx
|
||||||
|
app/utils/getApiUrl.ts
|
||||||
|
app/utils/fetchData.ts
|
||||||
|
app/utils/sendMessage.ts
|
||||||
|
next.config.ts
|
||||||
|
```
|
||||||
78
docs-site-interne/03-cms-strapi.md
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
# CMS Strapi
|
||||||
|
|
||||||
|
**Dernière mise à jour :** 2026-04-01
|
||||||
|
|
||||||
|
## Emplacement
|
||||||
|
|
||||||
|
- Code : `cmsbackend/`
|
||||||
|
- Schémas : `cmsbackend/src/api/<nom>/content-types/<nom>/schema.json`
|
||||||
|
|
||||||
|
Tous les types listés ci-dessous ont **`draftAndPublish: true`** : penser à **publier** les entrées dans l’admin.
|
||||||
|
|
||||||
|
## Content-types
|
||||||
|
|
||||||
|
### `homepage` (collection `homepages`)
|
||||||
|
|
||||||
|
| Champ | Type | Notes |
|
||||||
|
|-------|------|--------|
|
||||||
|
| `title` | string | requis |
|
||||||
|
| `cv` | richtext | requis |
|
||||||
|
| `photo` | media (single) | requis |
|
||||||
|
|
||||||
|
Utilisation front : `app/page.tsx` — premier enregistrement `populate=*`, image : `${apiUrl}${photo.url}`.
|
||||||
|
|
||||||
|
### `project` (collection `projects`)
|
||||||
|
|
||||||
|
| Champ | Type | Notes |
|
||||||
|
|-------|------|--------|
|
||||||
|
| `name` | string | requis |
|
||||||
|
| `description` | text | requis |
|
||||||
|
| `picture` | media (multiple) | requis |
|
||||||
|
| `slug` | uid ← `name` | requis |
|
||||||
|
| `Resum` | richtext | requis (nom du champ avec majuscule) |
|
||||||
|
| `link` | string (URL) | requis |
|
||||||
|
| `order` | integer | optionnel |
|
||||||
|
|
||||||
|
### `competence` (collection `competences`)
|
||||||
|
|
||||||
|
| Champ | Type | Notes |
|
||||||
|
|-------|------|--------|
|
||||||
|
| `name` | string | requis |
|
||||||
|
| `content` | richtext | requis |
|
||||||
|
| `picture` | media (multiple) | requis |
|
||||||
|
| `slug` | uid ← `name` | requis |
|
||||||
|
| `order` | integer | optionnel |
|
||||||
|
|
||||||
|
### `message` (collection `messages`)
|
||||||
|
|
||||||
|
| Champ | Type | Notes |
|
||||||
|
|-------|------|--------|
|
||||||
|
| `name` | string | requis |
|
||||||
|
| `email` | email | requis |
|
||||||
|
| `message` | text | requis |
|
||||||
|
|
||||||
|
Création via **POST** `/api/messages` depuis `sendMessage.ts` (permissions Strapi **create** publique à valider en prod).
|
||||||
|
|
||||||
|
### `glossaire` (collection `glossaires`)
|
||||||
|
|
||||||
|
| Champ | Type | Notes |
|
||||||
|
|-------|------|--------|
|
||||||
|
| `mot_clef` | string | requis |
|
||||||
|
| `slug` | uid ← `mot_clef` | requis |
|
||||||
|
| `variantes` | json | requis |
|
||||||
|
| `description` | richtext | requis |
|
||||||
|
| `images` | media (multiple) | requis |
|
||||||
|
|
||||||
|
## API REST
|
||||||
|
|
||||||
|
- Base : `http://localhost:1337` (dev) ou `https://api.fernandgrascalvet.com` (prod).
|
||||||
|
- Préfixe : `/api/<pluralName>` (ex. `/api/projects`, `/api/homepages`).
|
||||||
|
|
||||||
|
## Fichiers de config Strapi (référence)
|
||||||
|
|
||||||
|
```
|
||||||
|
cmsbackend/config/database.ts
|
||||||
|
cmsbackend/config/server.ts
|
||||||
|
cmsbackend/config/middlewares.ts
|
||||||
|
cmsbackend/config/api.ts
|
||||||
|
```
|
||||||
34
docs-site-interne/04-api-llm-et-chatbot.md
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# API LLM et chatbot (GrasBot)
|
||||||
|
|
||||||
|
**Dernière mise à jour :** 2026-04-01
|
||||||
|
|
||||||
|
## Chaîne côté navigateur
|
||||||
|
|
||||||
|
1. `app/components/ChatBot.js` appelle `askAI(question)` (`app/utils/askAI.js`).
|
||||||
|
2. `askAI` envoie un **GET** vers **`/api/proxy?q=...`** (route Next.js App Router).
|
||||||
|
3. `app/api/proxy/route.js` appelle en dur **`https://llmapi.fernandgrascalvet.com/ask?q=...`** et renvoie le corps JSON tel quel.
|
||||||
|
|
||||||
|
**Conséquence :** en développement local, le chatbot s'appuie sur l'**API LLM déployée** sur ce domaine, pas sur `uvicorn` local (`http://localhost:8000`) tant que l'URL n'est pas rendue configurable.
|
||||||
|
|
||||||
|
## Réponse attendue par le front
|
||||||
|
|
||||||
|
- Dans `askAI.js`, le texte affiché est lu via **`data.response`**. Le flux Ollama (`/api/generate`) renvoie en général un champ `response` dans le JSON ; si l'API distante ou le format change, vérifier ce mapping.
|
||||||
|
|
||||||
|
## FastAPI local (`llm-api/api.py`)
|
||||||
|
|
||||||
|
- Endpoint **GET** `/ask`, paramètre query **`q`**.
|
||||||
|
- Requête **POST** vers Ollama : `http://localhost:11434/api/generate` avec JSON `model: "mistral"`, `prompt`, `stream: false`.
|
||||||
|
- Dépendances : voir `CONFIGURATION_SITE.md` (FastAPI, uvicorn, requests).
|
||||||
|
|
||||||
|
## Fichiers clés
|
||||||
|
|
||||||
|
```
|
||||||
|
app/utils/askAI.js
|
||||||
|
app/api/proxy/route.js
|
||||||
|
app/components/ChatBot.js
|
||||||
|
llm-api/api.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Piste d'évolution
|
||||||
|
|
||||||
|
- Variable d'environnement (ex. URL LLM côté serveur) pour pointer vers `http://localhost:8000` en dev et vers la prod en déploiement, au lieu d'une URL figée dans `route.js`.
|
||||||
29
docs-site-interne/05-environnement-scripts.md
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# Environnement et scripts
|
||||||
|
|
||||||
|
**Dernière mise à jour :** 2026-04-01
|
||||||
|
|
||||||
|
## Variables d’environnement (Next)
|
||||||
|
|
||||||
|
| Variable | Usage |
|
||||||
|
|----------|--------|
|
||||||
|
| `NEXT_PUBLIC_API_URL` | Base URL Strapi pour le build et le rendu serveur ; chargée dans `next.config.ts` (dotenv) pour rewrites et images. |
|
||||||
|
|
||||||
|
Défauts dans le code si absent :
|
||||||
|
|
||||||
|
- `next.config.ts` : `https://api.fernandgrascalvet.com`
|
||||||
|
- `app/utils/getApiUrl.ts` (navigateur local) : `http://localhost:1337`
|
||||||
|
- `app/utils/config.ts` : `http://localhost:1337` (usage ponctuel selon imports)
|
||||||
|
|
||||||
|
## Script `start-my-site.ps1`
|
||||||
|
|
||||||
|
- Définit `NEXT_PUBLIC_API_URL` et `PUBLIC_URL` vers `https://api.fernandgrascalvet.com`.
|
||||||
|
- Lance trois fenêtres PowerShell : Strapi (`cmsbackend`), Next (racine), FastAPI (`llm-api` sur port 8000).
|
||||||
|
- Chemins en dur : `J:\my-next-site\...` — à adapter si le dépôt est déplacé.
|
||||||
|
|
||||||
|
## Démarrage manuel
|
||||||
|
|
||||||
|
Voir `CONFIGURATION_SITE.md` (ports 3000, 1337, 8000, 11434).
|
||||||
|
|
||||||
|
## CORS / proxy
|
||||||
|
|
||||||
|
- La route `app/api/proxy/route.js` renvoie `Access-Control-Allow-Origin: *` sur la réponse proxy.
|
||||||
26
docs-site-interne/06-strapi-extraction.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# Outils `strapi_extraction/`
|
||||||
|
|
||||||
|
**Dernière mise à jour :** 2026-04-01
|
||||||
|
|
||||||
|
Dossier de **scripts Node** pour extraire, nettoyer et documenter les données issues de l’API Strapi (hors runtime du site).
|
||||||
|
|
||||||
|
## Scripts repérés
|
||||||
|
|
||||||
|
| Fichier | Rôle probable |
|
||||||
|
|---------|----------------|
|
||||||
|
| `extract-api-data.js` | Extraction brute vers JSON (`extract/raw/`). |
|
||||||
|
| `clean-api-data.js` | Nettoyage / normalisation (`extract/clean-data/`). |
|
||||||
|
| `generate-docs.js` | Génération de documentation à partir des données. |
|
||||||
|
| `update-documentation.js` | Mise à jour de la doc générée. |
|
||||||
|
| `analyse-site-architecture.js` | Analyse d’architecture du site. |
|
||||||
|
|
||||||
|
## Données générées (exemples)
|
||||||
|
|
||||||
|
- `extract/raw/*.json`, `extract/clean-data/*.json`
|
||||||
|
- `logs/last-update-summary.json`, `docs/generation-summary.json`
|
||||||
|
|
||||||
|
Ces fichiers peuvent être **régénérés** ; ne pas les considérer comme source de vérité sans comparer au CMS.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Lancer depuis la racine ou le dossier selon les chemins dans chaque script (à vérifier avant exécution). Détails : lire l’en-tête de chaque fichier `.js`.
|
||||||
24
docs-site-interne/07-reference-visuelle-captures.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Référence visuelle (captures)
|
||||||
|
|
||||||
|
**Dernière mise à jour :** 2026-04-01 — jeu de captures WebP déposé (ID 01–05, 07–21 ; ID 06 optionnel ignoré).
|
||||||
|
|
||||||
|
## Objectif
|
||||||
|
|
||||||
|
Conserver un **contexte visuel** aligné sur le code. Les images validées sont dans `docs-site-interne/captures/`.
|
||||||
|
|
||||||
|
## Documents
|
||||||
|
|
||||||
|
- [captures/INDEX.md](./captures/INDEX.md) — liste numérotée des captures, noms de fichiers, priorités, cases « Présent ».
|
||||||
|
- [captures/README.md](./captures/README.md) — conventions de nommage, mise à jour, confidentialité.
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
Voir `.cursor/skills/site-portfolio-evolution/SKILL.md` : réflexion → choix → modification → validation → si échec retour Git → si OK mise à jour doc et captures concernées.
|
||||||
|
|
||||||
|
## Activation du skill dans Cursor
|
||||||
|
|
||||||
|
Le fichier est versionné dans le dépôt. Si besoin, ajoutez le dossier aux **Agent Skills** de Cursor ou copiez le skill dans votre répertoire skills personnel pour qu’il soit proposé automatiquement.
|
||||||
|
|
||||||
|
## Pour l’assistant
|
||||||
|
|
||||||
|
Lors d’un chantier UI, **@mentionner** les fichiers dans `captures/` ou citer l’**ID** de l’index (ex. ID 13 — fiche compétence desktop).
|
||||||
51
docs-site-interne/README.md
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
# Documentation interne du site
|
||||||
|
|
||||||
|
**Dernière mise à jour :** 2026-04-01 — captures WebP complètes dans `captures/` (voir INDEX).
|
||||||
|
|
||||||
|
Ce dossier décrit l'architecture, le fonctionnement et les décisions du projet (Next.js + Strapi + FastAPI/Ollama). Il est destiné à l'équipe et à l'assistant IA pour retrouver vite le contexte.
|
||||||
|
|
||||||
|
## Relation avec les autres fichiers
|
||||||
|
|
||||||
|
| Fichier / zone | Rôle |
|
||||||
|
|----------------|------|
|
||||||
|
| `CONFIGURATION_SITE.md` (racine) | Guide opérationnel : ports, commandes, dépannage, planificateur de tâches Windows. |
|
||||||
|
| Ce dossier | Conception : flux de données, schémas CMS, incohérences connues, feuille de route. |
|
||||||
|
|
||||||
|
**Règle de maintenance :** après une modification notable, mettre à jour le fichier concerné ici ; si le démarrage ou les ports changent, compléter aussi `CONFIGURATION_SITE.md`.
|
||||||
|
|
||||||
|
## Index des documents
|
||||||
|
|
||||||
|
| Fichier | Contenu |
|
||||||
|
|---------|---------|
|
||||||
|
| [01-architecture.md](./01-architecture.md) | Services, ports, flux. |
|
||||||
|
| [02-frontend-next.md](./02-frontend-next.md) | App Router, routes, fetch Strapi. |
|
||||||
|
| [03-cms-strapi.md](./03-cms-strapi.md) | Content-types Strapi. |
|
||||||
|
| [04-api-llm-et-chatbot.md](./04-api-llm-et-chatbot.md) | FastAPI, Ollama, GrasBot. |
|
||||||
|
| [05-environnement-scripts.md](./05-environnement-scripts.md) | Env, scripts PowerShell. |
|
||||||
|
| [06-strapi-extraction.md](./06-strapi-extraction.md) | Outils `strapi_extraction/`. |
|
||||||
|
| [07-reference-visuelle-captures.md](./07-reference-visuelle-captures.md) | Référence visuelle ; dossier `captures/`. |
|
||||||
|
| [captures/INDEX.md](./captures/INDEX.md) | Inventaire des captures WebP (noms réels, slugs, priorités). |
|
||||||
|
| [etat-actuel.md](./etat-actuel.md) | État et dette technique. |
|
||||||
|
| [feuille-de-route.md](./feuille-de-route.md) | Backlog priorisé. |
|
||||||
|
|
||||||
|
## Arborescence utile
|
||||||
|
|
||||||
|
```
|
||||||
|
my-next-site/
|
||||||
|
├── app/
|
||||||
|
├── cmsbackend/
|
||||||
|
├── llm-api/
|
||||||
|
├── strapi_extraction/
|
||||||
|
├── start-my-site.ps1
|
||||||
|
├── next.config.ts
|
||||||
|
├── CONFIGURATION_SITE.md
|
||||||
|
└── docs-site-interne/
|
||||||
|
├── captures/ # screenshots de référence (voir INDEX.md)
|
||||||
|
└── ...
|
||||||
|
```
|
||||||
|
|
||||||
|
**Workflow d’évolution (doc + captures + Git) :** skill Cursor `.cursor/skills/site-portfolio-evolution/SKILL.md`.
|
||||||
|
|
||||||
|
## Reprise d’une session de travail
|
||||||
|
|
||||||
|
Pour enchaîner après une pause : lire `feuille-de-route.md` (priorités), `etat-actuel.md`, puis `captures/INDEX.md` si le travail touche l’UI. Le skill `site-portfolio-evolution` rappelle la boucle modification → validation → mise à jour doc.
|
||||||
BIN
docs-site-interne/captures/01-layout-header-nav-desktop.webp
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
docs-site-interne/captures/02-layout-nav-mobile-ouverte.webp
Normal file
|
After Width: | Height: | Size: 101 KiB |
BIN
docs-site-interne/captures/03-accueil-hero-desktop.webp
Normal file
|
After Width: | Height: | Size: 287 KiB |
BIN
docs-site-interne/captures/04-accueil-hero-mobile.webp
Normal file
|
After Width: | Height: | Size: 175 KiB |
BIN
docs-site-interne/captures/05-accueil-page-pleine-desktop.webp
Normal file
|
After Width: | Height: | Size: 286 KiB |
BIN
docs-site-interne/captures/07-portfolio-liste-desktop.webp
Normal file
|
After Width: | Height: | Size: 352 KiB |
BIN
docs-site-interne/captures/08-portfolio-liste-mobile.webp
Normal file
|
After Width: | Height: | Size: 288 KiB |
|
After Width: | Height: | Size: 310 KiB |
|
After Width: | Height: | Size: 297 KiB |
BIN
docs-site-interne/captures/11-competences-liste-desktop.webp
Normal file
|
After Width: | Height: | Size: 319 KiB |
BIN
docs-site-interne/captures/12-competences-liste-mobile.webp
Normal file
|
After Width: | Height: | Size: 309 KiB |
BIN
docs-site-interne/captures/13-competences-detail-ia-desktop.webp
Normal file
|
After Width: | Height: | Size: 316 KiB |
BIN
docs-site-interne/captures/14-competences-detail-ia-mobile.webp
Normal file
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 343 KiB |
|
After Width: | Height: | Size: 497 KiB |
BIN
docs-site-interne/captures/17-contact-formulaire-desktop.webp
Normal file
|
After Width: | Height: | Size: 198 KiB |
BIN
docs-site-interne/captures/18-contact-formulaire-mobile.webp
Normal file
|
After Width: | Height: | Size: 278 KiB |
BIN
docs-site-interne/captures/19-layout-footer-desktop.webp
Normal file
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 26 KiB |
BIN
docs-site-interne/captures/21-admin-messages-desktop.webp
Normal file
|
After Width: | Height: | Size: 194 KiB |
63
docs-site-interne/captures/INDEX.md
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
# Index des captures — référence visuelle
|
||||||
|
|
||||||
|
**Dernière mise à jour :** 2026-04-01 — jeu de captures WebP déposé dans ce dossier (sauf ID 06, optionnel).
|
||||||
|
|
||||||
|
**Priorité** : **P0** = contexte global ; **P1** = refonte UI ; **P2** = optionnel.
|
||||||
|
|
||||||
|
## Fichiers réels dans le dépôt (état actuel)
|
||||||
|
|
||||||
|
Les noms suivants sont ceux présents sur disque. Les routes **dynamiques** utilisent deux conventions de slug (voir section Conventions slug).
|
||||||
|
|
||||||
|
| ID | Section | Route | Fichier dans le dépôt | P | Statut |
|
||||||
|
|----|---------|-------|------------------------|---|--------|
|
||||||
|
| 01 | Header + nav desktop | / | `01-layout-header-nav-desktop.webp` | P0 | OK |
|
||||||
|
| 02 | Menu mobile ouvert | / | `02-layout-nav-mobile-ouverte.webp` | P0 | OK |
|
||||||
|
| 03 | Accueil above the fold | / | `03-accueil-hero-desktop.webp` | P0 | OK |
|
||||||
|
| 04 | Accueil above the fold | / | `04-accueil-hero-mobile.webp` | P0 | OK |
|
||||||
|
| 05 | Accueil page longue | / | `05-accueil-page-pleine-desktop.webp` | P1 | OK |
|
||||||
|
| 06 | Accueil chargement | / | *(non fourni — optionnel)* | P2 | Ignoré |
|
||||||
|
| 07 | Portfolio liste | /portfolio | `07-portfolio-liste-desktop.webp` | P0 | OK |
|
||||||
|
| 08 | Portfolio liste | /portfolio | `08-portfolio-liste-mobile.webp` | P0 | OK |
|
||||||
|
| 09 | Portfolio fiche | /portfolio/slug | `09-portfolio-detail-desktop-presentation-ecole-42.webp` | P0 | OK |
|
||||||
|
| 10 | Portfolio fiche | /portfolio/slug | `10-portfolio-detail-mobile-presentation-ecole-42.webp` | P1 | OK |
|
||||||
|
| 11 | Compétences liste | /competences | `11-competences-liste-desktop.webp` | P0 | OK |
|
||||||
|
| 12 | Compétences liste | /competences | `12-competences-liste-mobile.webp` | P0 | OK |
|
||||||
|
| 13 | Compétences fiche | /competences/slug | `13-competences-detail-ia-desktop.webp` | P0 | OK |
|
||||||
|
| 14 | Compétences fiche | /competences/slug | `14-competences-detail-ia-mobile.webp` | P1 | OK |
|
||||||
|
| 15 | GrasBot ouvert | /competences/slug | `15-competences-grasbot-ouvert-desktop.webp` | P1 | OK |
|
||||||
|
| 16 | Glossaire modal | /competences/slug | `16-competences-glossaire-ouvert-desktop.webp` | P1 | OK |
|
||||||
|
| 17 | Contact formulaire | /contact | `17-contact-formulaire-desktop.webp` | P0 | OK |
|
||||||
|
| 18 | Contact formulaire | /contact | `18-contact-formulaire-mobile.webp` | P0 | OK |
|
||||||
|
| 19 | Footer | / | `19-layout-footer-desktop.webp` | P1 | OK |
|
||||||
|
| 20 | Compteur visites | / | `20-layout-compteur-visites-desktop.webp` | P2 | OK |
|
||||||
|
| 21 | Admin messages | /admin/messages | `21-admin-messages-desktop.webp` | P2 | OK |
|
||||||
|
|
||||||
|
**Slugs illustrés :** projet `presentation-ecole-42`, compétence `ia` (Strapi).
|
||||||
|
|
||||||
|
## Conventions slug (nouvelles captures)
|
||||||
|
|
||||||
|
| Zone | Motif |
|
||||||
|
|------|--------|
|
||||||
|
| Portfolio desktop | `09-portfolio-detail-desktop-{slug}.webp` |
|
||||||
|
| Portfolio mobile | `10-portfolio-detail-mobile-{slug}.webp` |
|
||||||
|
| Compétences desktop | `13-competences-detail-{slug}-desktop.webp` |
|
||||||
|
| Compétences mobile | `14-competences-detail-{slug}-mobile.webp` |
|
||||||
|
|
||||||
|
## Ordre conseillé (prise de vue)
|
||||||
|
|
||||||
|
01–02 chrome, 03–06 accueil, 07–10 portfolio, 11–16 compétences, 17–18 contact, puis 19–21.
|
||||||
|
|
||||||
|
## Repères code
|
||||||
|
|
||||||
|
| ID | Fichiers |
|
||||||
|
|----|----------|
|
||||||
|
| 01–02 | `app/layout.tsx` |
|
||||||
|
| 03–06 | `app/page.tsx` |
|
||||||
|
| 07–08 | `app/portfolio/page.jsx` |
|
||||||
|
| 09–10 | `app/portfolio/[slug]/page.tsx`, `ContentSection.tsx` |
|
||||||
|
| 11–12 | `app/competences/page.jsx` |
|
||||||
|
| 13–16 | `ContentSectionCompetences*.tsx`, `ChatBot.js`, `ModalGlossaire.tsx` |
|
||||||
|
| 17–18 | `app/contact/page.js`, `ContactForm.tsx` |
|
||||||
|
| 19 | `app/components/Footer.jsx` |
|
||||||
|
| 20 | `app/layout.tsx` |
|
||||||
|
| 21 | `app/admin/messages/page.tsx` |
|
||||||
17
docs-site-interne/captures/README.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Captures d'écran — référence visuelle
|
||||||
|
|
||||||
|
**Dernière mise à jour :** 2026-04-01
|
||||||
|
|
||||||
|
Ce dossier contient les **images WebP de référence** du site (état validé). La liste à jour : **[INDEX.md](./INDEX.md)**.
|
||||||
|
|
||||||
|
## Convention générale
|
||||||
|
|
||||||
|
Format : `{numero}-{zone}-{detail}-{viewport}.webp` — détails et **deux motifs pour les fiches dynamiques** (portfolio vs compétences) dans INDEX.md.
|
||||||
|
|
||||||
|
## Mise à jour
|
||||||
|
|
||||||
|
Après changement visuel validé : remplacer les WebP concernés et ajuster INDEX.md si besoin.
|
||||||
|
|
||||||
|
## Données sensibles
|
||||||
|
|
||||||
|
Sur `/admin/messages`, flouter ou données fictives sur les captures.
|
||||||
29
docs-site-interne/etat-actuel.md
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# État actuel du site
|
||||||
|
|
||||||
|
**Dernière mise à jour :** 2026-04-01
|
||||||
|
|
||||||
|
## Ce qui est en place
|
||||||
|
|
||||||
|
- **Next.js 15** avec App Router, Tailwind, pages accueil / portfolio / compétences / contact, layout responsive avec menu burger.
|
||||||
|
- **Strapi** avec content-types : homepage, projects, competences, messages, glossaire ; médias et texte riche.
|
||||||
|
- **Formulaire contact** : POST vers Strapi `messages`.
|
||||||
|
- **Chatbot GrasBot** : proxy Next vers API LLM hébergée (`llmapi.fernandgrascalvet.com`).
|
||||||
|
- **FastAPI + Ollama** dans le dépôt pour usage local ou serveur ; modèle `mistral` dans `llm-api/api.py`.
|
||||||
|
- **Scripts** d’extraction et de doc dans `strapi_extraction/`.
|
||||||
|
- Documentation opérationnelle : `CONFIGURATION_SITE.md`.
|
||||||
|
- **Captures d'écran** de référence (WebP) : `docs-site-interne/captures/` — voir `captures/INDEX.md`.
|
||||||
|
|
||||||
|
## Dette technique / incohérences connues
|
||||||
|
|
||||||
|
- Mélange **TypeScript** et **JavaScript** (`.jsx`, `.js`) dans `app/`.
|
||||||
|
- **`RootLayout` en client component** : tout le layout est côté client ; pas de Server Component racine pour le shell.
|
||||||
|
- **URLs Strapi** : logique répartie entre `getApiUrl`, `next.config.ts`, `config.ts` — risque de confusion ; à documenter dans les changements futurs.
|
||||||
|
- **Proxy LLM** : URL de production codée en dur dans `app/api/proxy/route.js` ; pas d’alignement automatique avec `llm-api` local.
|
||||||
|
- Champ Strapi **`Resum`** sur `project` : casse atypique ; attention dans le mapping front.
|
||||||
|
- **`start-my-site.ps1`** : chemins absolus `J:\my-next-site` — non portables.
|
||||||
|
|
||||||
|
## Non vérifié dans cette passe
|
||||||
|
|
||||||
|
- Permissions Strapi (public create sur `messages`, etc.).
|
||||||
|
- Comportement exact des rewrites Next vs route `app/api/proxy` (ordre de résolution).
|
||||||
|
- Tests automatisés : présence à confirmer.
|
||||||
38
docs-site-interne/feuille-de-route.md
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# Feuille de route
|
||||||
|
|
||||||
|
**Dernière mise à jour :** 2026-04-01
|
||||||
|
|
||||||
|
Document vivant : ajuster les statuts et dates au fil du travail.
|
||||||
|
|
||||||
|
## Court terme (prochaines itérations)
|
||||||
|
|
||||||
|
| ID | Sujet | Statut | Notes |
|
||||||
|
|----|--------|--------|--------|
|
||||||
|
| R1 | Moderniser l’UI (design system, cohérence typo/couleurs) | À faire | S’appuyer sur Tailwind existant |
|
||||||
|
| R2 | Homogénéiser TS vs JS dans `app/` | À faire | Migrer progressivement les `.jsx`/`.js` |
|
||||||
|
| R3 | Centraliser config API (Strapi + LLM) via `.env` | À faire | Remplacer URLs en dur où pertinent |
|
||||||
|
| R4 | Revoir `layout.tsx` (server vs client, perf SEO) | À faire | Évaluer extraction header/footer |
|
||||||
|
|
||||||
|
## Moyen terme
|
||||||
|
|
||||||
|
| ID | Sujet | Statut | Notes |
|
||||||
|
|----|--------|--------|--------|
|
||||||
|
| M1 | Tests (e2e ou smoke sur routes critiques) | À faire | |
|
||||||
|
| M2 | Accessibilité (navigation, contrastes, focus) | À faire | |
|
||||||
|
| M3 | Performance (images Next/Image, bundle) | À faire | |
|
||||||
|
|
||||||
|
## Long terme / idées
|
||||||
|
|
||||||
|
| ID | Sujet | Statut | Notes |
|
||||||
|
|----|--------|--------|--------|
|
||||||
|
| L1 | CI/CD ou script de déploiement documenté | À faire | |
|
||||||
|
| L2 | Monitoring / logs centralisés | À faire | |
|
||||||
|
|
||||||
|
## Historique des jalons
|
||||||
|
|
||||||
|
| Date | Jalon |
|
||||||
|
|------|--------|
|
||||||
|
| 2026-04-01 | Création du dossier `docs-site-interne/` et première rédaction basée sur le code. |
|
||||||
|
| 2026-04-01 | Reprise après coupure : vérification complétude ; enrichissement de `04-api-llm-et-chatbot.md` ; suppression de `test.txt`. |
|
||||||
|
| 2026-04-01 | Index captures (`captures/INDEX.md`), `captures/README.md`, `07-reference-visuelle-captures.md`, skill `.cursor/skills/site-portfolio-evolution/SKILL.md`. |
|
||||||
|
| 2026-04-01 | Captures WebP intégrées au dépôt ; INDEX et README `captures/` alignés sur les noms réels (slug portfolio / compétence documentés). |
|
||||||