- Champ Présentation prérempli avec le texte Grav, suivi modifié/synchro (textOverride undefined = suit Grav, sinon figé ; bouton Réinitialiser) - Fix génération PDF : savePortfolio écrit en atomique (temp+rename) pour éviter la corruption de lecture par l'autosave concurrent du rendu print - Toast d'échec de génération explicite (message serveur) - Refonte architecture visuelle, fond unifié white/tint/full, dispositions couverture bandeau/colonne, instantané public complet, index 3 lignes
72 lines
2.6 KiB
TypeScript
72 lines
2.6 KiB
TypeScript
import type { Background, InkMode } from '~~/types'
|
|
|
|
// Charte Figures Libres — valeurs mesurées dans gabarit_book_v3.pdf et
|
|
// reprises du thème Grav figureslibres-v2 (scss/configuration/_variable.scss).
|
|
export const FL_INK = '#0e1229'
|
|
export const FL_BASE = '#f5f5f5'
|
|
|
|
/** Palette proposée pour la couleur du filet/bandeau des pages projet
|
|
* (magenta et vert du gabarit + roses/jaune/menthe du site). */
|
|
export const BAND_COLORS = [
|
|
'#ec008c', // magenta 100% (publique)
|
|
'#8bd261', // vert (sociale)
|
|
'#ffaeab', // rose (publique, site)
|
|
'#feff74', // jaune pâle (culturelle, site)
|
|
'#fabbde', // rose (commanditaires, site)
|
|
'#4bffc9', // menthe (projets, site)
|
|
]
|
|
|
|
/** Libellé court de la pastille d'utilité (sans le mot « Utilité »). */
|
|
export const CATEGORY_BADGE: Record<string, string> = {
|
|
publique: 'Publique',
|
|
sociale: 'Social',
|
|
culturelle: 'Culturel',
|
|
}
|
|
|
|
/** Classe CSS de la fonte de titre par catégorie (mixins du thème Grav). */
|
|
export const CATEGORY_TITLE_CLASS: Record<string, string> = {
|
|
publique: 'fl-font-publique',
|
|
sociale: 'fl-font-sociale',
|
|
culturelle: 'fl-font-culturelle',
|
|
}
|
|
|
|
/** Aplat unique du mode « teinté » (beige de la charte). */
|
|
export const TINT_COLOR = '#efece3'
|
|
|
|
function luminance(hex: string): number {
|
|
const m = hex.replace('#', '')
|
|
if (m.length < 6) return 1
|
|
const [r, g, b] = [0, 2, 4].map(i => parseInt(m.slice(i, i + 2), 16) / 255)
|
|
return 0.2126 * r + 0.7152 * g + 0.0722 * b
|
|
}
|
|
|
|
/** Encre lisible sur un fond donné — le gabarit imprime en noir/blanc purs. */
|
|
export function inkOn(color: string, ink: InkMode = 'auto'): string {
|
|
if (ink === 'black') return '#000000'
|
|
if (ink === 'white') return '#ffffff'
|
|
return luminance(color) < 0.45 ? '#ffffff' : '#000000'
|
|
}
|
|
|
|
/** Couleur du filet/bandeau : couleur choisie, sinon l'encre neutre (plus de
|
|
* couleur automatique par catégorie). */
|
|
export function filetColor(override?: string): string {
|
|
return override || FL_INK
|
|
}
|
|
|
|
/** Couleur de fond d'une page : blanc, teinté (aplat fixe) ou plein (`fullColor`,
|
|
* la couleur du filet/bandeau de la page). */
|
|
export function backgroundColorOf(bg: Background | undefined, fullColor = FL_INK): string {
|
|
if (bg?.mode === 'full') return fullColor
|
|
if (bg?.mode === 'tint') return TINT_COLOR
|
|
return '#ffffff'
|
|
}
|
|
|
|
/** Style inline d'une page : fond + couleur d'encre lisible. */
|
|
export function backgroundStyle(bg: Background | undefined, fullColor = FL_INK): Record<string, string> {
|
|
const color = backgroundColorOf(bg, fullColor)
|
|
return {
|
|
backgroundColor: color,
|
|
color: luminance(color) < 0.45 ? '#ffffff' : FL_INK,
|
|
}
|
|
}
|