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:
35
composables/useFormat.ts
Normal file
35
composables/useFormat.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import type { Project } from '~~/types'
|
||||
|
||||
const dateFormatter = new Intl.DateTimeFormat('fr-FR', { month: 'long', year: 'numeric' })
|
||||
|
||||
export function formatProjectDate(iso?: string): string {
|
||||
if (!iso) return ''
|
||||
const d = new Date(iso)
|
||||
return Number.isNaN(d.getTime()) ? '' : dateFormatter.format(d)
|
||||
}
|
||||
|
||||
export const CATEGORY_LABELS: Record<string, string> = {
|
||||
culturelle: 'Culturelle',
|
||||
publique: 'Publique',
|
||||
sociale: 'Sociale',
|
||||
}
|
||||
|
||||
// Valeurs par défaut du header de la vue publique (surchargées par la couverture).
|
||||
export const DEFAULT_SITE_URL = 'https://figureslibres.cc'
|
||||
export const DEFAULT_CONTACT_EMAIL = 'bonjour@figureslibres.io'
|
||||
|
||||
/**
|
||||
* URL de miniature basse résolution d'un média de projet.
|
||||
* `base` permet de router vers la route publique (/api/public/<id>/media) en
|
||||
* vue publique au lieu de la route authentifiée par défaut.
|
||||
*/
|
||||
export function mediaUrl(projectId: string, filename: string, width?: number, base = '/api/media'): string {
|
||||
const url = `${base}/${projectId.split('/').map(encodeURIComponent).join('/')}/${encodeURIComponent(filename)}`
|
||||
return width ? `${url}?w=${width}` : url
|
||||
}
|
||||
|
||||
/** Vignette de couverture d'un projet (aura.image ou 1re image). */
|
||||
export function projectThumb(project: Project, width = 480): string | null {
|
||||
const cover = project.coverImage ?? project.media.find(m => m.type === 'image')?.filename
|
||||
return cover ? mediaUrl(project.id, cover, width) : null
|
||||
}
|
||||
Reference in New Issue
Block a user