Files
portfolio-generator-app/composables/useFormat.ts
Valentin Le Moign 59dfbe4155 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>
2026-07-05 18:37:09 +02:00

36 lines
1.4 KiB
TypeScript

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
}