Programmatische Templates
Die meisten Benutzer werden Templates visuell im Drag-and-Drop-Editor gestalten. Aber manchmal müssen Sie Templates im Code erstellen -- um Standardinhalte zu initialisieren, Templates aus API-Daten zu erstellen oder E-Mails programmatisch auf dem Server zu generieren.
Templatical bietet Factory-Funktionen für jeden Blocktyp. Verwenden Sie sie, um Templates im Code zu erstellen, und übergeben Sie diese dann an init() oder rendern Sie sie direkt mit dem Renderer.
Leeres Template
import { createDefaultTemplateContent } from '@templatical/types';
const content = createDefaultTemplateContent();
// { blocks: [], settings: { width: 600, backgroundColor: '#ffffff', fontFamily: 'Arial' } }createDefaultTemplateContent() akzeptiert einen optionalen Schriftfamilien-String:
const content = createDefaultTemplateContent('Georgia, serif');Ein Template aufbauen
Jeder Blocktyp hat eine entsprechende create*Block()-Funktion. Jede akzeptiert ein optionales Teilobjekt, um Standardwerte zu überschreiben. Alle Factory-Funktionen generieren automatisch eine eindeutige id für jeden Block.
import {
createDefaultTemplateContent,
createTitleBlock,
createParagraphBlock,
createImageBlock,
createButtonBlock,
createDividerBlock,
} from '@templatical/types';
const content = createDefaultTemplateContent();
content.blocks = [
createTitleBlock({
content: '<h1 style="text-align: center;">Welcome aboard</h1>',
level: 1,
}),
createImageBlock({
src: 'https://example.com/hero.jpg',
alt: 'Welcome hero image',
width: 'full',
}),
createDividerBlock(),
createParagraphBlock({
content: '<p>Thanks for signing up. Here is what happens next.</p>',
}),
createButtonBlock({
text: 'Get Started',
url: 'https://example.com/dashboard',
backgroundColor: '#1a73e8',
textColor: '#ffffff',
borderRadius: 6,
}),
];Block-Factory-Referenz
Title
createTitleBlock({
content: '<h1>Welcome, {{name}}!</h1>',
level: 1,
textAlign: 'center',
})Paragraph
createParagraphBlock({
content: '<p>Thanks for signing up. Here is what happens next.</p>',
})Image
createImageBlock({
src: 'https://cdn.example.com/hero.png',
alt: 'Hero banner',
width: 560,
linkUrl: 'https://example.com',
})Button
createButtonBlock({
text: 'Get Started',
url: 'https://example.com/signup',
backgroundColor: '#6366f1',
borderRadius: 8,
})Divider
createDividerBlock({
lineStyle: 'dashed',
color: '#e5e7eb',
thickness: 2,
})Spacer
createSpacerBlock({ height: 40 })HTML
createHtmlBlock({
content: '<div style="text-align:center;">Custom markup</div>',
})Social Icons
createSocialIconsBlock({
iconStyle: 'circle',
iconSize: 'large',
icons: [
{ id: crypto.randomUUID(), platform: 'twitter', url: 'https://x.com/acme' },
{ id: crypto.randomUUID(), platform: 'github', url: 'https://github.com/acme' },
],
})Menu
createMenuBlock({
items: [
{ id: crypto.randomUUID(), text: 'Home', url: 'https://example.com', openInNewTab: false, bold: false, underline: false },
{ id: crypto.randomUUID(), text: 'Blog', url: 'https://example.com/blog', openInNewTab: false, bold: false, underline: false },
{ id: crypto.randomUUID(), text: 'Docs', url: 'https://docs.example.com', openInNewTab: true, bold: false, underline: false },
],
separator: '-',
})Table
createTableBlock({
hasHeaderRow: true,
rows: [
{ id: crypto.randomUUID(), cells: [{ id: crypto.randomUUID(), content: 'Plan' }, { id: crypto.randomUUID(), content: 'Price' }] },
{ id: crypto.randomUUID(), cells: [{ id: crypto.randomUUID(), content: 'Starter' }, { id: crypto.randomUUID(), content: '$9/mo' }] },
{ id: crypto.randomUUID(), cells: [{ id: crypto.randomUUID(), content: 'Pro' }, { id: crypto.randomUUID(), content: '$29/mo' }] },
],
})Video
createVideoBlock({
url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
thumbnailUrl: 'https://img.youtube.com/vi/dQw4w9WgXcQ/maxresdefault.jpg',
alt: 'Product demo video',
})Section
createSectionBlock({
columns: '2',
children: [
[createParagraphBlock({ content: '<p>Left column</p>' })],
[createImageBlock({ src: 'https://cdn.example.com/photo.jpg' })],
],
})Die Eigenschaft columns akzeptiert: '1' (einspaltig), '2' (zwei gleiche), '3' (drei gleiche), '2-1' (zwei Drittel / ein Drittel), '1-2' (ein Drittel / zwei Drittel). Siehe Sektionen und Spalten für alle Details.
Custom
createCustomBlock nimmt eine CustomBlockDefinition entgegen (keinen partiellen Block). Es generiert Feldwerte aus den Feld-Standardwerten der Definition. Siehe Benutzerdefinierte Blöcke für die Definition benutzerdefinierter Blocktypen.
Dienstprogramme
Generische Factory
Erstellen Sie einen beliebigen Block anhand einer Typzeichenkette:
import { createBlock } from '@templatical/types';
const block = createBlock('title'); // TitleBlock with defaultsKlonen
Deep-cloning eines Blocks mit einer neuen ID:
import { cloneBlock } from '@templatical/types';
const copy = cloneBlock(existingBlock);
// copy.id !== existingBlock.idTyp-Guards
Einen Block-Union auf einen bestimmten Typ eingrenzen:
import { isTitle, isParagraph, isImage, isButton, isSection } from '@templatical/types';
if (isTitle(block)) {
console.log(block.level); // TypeScript knows this is TitleBlock
}
if (isParagraph(block)) {
console.log(block.content); // TypeScript knows this is ParagraphBlock
}
if (isImage(block)) {
console.log(block.src);
}Jeder Blocktyp hat einen entsprechenden Guard: isTitle(), isParagraph(), isImage(), isButton(), isDivider(), isSpacer(), isHtml(), isSocialIcons(), isMenu(), isTable(), isVideo(), isSection(), isCustomBlock().
Template-Einstellungen
Template-Einstellungen steuern die globalen Eigenschaften der E-Mail:
const content = createDefaultTemplateContent();
content.settings.width = 640;
content.settings.backgroundColor = '#f5f5f5';
content.settings.fontFamily = 'Helvetica, Arial, sans-serif';
content.settings.preheaderText = 'Your weekly digest is here';| Einstellung | Typ | Beschreibung |
|---|---|---|
width | number | E-Mail-Breite in Pixeln |
backgroundColor | string | Äußere Hintergrundfarbe |
fontFamily | string | Standard-Font-Stack |
preheaderText | string | Vorschautext, der in der Posteingangsliste angezeigt wird |
Für Standardwerte und wie Sie diese anpassen können, siehe Block- & Template-Standardwerte.
Gespeicherte Inhalte laden
Übergeben Sie zuvor gespeichertes JSON zurück an den Editor:
const saved = await fetch('/api/templates/123').then(r => r.json());
const editor = await init({
container: '#editor',
content: saved,
});Sie können den Inhalt auch nach der Initialisierung aktualisieren:
editor.setContent(newContent);Nächste Schritte
- Blocktypen -- Eigenschaftenreferenz für alle 14 Blocktypen.
- Wie das Rendering funktioniert -- Die JSON → MJML-Pipeline.
- Benutzerdefinierte Blöcke -- Definieren Sie Ihre eigenen Blocktypen.