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
This commit is contained in:
2026-07-13 16:00:59 +02:00
parent ef1f14335d
commit 1c1604ea2f
29 changed files with 802 additions and 265 deletions

View File

@@ -31,21 +31,36 @@ Mot de passe dev : `figureslibres` (`PORTFOLIO_PASSWORD`).
- `portfolio-store.ts` : CRUD des portfolios (JSON sur disque), gel/dégel du contenu.
- `media.ts`, `session.ts`.
- `server/api/` — endpoints (auth, projects, portfolios, media, sync, exports, public).
- `components/templates/` — pages du gabarit (cover, toc, projet, grille, page libre).
- `components/templates/` — pages du gabarit (cover, toc, projet, grille, page
libre, équipe `TeamTemplate`, conclusion `OutroTemplate`).
- `components/preview/``PageRenderer` (dispatch) + `PageViewport` (aperçu à l'échelle).
- `components/composer/` — UI de composition (curation médias, fonds, pickers).
- `composables/useTeam.ts` — roster statique du collectif (`TEAM_ROSTER` : nom,
portrait, rôle et présentation par défaut de chaque membre) ; les portraits
sont servis en statique depuis `public/portraits/`.
- `pages/print/[id].vue`**rendu print servant à la génération PDF** (ne pas casser).
- `types/index.ts` — modèle de données complet et commenté (source de vérité du schéma).
## Modèle de données (résumé)
Un `Portfolio` = `cover` (CoverConfig) + `pages[]`. Types de page : `cover`,
`toc`, `project` (couverture d'un projet, disposition `band` = bandeau haut **ou**
`split` = colonne texte + image pleine hauteur à droite), `project-grid` (grille
d'images entières), `free`. Le contenu Grav (`Project`, `MediaAsset`) est **en
lecture seule**. À la génération, le contenu utilisé est **figé** dans
`data/frozen/<id>/` (`FrozenSnapshot`) : régénérer redonne le même PDF ;
« Réactualiser depuis Grav » resynchronise volontairement.
Un `Portfolio` = `cover` (CoverConfig) + `pages[]`. Types de page :
- `cover` couverture (titre, texte libre, date, site/mail, adresse en bas à
gauche) ; `showYears` (au niveau du portfolio) masque les années des projets.
- `toc` — sommaire, généré depuis les pages projet (hérite du filet de la couverture).
- `project` — couverture d'un projet, disposition `band` (bandeau haut) **ou**
`split` (colonne texte + image pleine hauteur à droite).
- `project-grid` — grille d'images entières.
- `free` — page libre : 1 à 3 **colonnes** (`FreeColumn`) de texte (markdown) ou
d'images, chacune avec sous-titre optionnel (les champs `body`/`media` legacy
sont migrés vers `columns` à l'ouverture, avec repli au rendu disque).
- `team` — page équipe : membres du roster en grille (≤ 3 colonnes, équilibrée),
portrait + nom + rôle + présentation ; sélection et surcharges par membre.
- `outro` — page de conclusion : « Merci ! » centré + rappel des contacts.
Le contenu Grav (`Project`, `MediaAsset`) est **en lecture seule**. À la
génération, le contenu utilisé est **figé** dans `data/frozen/<id>/`
(`FrozenSnapshot`) : régénérer redonne le même PDF ; « Réactualiser depuis Grav »
resynchronise volontairement.
Chaque page porte un **fond unifié** `background` à trois modes :
`white` | `tint` (aplat beige fixe `#efece3`) | `full` (la page — ou le bandeau /
@@ -70,8 +85,8 @@ encre `FL_INK`). Il n'y a **plus** de couleur automatique par catégorie
seule exception : le mot « Figures Libres » de la couverture (Bold).
- **Liens Grav** : `stripTargetParam` retire le `?target=_blank` que Grav accole à
chaque URL (lien projet + liens dans les corps de texte), à l'affichage.
- Filet : `--fl-strip` (5 mm, couverture/sommaire/page libre) ou `--fl-strip-light`
(2 mm, filet fin des grilles et des couvertures projet non « plein »).
- Filet : `--fl-strip` (5 mm, couverture/sommaire/page libre/équipe/conclusion) ou
`--fl-strip-light` (2 mm, filet fin des grilles et des couvertures projet non « plein »).
## Pièges Chromium print (avant de toucher aux templates)