- Champ Présentation prérempli avec le texte Grav, suivi modifié/synchro (textOverride undefined = suit Grav, sinon figé ; bouton Réinitialiser) - Fix génération PDF : savePortfolio écrit en atomique (temp+rename) pour éviter la corruption de lecture par l'autosave concurrent du rendu print - Toast d'échec de génération explicite (message serveur) - Refonte architecture visuelle, fond unifié white/tint/full, dispositions couverture bandeau/colonne, instantané public complet, index 3 lignes
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 :
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).