- Page « équipe » : roster statique du collectif (composables/useTeam), portraits servis depuis public/portraits, grille ≤ 3 colonnes équilibrée (portrait/nom/rôle/présentation), sélection + surcharges par membre (repliables, réordonnables, réinitialisables) dans le composeur - Page « conclusion » : « Merci ! » centré + rappel des contacts - Page libre : 1 à 3 colonnes texte (markdown) ou images avec sous-titres, réordonnables ; migration des champs body/media legacy vers columns - Couverture : texte libre sous l'intro, adresse en bas à gauche (3 lignes), case « afficher les années » au niveau du document - Sommaire : items centrés (self-center), filet en points dégradés stable - Retrait de la dépendance morte pagedjs - Docs à jour (CLAUDE.md, README) ; spec marquée comme archive réalisée
42 lines
1.9 KiB
Markdown
42 lines
1.9 KiB
Markdown
# Générateur de portfolios — Figures Libres
|
||
|
||
App **Nuxt 3** (+ Nuxt UI v3) qui lit les projets du CMS Grav de Figures Libres et
|
||
compose des **portfolios A3 paysage** exportés en PDF, fidèles au gabarit `book_v3`.
|
||
|
||
Dépôt **autonome et déployable seul** : son `Dockerfile` (base Playwright +
|
||
Ghostscript + ffmpeg + rsync) est inclus. En dev, il se lance via le dépôt
|
||
d'orchestration `portfolio-stack`, qui le clone en `./generator` et le monte en
|
||
volume sur le port **8091** (mot de passe partagé : `figureslibres`).
|
||
|
||
## Lancer
|
||
|
||
Tout tourne dans Docker (rien sur l'hôte). Depuis le dépôt stack :
|
||
|
||
```bash
|
||
docker compose up -d # dev (port 8091)
|
||
docker compose run --rm --no-deps generator npm install # dépendances
|
||
docker compose exec generator npm run build # build de prod (.output)
|
||
```
|
||
|
||
## Repères
|
||
|
||
- `server/lib/` — `content-source` (dev FS Grav `:ro` / prod cache rsync),
|
||
`grav-reader` (parse Grav → `Project`), `pdf-pipeline` (Playwright → PDF A3,
|
||
images 2× via sharp, post-traitement Ghostscript), `portfolio-store` (gel/dégel).
|
||
- `server/api/` — auth, projects, portfolios, media, sync, exports, public.
|
||
- `components/` — `templates/` (cover, toc, projet, grille, page libre, équipe,
|
||
conclusion), `preview/` (rendu + aperçu), `composer/` (UI de composition).
|
||
- `composables/useTeam.ts` — roster statique du collectif ; portraits servis en
|
||
statique depuis `public/portraits/`.
|
||
- `pages/print/[id].vue` — rendu print utilisé pour la génération PDF.
|
||
- `types/index.ts` — modèle de données (source de vérité du schéma).
|
||
|
||
Voir `CLAUDE.md` pour l'architecture détaillée, les contraintes fermes et les
|
||
pièges Chromium print.
|
||
|
||
## Données
|
||
|
||
Sur disque dans `data/` (git-ignoré) : `portfolios/*.json`, `exports/*.pdf`,
|
||
`frozen/<id>/` (snapshots figés à la génération), `cache/` (régénérable),
|
||
`content-cache/` (rsync prod).
|