Valentin Le Moign 1c1604ea2f Pages équipe + conclusion, colonnes de page libre, réglages couverture
- 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
2026-07-13 16:00:59 +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, é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).

Description
No description provided
Readme 4.3 MiB
Languages
Vue 59.4%
TypeScript 35.3%
JavaScript 3.2%
CSS 1.8%
Dockerfile 0.3%