diff --git a/.cursor/skills/site-portfolio-evolution/SKILL.md b/.cursor/skills/site-portfolio-evolution/SKILL.md new file mode 100644 index 0000000..60ca655 --- /dev/null +++ b/.cursor/skills/site-portfolio-evolution/SKILL.md @@ -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/`. \ No newline at end of file diff --git a/docs-site-interne/01-architecture.md b/docs-site-interne/01-architecture.md new file mode 100644 index 0000000..74cfe99 --- /dev/null +++ b/docs-site-interne/01-architecture.md @@ -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. diff --git a/docs-site-interne/02-frontend-next.md b/docs-site-interne/02-frontend-next.md new file mode 100644 index 0000000..0219797 --- /dev/null +++ b/docs-site-interne/02-frontend-next.md @@ -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 +``` diff --git a/docs-site-interne/03-cms-strapi.md b/docs-site-interne/03-cms-strapi.md new file mode 100644 index 0000000..8ac00b6 --- /dev/null +++ b/docs-site-interne/03-cms-strapi.md @@ -0,0 +1,78 @@ +# CMS Strapi + +**Dernière mise à jour :** 2026-04-01 + +## Emplacement + +- Code : `cmsbackend/` +- Schémas : `cmsbackend/src/api//content-types//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/` (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 +``` diff --git a/docs-site-interne/04-api-llm-et-chatbot.md b/docs-site-interne/04-api-llm-et-chatbot.md new file mode 100644 index 0000000..31cae08 --- /dev/null +++ b/docs-site-interne/04-api-llm-et-chatbot.md @@ -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`. diff --git a/docs-site-interne/05-environnement-scripts.md b/docs-site-interne/05-environnement-scripts.md new file mode 100644 index 0000000..79e8854 --- /dev/null +++ b/docs-site-interne/05-environnement-scripts.md @@ -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. diff --git a/docs-site-interne/06-strapi-extraction.md b/docs-site-interne/06-strapi-extraction.md new file mode 100644 index 0000000..129a592 --- /dev/null +++ b/docs-site-interne/06-strapi-extraction.md @@ -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`. diff --git a/docs-site-interne/07-reference-visuelle-captures.md b/docs-site-interne/07-reference-visuelle-captures.md new file mode 100644 index 0000000..8ad0e6e --- /dev/null +++ b/docs-site-interne/07-reference-visuelle-captures.md @@ -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). \ No newline at end of file diff --git a/docs-site-interne/README.md b/docs-site-interne/README.md new file mode 100644 index 0000000..79cfb16 --- /dev/null +++ b/docs-site-interne/README.md @@ -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. diff --git a/docs-site-interne/captures/01-layout-header-nav-desktop.webp b/docs-site-interne/captures/01-layout-header-nav-desktop.webp new file mode 100644 index 0000000..e0394d6 Binary files /dev/null and b/docs-site-interne/captures/01-layout-header-nav-desktop.webp differ diff --git a/docs-site-interne/captures/02-layout-nav-mobile-ouverte.webp b/docs-site-interne/captures/02-layout-nav-mobile-ouverte.webp new file mode 100644 index 0000000..d115c9a Binary files /dev/null and b/docs-site-interne/captures/02-layout-nav-mobile-ouverte.webp differ diff --git a/docs-site-interne/captures/03-accueil-hero-desktop.webp b/docs-site-interne/captures/03-accueil-hero-desktop.webp new file mode 100644 index 0000000..91e8d17 Binary files /dev/null and b/docs-site-interne/captures/03-accueil-hero-desktop.webp differ diff --git a/docs-site-interne/captures/04-accueil-hero-mobile.webp b/docs-site-interne/captures/04-accueil-hero-mobile.webp new file mode 100644 index 0000000..85c589b Binary files /dev/null and b/docs-site-interne/captures/04-accueil-hero-mobile.webp differ diff --git a/docs-site-interne/captures/05-accueil-page-pleine-desktop.webp b/docs-site-interne/captures/05-accueil-page-pleine-desktop.webp new file mode 100644 index 0000000..6e73599 Binary files /dev/null and b/docs-site-interne/captures/05-accueil-page-pleine-desktop.webp differ diff --git a/docs-site-interne/captures/07-portfolio-liste-desktop.webp b/docs-site-interne/captures/07-portfolio-liste-desktop.webp new file mode 100644 index 0000000..e6126b0 Binary files /dev/null and b/docs-site-interne/captures/07-portfolio-liste-desktop.webp differ diff --git a/docs-site-interne/captures/08-portfolio-liste-mobile.webp b/docs-site-interne/captures/08-portfolio-liste-mobile.webp new file mode 100644 index 0000000..998db41 Binary files /dev/null and b/docs-site-interne/captures/08-portfolio-liste-mobile.webp differ diff --git a/docs-site-interne/captures/09-portfolio-detail-desktop-presentation-ecole-42.webp b/docs-site-interne/captures/09-portfolio-detail-desktop-presentation-ecole-42.webp new file mode 100644 index 0000000..8606d65 Binary files /dev/null and b/docs-site-interne/captures/09-portfolio-detail-desktop-presentation-ecole-42.webp differ diff --git a/docs-site-interne/captures/10-portfolio-detail-mobile-presentation-ecole-42.webp b/docs-site-interne/captures/10-portfolio-detail-mobile-presentation-ecole-42.webp new file mode 100644 index 0000000..58b565b Binary files /dev/null and b/docs-site-interne/captures/10-portfolio-detail-mobile-presentation-ecole-42.webp differ diff --git a/docs-site-interne/captures/11-competences-liste-desktop.webp b/docs-site-interne/captures/11-competences-liste-desktop.webp new file mode 100644 index 0000000..88feac8 Binary files /dev/null and b/docs-site-interne/captures/11-competences-liste-desktop.webp differ diff --git a/docs-site-interne/captures/12-competences-liste-mobile.webp b/docs-site-interne/captures/12-competences-liste-mobile.webp new file mode 100644 index 0000000..9da9908 Binary files /dev/null and b/docs-site-interne/captures/12-competences-liste-mobile.webp differ diff --git a/docs-site-interne/captures/13-competences-detail-ia-desktop.webp b/docs-site-interne/captures/13-competences-detail-ia-desktop.webp new file mode 100644 index 0000000..4b043e8 Binary files /dev/null and b/docs-site-interne/captures/13-competences-detail-ia-desktop.webp differ diff --git a/docs-site-interne/captures/14-competences-detail-ia-mobile.webp b/docs-site-interne/captures/14-competences-detail-ia-mobile.webp new file mode 100644 index 0000000..aac5c41 Binary files /dev/null and b/docs-site-interne/captures/14-competences-detail-ia-mobile.webp differ diff --git a/docs-site-interne/captures/15-competences-grasbot-ouvert-desktop.webp b/docs-site-interne/captures/15-competences-grasbot-ouvert-desktop.webp new file mode 100644 index 0000000..c00955e Binary files /dev/null and b/docs-site-interne/captures/15-competences-grasbot-ouvert-desktop.webp differ diff --git a/docs-site-interne/captures/16-competences-glossaire-ouvert-desktop.webp b/docs-site-interne/captures/16-competences-glossaire-ouvert-desktop.webp new file mode 100644 index 0000000..973753d Binary files /dev/null and b/docs-site-interne/captures/16-competences-glossaire-ouvert-desktop.webp differ diff --git a/docs-site-interne/captures/17-contact-formulaire-desktop.webp b/docs-site-interne/captures/17-contact-formulaire-desktop.webp new file mode 100644 index 0000000..c8b961f Binary files /dev/null and b/docs-site-interne/captures/17-contact-formulaire-desktop.webp differ diff --git a/docs-site-interne/captures/18-contact-formulaire-mobile.webp b/docs-site-interne/captures/18-contact-formulaire-mobile.webp new file mode 100644 index 0000000..9cc441c Binary files /dev/null and b/docs-site-interne/captures/18-contact-formulaire-mobile.webp differ diff --git a/docs-site-interne/captures/19-layout-footer-desktop.webp b/docs-site-interne/captures/19-layout-footer-desktop.webp new file mode 100644 index 0000000..13ad30e Binary files /dev/null and b/docs-site-interne/captures/19-layout-footer-desktop.webp differ diff --git a/docs-site-interne/captures/20-layout-compteur-visites-desktop.webp b/docs-site-interne/captures/20-layout-compteur-visites-desktop.webp new file mode 100644 index 0000000..68e83ea Binary files /dev/null and b/docs-site-interne/captures/20-layout-compteur-visites-desktop.webp differ diff --git a/docs-site-interne/captures/21-admin-messages-desktop.webp b/docs-site-interne/captures/21-admin-messages-desktop.webp new file mode 100644 index 0000000..f29943e Binary files /dev/null and b/docs-site-interne/captures/21-admin-messages-desktop.webp differ diff --git a/docs-site-interne/captures/INDEX.md b/docs-site-interne/captures/INDEX.md new file mode 100644 index 0000000..0ed03ba --- /dev/null +++ b/docs-site-interne/captures/INDEX.md @@ -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` | \ No newline at end of file diff --git a/docs-site-interne/captures/README.md b/docs-site-interne/captures/README.md new file mode 100644 index 0000000..84cf3d8 --- /dev/null +++ b/docs-site-interne/captures/README.md @@ -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. \ No newline at end of file diff --git a/docs-site-interne/etat-actuel.md b/docs-site-interne/etat-actuel.md new file mode 100644 index 0000000..44a0da7 --- /dev/null +++ b/docs-site-interne/etat-actuel.md @@ -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. diff --git a/docs-site-interne/feuille-de-route.md b/docs-site-interne/feuille-de-route.md new file mode 100644 index 0000000..35427c2 --- /dev/null +++ b/docs-site-interne/feuille-de-route.md @@ -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). |