Valentin Le Moign ef1f14335d Textes projet éditables suivant Grav + écriture atomique du store
- 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
2026-07-06 13:26:06 +02:00

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).

Description
No description provided
Readme 426 KiB
Languages
Vue 57.6%
TypeScript 36.2%
JavaScript 3.7%
CSS 2.2%
Dockerfile 0.3%