import React from 'react'; export type TemplateId = 'basic' | 'fresh' | 'memo' | 'border' | 'scribble'; export type TemplateVariant = 'large' | 'thumb'; export const TEMPLATE_BG: Record = { basic: '#fffbe6', fresh: '#dff5e6', memo: '#fffef2', border: '#f7f7f7', scribble: '#e0f2fe', }; export const TEMPLATE_TEXT_COLOR: Record = { basic: '#4a4a4a', fresh: '#2f855a', memo: '#4b5563', border: '#111827', scribble: '#0369a1', }; export function resolveTemplateId(id: string | undefined): TemplateId { return (id && id in TEMPLATE_BG ? id : 'basic') as TemplateId; } // thumb 视觉上约为 large 的 36%,尺寸按此系数从 large 派生 const LARGE_SCALE = { quoteFont: 56, underlineW: 24, underlineH: 4, leafSize: 44, memoLineGap: 28, borderOuterInset: 10, borderOuterWidth: 3, borderInnerInset: 18, borderInnerWidth: 1, }; const VARIANT_RATIO: Record = { large: 1, thumb: 0.36 }; function getScale(variant: TemplateVariant) { const r = VARIANT_RATIO[variant]; const out: Record = { ...LARGE_SCALE }; (Object.keys(LARGE_SCALE) as (keyof typeof LARGE_SCALE)[]).forEach(k => { out[k] = LARGE_SCALE[k] * r; }); return out; } const TemplateDecoration: React.FC<{ id: TemplateId; variant: TemplateVariant }> = ({ id, variant }) => { const sc = getScale(variant); if (id === 'basic') { return ( <>
“
); } if (id === 'fresh') { return ( <>
); } if (id === 'memo') { const gap = sc.memoLineGap; return (
); } if (id === 'border') { return ( <>
); } if (id === 'scribble') { return ( ); } return null; }; interface PreviewProps { templateId: string; text: string; fallbackText: string; variant: TemplateVariant; className?: string; } export const TemplatePreview: React.FC = ({ templateId, text, fallbackText, variant, className = '' }) => { const id = resolveTemplateId(templateId); const display = text || fallbackText; const textCls = variant === 'large' ? 'text-[28px] font-semibold text-center px-10 leading-snug' : 'text-[11px] font-medium text-center px-1 line-clamp-3 leading-tight overflow-hidden'; return (
{display}
); }; export default TemplatePreview;