Générateur de portfolios PDF Figures Libres (app Nuxt autonome)

App Nuxt 3 + Nuxt UI qui lit les projets du CMS Grav et compose des portfolios
A3 paysage exportés en PDF (gabarit book_v3) : composeur WYSIWYG, templates
cover/toc/projet/grille/page libre, pipeline Playwright + Ghostscript, gel du
contenu à la génération, partage public opt-in.

Dépôt autonome : Dockerfile (base Playwright + Ghostscript + ffmpeg + rsync) inclus.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-05 18:37:09 +02:00
commit 59dfbe4155
79 changed files with 18587 additions and 0 deletions

39
README.md Normal file
View File

@@ -0,0 +1,39 @@
# 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),
`preview/` (rendu + aperçu), `composer/` (UI de composition).
- `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).