import { LEGACY_THEME_MAP } from './constants'; import type { CertificateDesign, CertificateRenderData, CertificateRenderResult, CertificateTemplateId } from './types'; import { CERTIFICATE_TEMPLATE_IDS } from './types'; import { renderBrutalist } from './templates/brutalist'; import { renderClassique } from './templates/classique'; import { renderMinimal } from './templates/minimal'; import { renderNoir } from './templates/noir'; import { renderPoster } from './templates/poster'; import { BASE_STYLES, FONTS_LINK_HREF, type TemplateRenderer } from './templates/shared'; const RENDERERS: Record = { classique: renderClassique, brutalist: renderBrutalist, noir: renderNoir, poster: renderPoster, minimal: renderMinimal }; export function resolveTemplateId(value: string | undefined | null): CertificateTemplateId { if (!value) return 'classique'; if (CERTIFICATE_TEMPLATE_IDS.includes(value as CertificateTemplateId)) { return value as CertificateTemplateId; } if (value in LEGACY_THEME_MAP) { return LEGACY_THEME_MAP[value]!; } return 'classique'; } export function renderCertificate(design: CertificateDesign, data: CertificateRenderData): CertificateRenderResult { const templateId = resolveTemplateId(design.templateId); const renderer = RENDERERS[templateId]; const { body, styles } = renderer({ design: { ...design, templateId }, data }); const html = ` Certificate ${body} `; const fullStyles = BASE_STYLES + '\n' + styles; return { html, styles: fullStyles }; } /** * Returns a single-document HTML string that already includes the styles inline. * Useful for iframe `srcdoc` and `