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

137
assets/css/theme.css Normal file
View File

@@ -0,0 +1,137 @@
/* Charte Figures Libres — fontes du thème Grav figureslibres-v2 et canvas
de page A3 paysage (gabarit_book_v3 : 1190,55 × 841,89 pt), communs à
l'aperçu et au PDF. 1 pt = 4/3 px → page = 1587,4 × 1122,5 px. */
@font-face {
font-family: 'Syne';
src: url('/fonts/Syne-regular.woff2') format('woff2');
font-weight: 400;
font-style: normal;
font-display: block;
}
@font-face {
font-family: 'Syne';
src: url('/fonts/Syne-bold.woff2') format('woff2');
font-weight: 700;
font-style: normal;
font-display: block;
}
@font-face {
font-family: 'Moche';
src: url('/fonts/Moche-bold.woff2') format('woff2');
font-weight: 700;
font-style: normal;
font-display: block;
}
@font-face {
font-family: 'Lato';
src: url('/fonts/Lato-regular.woff2') format('woff2');
font-weight: 400;
font-style: normal;
font-display: block;
}
@font-face {
font-family: 'Lato';
src: url('/fonts/Lato-bold.woff2') format('woff2');
font-weight: 700;
font-style: normal;
font-display: block;
}
@font-face {
font-family: 'Lato';
src: url('/fonts/Lato-italic.woff2') format('woff2');
font-weight: 400;
font-style: italic;
font-display: block;
}
@font-face {
font-family: 'Lato';
src: url('/fonts/Lato-bold-italic.woff2') format('woff2');
font-weight: 700;
font-style: italic;
font-display: block;
}
/* Fontes de titre par « utilité » (mixins du thème Grav) */
@font-face {
font-family: 'Avara';
src: url('/fonts/Avara-bold-italic.woff2') format('woff2');
font-weight: 700;
font-style: italic;
font-display: block;
}
@font-face {
font-family: 'PlayfairDisplay';
src: url('/fonts/PlayfairDisplay-italic.woff2') format('woff2');
font-weight: 400;
font-style: italic;
font-display: block;
}
@font-face {
font-family: 'ManifontGrotesk';
src: url('/fonts/ManifontGrotesk-bold-italic.woff2') format('woff2');
font-weight: 700;
font-style: italic;
font-display: block;
}
/* ---- Canvas de page A3 paysage — métriques mesurées dans le gabarit ---- */
:root {
--fl-page-w: 1587.4px; /* 420 mm */
--fl-page-h: 1122.5px; /* 297 mm */
--fl-margin: 30.2px; /* 8 mm — marge extérieure */
--fl-gutter: 14.4px; /* 3,8 mm — gouttière des grilles */
--fl-strip: 18.9px; /* 5 mm — filet haut des pages grille */
--fl-band: 208px; /* 55 mm — bandeau des pages couverture */
}
.fl-page {
position: relative;
width: var(--fl-page-w);
height: var(--fl-page-h);
overflow: hidden;
flex-shrink: 0;
background: #ffffff;
color: #000000;
font-family: 'Syne', sans-serif;
font-size: 16px; /* 12 pt */
line-height: 21.33px; /* 16 pt */
}
.fl-page :is(h1, h2, h3) {
font-family: 'Syne', sans-serif;
font-weight: 700;
line-height: 1.1;
}
.fl-page img {
display: block;
}
/* Fontes de titre par catégorie (utilité) — plus spécifiques que la règle
Syne des h1/h2/h3 ci-dessus */
.fl-page .fl-font-publique {
font-family: 'PlayfairDisplay', serif;
font-weight: 400;
font-style: italic;
}
.fl-page .fl-font-sociale {
font-family: 'ManifontGrotesk', sans-serif;
font-weight: 700;
font-style: italic;
}
.fl-page .fl-font-culturelle {
font-family: 'Avara', serif;
font-weight: 700;
font-style: italic;
}
/* Texte courant issu du Markdown — Syne 12 pt / interligne 16 pt (gabarit) */
.fl-prose p { margin: 0 0 0.75em; }
.fl-prose p:last-child { margin-bottom: 0; }
.fl-prose a { text-decoration: underline; text-underline-offset: 2px; }
.fl-prose ul, .fl-prose ol { margin: 0 0 0.75em; padding-left: 1.2em; }
.fl-prose ul { list-style: disc; }
.fl-prose ol { list-style: decimal; }
.fl-prose strong { font-weight: 700; }
.fl-prose em { font-style: italic; }