@marlinjai/email-editor-blocks 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,2823 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ PALETTE: () => PALETTE,
24
+ PLACEHOLDER: () => PLACEHOLDER,
25
+ PLACEHOLDER_ALT: () => PLACEHOLDER_ALT,
26
+ SOCIAL_COLORS: () => SOCIAL_COLORS,
27
+ TYPOGRAPHY: () => TYPOGRAPHY,
28
+ accordionBlockDefinition: () => accordionBlockDefinition,
29
+ allPrebuiltTemplates: () => allPrebuiltTemplates,
30
+ appDownloadTemplate: () => appDownloadTemplate,
31
+ buttonBlockDefinition: () => buttonBlockDefinition,
32
+ buttonsDualTemplate: () => buttonsDualTemplate,
33
+ carouselBlockDefinition: () => carouselBlockDefinition,
34
+ contentTemplates: () => contentTemplates,
35
+ couponBannerTemplate: () => couponBannerTemplate,
36
+ couponDiscountTemplate: () => couponDiscountTemplate,
37
+ couponGiftCardTemplate: () => couponGiftCardTemplate,
38
+ createPrebuiltRegistry: () => createStandardPrebuiltRegistry,
39
+ createStandardBlockRegistry: () => createStandardBlockRegistry,
40
+ createStandardPrebuiltRegistry: () => createStandardPrebuiltRegistry,
41
+ dividerBlockDefinition: () => dividerBlockDefinition,
42
+ dividerSectionTemplate: () => dividerSectionTemplate,
43
+ eventImageTemplate: () => eventImageTemplate,
44
+ eventSimpleTemplate: () => eventSimpleTemplate,
45
+ featureTemplates: () => featureTemplates,
46
+ features2ColTemplate: () => features2ColTemplate,
47
+ features3ColTemplate: () => features3ColTemplate,
48
+ features4ColRow2Template: () => features4ColRow2Template,
49
+ features4ColTemplate: () => features4ColTemplate,
50
+ footerBlockDefinition: () => footerBlockDefinition,
51
+ footerLinksTemplate: () => footerLinksTemplate,
52
+ footerSocialTemplate: () => footerSocialTemplate,
53
+ footerStandardTemplate: () => footerStandardTemplate,
54
+ getTemplatesByCategory: () => getTemplatesByCategory,
55
+ headerBlockDefinition: () => headerBlockDefinition,
56
+ heroBlockDefinition: () => heroBlockDefinition,
57
+ heroMainTemplate: () => heroMainTemplate,
58
+ heroMinimalTemplate: () => heroMinimalTemplate,
59
+ heroNewsletterTemplate: () => heroNewsletterTemplate,
60
+ heroSplitTemplate: () => heroSplitTemplate,
61
+ heroTemplates: () => heroTemplates,
62
+ hostedPlaceholder: () => hostedPlaceholder,
63
+ imageBlockDefinition: () => imageBlockDefinition,
64
+ marketingTemplates: () => marketingTemplates,
65
+ navbarBlockDefinition: () => navbarBlockDefinition,
66
+ placeholderImage: () => placeholderImage,
67
+ placeholderSize: () => placeholderSize,
68
+ productLeftTemplate: () => productLeftTemplate,
69
+ productRightTemplate: () => productRightTemplate,
70
+ products2ColTemplate: () => products2ColTemplate,
71
+ products3ColTemplate: () => products3ColTemplate,
72
+ quoteBlockTemplate: () => quoteBlockTemplate,
73
+ rawBlockDefinition: () => rawBlockDefinition,
74
+ sectionTitle1Template: () => sectionTitle1Template,
75
+ sectionTitle2Template: () => sectionTitle2Template,
76
+ sectionTitle3Template: () => sectionTitle3Template,
77
+ signature1Template: () => signature1Template,
78
+ signature2Template: () => signature2Template,
79
+ signature3Template: () => signature3Template,
80
+ signature4Template: () => signature4Template,
81
+ socialBlockDefinition: () => socialBlockDefinition,
82
+ spacerBlockDefinition: () => spacerBlockDefinition,
83
+ spacerSectionTemplate: () => spacerSectionTemplate,
84
+ styledBody: () => styledBody,
85
+ styledHeading: () => styledHeading,
86
+ styledLabel: () => styledLabel,
87
+ tableBlockDefinition: () => tableBlockDefinition,
88
+ takeActionTemplate: () => takeActionTemplate,
89
+ templateCategories: () => templateCategories,
90
+ textBlockDefinition: () => textBlockDefinition,
91
+ textImageLeftTemplate: () => textImageLeftTemplate,
92
+ textImageRightTemplate: () => textImageRightTemplate,
93
+ utilityTemplates: () => utilityTemplates,
94
+ withHostedPlaceholders: () => withHostedPlaceholders
95
+ });
96
+ module.exports = __toCommonJS(index_exports);
97
+
98
+ // src/registry.ts
99
+ var import_email_editor_core14 = require("@marlinjai/email-editor-core");
100
+
101
+ // src/prebuilt/section-defaults.ts
102
+ var PALETTE = {
103
+ // Primary colors
104
+ primary: "#374151",
105
+ // Slate - buttons and accents
106
+ primaryDark: "#111827",
107
+ // Near black - headings
108
+ primaryLight: "#9ca3af",
109
+ // Light slate - secondary accents
110
+ // Background colors
111
+ bgMuted: "#f5f5f5",
112
+ // Main background
113
+ bgWhite: "#ffffff",
114
+ // White sections
115
+ bgLight: "#fafafa",
116
+ // Slightly off white
117
+ // Text colors
118
+ textDark: "#111827",
119
+ // Near black for headings
120
+ textBody: "#4b5563",
121
+ // Grey for body text
122
+ textLight: "#9ca3af",
123
+ // Light grey for captions
124
+ textWhite: "#ffffff",
125
+ // White text on dark bg
126
+ // Border & divider
127
+ border: "#e5e7eb",
128
+ // Subtle grey border
129
+ divider: "#d1d5db"
130
+ // Grey divider
131
+ };
132
+ var TYPOGRAPHY = {
133
+ // Heading styles
134
+ h1: "font-family: Helvetica, Arial, sans-serif; font-weight: 700; font-size: 32px; line-height: 1.2;",
135
+ h2: "font-family: Helvetica, Arial, sans-serif; font-weight: 700; font-size: 26px; line-height: 1.3;",
136
+ h3: "font-family: Helvetica, Arial, sans-serif; font-weight: 600; font-size: 21px; line-height: 1.4;",
137
+ h4: "font-family: Helvetica, Arial, sans-serif; font-weight: 600; font-size: 18px; line-height: 1.4;",
138
+ // Body styles
139
+ body: "font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 1.6;",
140
+ bodySmall: "font-family: Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.5;",
141
+ caption: "font-family: Helvetica, Arial, sans-serif; font-size: 12px; line-height: 1.4;",
142
+ // Special styles
143
+ signature: 'font-family: Georgia, "Times New Roman", serif; font-style: italic; font-size: 22px;',
144
+ label: "font-family: Helvetica, Arial, sans-serif; font-size: 11px; letter-spacing: 1.5px; text-transform: uppercase;",
145
+ price: 'font-family: Georgia, "Times New Roman", serif; font-weight: 600;'
146
+ };
147
+ function placeholderImage(width, height) {
148
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}"><rect width="${width}" height="${height}" fill="${PALETTE.bgMuted}" stroke="${PALETTE.border}" stroke-width="2"/></svg>`;
149
+ return `data:image/svg+xml,${encodeURIComponent(svg)}`;
150
+ }
151
+ function placeholderSize(src) {
152
+ if (!src.startsWith("data:image/svg+xml,")) return null;
153
+ const decoded = decodeURIComponent(src.slice("data:image/svg+xml,".length));
154
+ const match = /^<svg [^>]*\bwidth="(\d+)" height="(\d+)"/.exec(decoded);
155
+ return match ? { width: Number(match[1]), height: Number(match[2]) } : null;
156
+ }
157
+ function hostedPlaceholder(src, base) {
158
+ if (!base) return src;
159
+ const size = placeholderSize(src);
160
+ if (!size) return src;
161
+ return `${base.replace(/\/+$/, "")}/p/${size.width}x${size.height}.png`;
162
+ }
163
+ var PLACEHOLDER_ALT = "Placeholder image, replace with your own";
164
+ var PLACEHOLDER = {
165
+ // Branding
166
+ companyName: "Your company",
167
+ tagline: "Your tagline goes here",
168
+ // Sender details
169
+ ownerName: "Your name",
170
+ ownerTitle: "Your title",
171
+ ownerContact: "Your email address",
172
+ // Common CTAs
173
+ ctaBookSession: "Book now",
174
+ ctaLearnMore: "Learn more",
175
+ ctaReadMore: "Read more",
176
+ ctaGetStarted: "Get started",
177
+ ctaExplore: "Explore more",
178
+ // Headlines
179
+ headlines: [
180
+ "Your headline here",
181
+ "A second headline",
182
+ "A third headline",
183
+ "One, two, three.",
184
+ "Your subject in a few words"
185
+ ],
186
+ // Common body text
187
+ bodyText: {
188
+ intro: "A short paragraph introducing this section. Replace it with your own text, and keep it to a couple of sentences so it stays readable on a phone.",
189
+ destination: "A closing line that says what the reader gets out of it.",
190
+ welcome: "Thank you for subscribing. Replace this paragraph with a welcome in your own words."
191
+ },
192
+ // Closing
193
+ closing: {
194
+ gratitude: "With kind regards,",
195
+ signature: "Your name"
196
+ },
197
+ // Footer
198
+ footer: {
199
+ unsubscribe: "If you no longer wish to receive these emails, you can",
200
+ unsubscribeLink: "unsubscribe here",
201
+ received: "You received this email because you subscribed to this newsletter."
202
+ },
203
+ // Logo, a placeholder square until the host sets its own
204
+ logoUrl: placeholderImage(120, 120),
205
+ // Website
206
+ website: "https://example.com"
207
+ };
208
+ function styledHeading(text, level = 1) {
209
+ const tag = `h${level}`;
210
+ const style = TYPOGRAPHY[`h${level}`];
211
+ return `<${tag} style="margin:0;${style}color:${PALETTE.textDark};">${text}</${tag}>`;
212
+ }
213
+ function styledBody(text, centered = false) {
214
+ const align = centered ? "text-align:center;" : "";
215
+ return `<p style="margin:0;${TYPOGRAPHY.body}color:${PALETTE.textBody};${align}">${text}</p>`;
216
+ }
217
+ function styledLabel(text) {
218
+ return `<p style="margin:0 0 8px 0;${TYPOGRAPHY.label}color:${PALETTE.primary};">${text}</p>`;
219
+ }
220
+
221
+ // src/placeholders.ts
222
+ var LOADING_KEYS = /* @__PURE__ */ new Set(["src", "backgroundImage", "logoUrl", "thumbnail", "poster"]);
223
+ function withHostedPlaceholders(value, base) {
224
+ if (!base) return value;
225
+ return walk(value, base);
226
+ }
227
+ function walk(value, base, key) {
228
+ if (typeof value === "string") return key && LOADING_KEYS.has(key) ? hostedPlaceholder(value, base) : value;
229
+ if (Array.isArray(value)) return value.map((v) => walk(v, base, key));
230
+ if (value && typeof value === "object") {
231
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, walk(v, base, k)]));
232
+ }
233
+ return value;
234
+ }
235
+
236
+ // src/text/index.ts
237
+ var import_email_editor_core = require("@marlinjai/email-editor-core");
238
+ var textBlockDefinition = {
239
+ type: "text",
240
+ label: "Text",
241
+ category: "text",
242
+ description: "Rich text content",
243
+ defaultProps: {
244
+ content: "<p>Enter your text here...</p>",
245
+ align: "left",
246
+ color: "#000000",
247
+ fontSize: "14px",
248
+ fontFamily: "Georgia, serif"
249
+ },
250
+ propSchema: import_email_editor_core.TextBlockSchema.omit({ id: true, type: true }),
251
+ toMJML: (block) => {
252
+ const attrs = [];
253
+ if (block.align) attrs.push(`align="${block.align}"`);
254
+ if (block.color) attrs.push(`color="${block.color}"`);
255
+ if (block.fontSize) attrs.push(`font-size="${block.fontSize}"`);
256
+ if (block.fontFamily) attrs.push(`font-family="${block.fontFamily}"`);
257
+ if (block.lineHeight) attrs.push(`line-height="${block.lineHeight}"`);
258
+ if (block.padding) {
259
+ const padding = [
260
+ block.padding.top,
261
+ block.padding.right,
262
+ block.padding.bottom,
263
+ block.padding.left
264
+ ].filter(Boolean).join(" ");
265
+ if (padding) attrs.push(`padding="${padding}"`);
266
+ }
267
+ return `<mj-text ${attrs.join(" ")} css-class="el-text el-${block.id}">${block.content}</mj-text>`;
268
+ }
269
+ };
270
+
271
+ // src/image/index.ts
272
+ var import_email_editor_core2 = require("@marlinjai/email-editor-core");
273
+ var imageBlockDefinition = {
274
+ type: "image",
275
+ label: "Image",
276
+ category: "media",
277
+ description: "Insert an image",
278
+ defaultProps: {
279
+ // A `data:` URI, not an address on an image host: a workspace whose
280
+ // `asset_policy` is `service_only` refuses every remote address at compile,
281
+ // so a freshly dropped image block would otherwise produce a mail that
282
+ // cannot be sent until its src is replaced.
283
+ src: placeholderImage(600, 400),
284
+ alt: PLACEHOLDER_ALT,
285
+ align: "center",
286
+ width: "600px"
287
+ },
288
+ propSchema: import_email_editor_core2.ImageBlockSchema.omit({ id: true, type: true }),
289
+ toMJML: (block) => {
290
+ const attrs = [`src="${block.src}"`, `data-block-id="${block.id}"`];
291
+ if (block.alt) attrs.push(`alt="${block.alt}"`);
292
+ if (block.width) attrs.push(`width="${block.width}"`);
293
+ if (block.height) attrs.push(`height="${block.height}"`);
294
+ if (block.align) attrs.push(`align="${block.align}"`);
295
+ if (block.href) attrs.push(`href="${block.href}"`);
296
+ if (block.padding) {
297
+ const padding = [
298
+ block.padding.top,
299
+ block.padding.right,
300
+ block.padding.bottom,
301
+ block.padding.left
302
+ ].filter(Boolean).join(" ");
303
+ if (padding) attrs.push(`padding="${padding}"`);
304
+ }
305
+ return `<mj-image ${attrs.join(" ")} css-class="el-image el-${block.id}" />`;
306
+ }
307
+ };
308
+
309
+ // src/button/index.ts
310
+ var import_email_editor_core3 = require("@marlinjai/email-editor-core");
311
+ var buttonBlockDefinition = {
312
+ type: "button",
313
+ label: "Button",
314
+ category: "media",
315
+ description: "Call-to-action button",
316
+ defaultProps: {
317
+ label: "Click Here",
318
+ href: "https://example.com",
319
+ align: "center",
320
+ backgroundColor: "#944923",
321
+ color: "#ffffff",
322
+ borderRadius: "4px",
323
+ innerPadding: "12px 24px"
324
+ },
325
+ propSchema: import_email_editor_core3.ButtonBlockSchema.omit({ id: true, type: true }),
326
+ toMJML: (block) => {
327
+ const attrs = [`href="${block.href}"`, `data-block-id="${block.id}"`];
328
+ if (block.align) attrs.push(`align="${block.align}"`);
329
+ if (block.backgroundColor) attrs.push(`background-color="${block.backgroundColor}"`);
330
+ if (block.color) attrs.push(`color="${block.color}"`);
331
+ if (block.borderRadius) attrs.push(`border-radius="${block.borderRadius}"`);
332
+ if (block.innerPadding) attrs.push(`inner-padding="${block.innerPadding}"`);
333
+ if (block.padding) {
334
+ const padding = [
335
+ block.padding.top,
336
+ block.padding.right,
337
+ block.padding.bottom,
338
+ block.padding.left
339
+ ].filter(Boolean).join(" ");
340
+ if (padding) attrs.push(`padding="${padding}"`);
341
+ }
342
+ return `<mj-button ${attrs.join(" ")} css-class="el-button el-${block.id}">${block.label}</mj-button>`;
343
+ }
344
+ };
345
+
346
+ // src/divider/index.ts
347
+ var import_email_editor_core4 = require("@marlinjai/email-editor-core");
348
+ var dividerBlockDefinition = {
349
+ type: "divider",
350
+ label: "Divider",
351
+ category: "layout",
352
+ description: "Horizontal divider line",
353
+ defaultProps: {
354
+ borderColor: "#cccccc",
355
+ borderWidth: "1px",
356
+ borderStyle: "solid"
357
+ },
358
+ propSchema: import_email_editor_core4.DividerBlockSchema.omit({ id: true, type: true }),
359
+ toMJML: (block) => {
360
+ const attrs = [`data-block-id="${block.id}"`];
361
+ if (block.borderColor) attrs.push(`border-color="${block.borderColor}"`);
362
+ if (block.borderWidth) attrs.push(`border-width="${block.borderWidth}"`);
363
+ if (block.borderStyle) attrs.push(`border-style="${block.borderStyle}"`);
364
+ if (block.padding) {
365
+ const padding = [
366
+ block.padding.top,
367
+ block.padding.right,
368
+ block.padding.bottom,
369
+ block.padding.left
370
+ ].filter(Boolean).join(" ");
371
+ if (padding) attrs.push(`padding="${padding}"`);
372
+ }
373
+ return `<mj-divider ${attrs.join(" ")} css-class="el-divider el-${block.id}" />`;
374
+ }
375
+ };
376
+
377
+ // src/spacer/index.ts
378
+ var import_email_editor_core5 = require("@marlinjai/email-editor-core");
379
+ var spacerBlockDefinition = {
380
+ type: "spacer",
381
+ label: "Spacer",
382
+ category: "layout",
383
+ description: "Vertical spacing",
384
+ defaultProps: {
385
+ height: "20px"
386
+ },
387
+ propSchema: import_email_editor_core5.SpacerBlockSchema.omit({ id: true, type: true }),
388
+ toMJML: (block) => {
389
+ return `<mj-spacer height="${block.height}" css-class="el-spacer el-${block.id}" />`;
390
+ }
391
+ };
392
+
393
+ // src/social/index.ts
394
+ var import_email_editor_core6 = require("@marlinjai/email-editor-core");
395
+ var SOCIAL_COLORS = {
396
+ facebook: "#1877F2",
397
+ twitter: "#000000",
398
+ instagram: "#E4405F",
399
+ linkedin: "#0A66C2",
400
+ youtube: "#FF0000",
401
+ pinterest: "#BD081C",
402
+ github: "#181717"
403
+ };
404
+ function getSocialIconDataUri(platform) {
405
+ const svgIcons = {
406
+ facebook: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg>',
407
+ twitter: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white"><path d="M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z"/></svg>',
408
+ instagram: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white"><path d="M12 0C8.74 0 8.333.015 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.74 0 12s.015 3.667.072 4.947c.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.74 24 12 24s3.667-.015 4.947-.072c4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z"/></svg>',
409
+ linkedin: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>',
410
+ youtube: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white"><path d="M23.498 6.186a3.016 3.016 0 00-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 00.502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 002.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 002.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"/></svg>',
411
+ pinterest: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white"><path d="M12 0C5.373 0 0 5.372 0 12c0 5.084 3.163 9.426 7.627 11.174-.105-.949-.2-2.405.042-3.441.218-.937 1.407-5.965 1.407-5.965s-.359-.719-.359-1.782c0-1.668.967-2.914 2.171-2.914 1.023 0 1.518.769 1.518 1.69 0 1.029-.655 2.568-.994 3.995-.283 1.194.599 2.169 1.777 2.169 2.133 0 3.772-2.249 3.772-5.495 0-2.873-2.064-4.882-5.012-4.882-3.414 0-5.418 2.561-5.418 5.207 0 1.031.397 2.138.893 2.738a.36.36 0 01.083.345c-.091.378-.293 1.194-.333 1.361-.052.218-.174.265-.402.159-1.495-.696-2.428-2.882-2.428-4.64 0-3.779 2.744-7.253 7.917-7.253 4.158 0 7.389 2.963 7.389 6.923 0 4.13-2.607 7.461-6.229 7.461-1.217 0-2.36-.632-2.75-1.378l-.748 2.853c-.271 1.043-1.002 2.35-1.492 3.146C9.57 23.812 10.763 24 12 24c6.627 0 12-5.373 12-12S18.627 0 12 0z"/></svg>',
412
+ github: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>'
413
+ };
414
+ const svg = svgIcons[platform] || svgIcons.facebook;
415
+ return `data:image/svg+xml;base64,${Buffer.from(svg).toString("base64")}`;
416
+ }
417
+ var socialBlockDefinition = {
418
+ type: "social",
419
+ label: "Social Icons",
420
+ category: "media",
421
+ description: "Social media links",
422
+ defaultProps: {
423
+ mode: "horizontal",
424
+ align: "center",
425
+ iconSize: "40px",
426
+ iconPadding: "8px",
427
+ borderRadius: "999px",
428
+ // Round icons by default
429
+ links: [
430
+ { platform: "facebook", url: "https://facebook.com" },
431
+ { platform: "instagram", url: "https://instagram.com" },
432
+ { platform: "linkedin", url: "https://linkedin.com" }
433
+ ]
434
+ },
435
+ propSchema: import_email_editor_core6.SocialBlockSchema.omit({ id: true, type: true }),
436
+ toMJML: (block) => {
437
+ const iconSize = block.iconSize || "40px";
438
+ const iconPadding = block.iconPadding || "8px";
439
+ const borderRadius = block.borderRadius || "999px";
440
+ const align = block.align || "center";
441
+ const isVertical = block.mode === "vertical";
442
+ const sizeNum = parseInt(iconSize, 10) || 40;
443
+ const innerIconSize = Math.round(sizeNum * 0.5);
444
+ const paddingNum = parseInt(iconPadding, 10) || 8;
445
+ const getLinkColor = (link) => {
446
+ return link.color || SOCIAL_COLORS[link.platform] || "#666666";
447
+ };
448
+ if (isVertical) {
449
+ return block.links.map((link) => {
450
+ const bgColor = getLinkColor(link);
451
+ const iconUrl = getSocialIconDataUri(link.platform);
452
+ return `<mj-button href="${link.url}" background-color="${bgColor}" border-radius="${borderRadius}" width="${iconSize}" height="${iconSize}" padding="${iconPadding} 0" inner-padding="0" align="${align}" css-class="el-social-btn el-${block.id}-${link.platform}"><img src="${iconUrl}" alt="${link.platform}" width="${innerIconSize}" height="${innerIconSize}" style="display:block;margin:auto;" /></mj-button>`;
453
+ }).join("\n");
454
+ }
455
+ const alignMargin = align === "center" ? "0 auto" : align === "right" ? "0 0 0 auto" : "0 auto 0 0";
456
+ const socialCells = block.links.map((link, index) => {
457
+ const bgColor = getLinkColor(link);
458
+ const iconUrl = getSocialIconDataUri(link.platform);
459
+ const isLast = index === block.links.length - 1;
460
+ const cellPadding = isLast ? "0" : `0 ${paddingNum}px 0 0`;
461
+ const paddingForCentering = Math.round((sizeNum - innerIconSize) / 2);
462
+ return `<td style="padding: ${cellPadding};"><a href="${link.url}" target="_blank" style="display: block; width: ${iconSize}; height: ${iconSize}; background-color: ${bgColor}; border-radius: ${borderRadius}; text-decoration: none;"><img src="${iconUrl}" alt="${link.platform}" width="${innerIconSize}" height="${innerIconSize}" style="display: block; margin: ${paddingForCentering}px auto 0 auto;" /></a></td>`;
463
+ }).join("");
464
+ return `<mj-raw><table align="${align}" role="presentation" cellpadding="0" cellspacing="0" style="margin: ${alignMargin};"><tr>${socialCells}</tr></table></mj-raw>`;
465
+ }
466
+ };
467
+
468
+ // src/hero/index.ts
469
+ var import_email_editor_core7 = require("@marlinjai/email-editor-core");
470
+ var heroBlockDefinition = {
471
+ type: "hero",
472
+ label: "Hero",
473
+ category: "layout",
474
+ description: "Full-width hero with background",
475
+ defaultProps: {
476
+ // A `data:` URI rather than a remote one, so a `service_only` workspace can
477
+ // send a mail containing a hero whose background has not been chosen yet.
478
+ backgroundImage: placeholderImage(1200, 600),
479
+ backgroundHeight: "400px",
480
+ backgroundColor: "#374151",
481
+ verticalAlign: "middle",
482
+ mode: "fluid-height"
483
+ },
484
+ propSchema: import_email_editor_core7.HeroBlockSchema.omit({ id: true, type: true }),
485
+ toMJML: (block) => {
486
+ const attrs = [
487
+ `background-url="${block.backgroundImage}"`,
488
+ `css-class="el-hero el-${block.id}"`
489
+ ];
490
+ if (block.backgroundHeight) attrs.push(`background-height="${block.backgroundHeight}"`);
491
+ if (block.backgroundWidth) attrs.push(`background-width="${block.backgroundWidth}"`);
492
+ if (block.backgroundColor) attrs.push(`background-color="${block.backgroundColor}"`);
493
+ if (block.verticalAlign) attrs.push(`vertical-align="${block.verticalAlign}"`);
494
+ if (block.mode) attrs.push(`mode="${block.mode}"`);
495
+ return `
496
+ <mj-hero ${attrs.join(" ")}>
497
+ <mj-text align="center" color="#ffffff" font-size="32px" font-weight="bold">
498
+ Hero Title
499
+ </mj-text>
500
+ <mj-text align="center" color="#ffffff" font-size="16px">
501
+ Add your hero content here
502
+ </mj-text>
503
+ </mj-hero>
504
+ `.trim();
505
+ }
506
+ };
507
+
508
+ // src/accordion/index.ts
509
+ var import_email_editor_core8 = require("@marlinjai/email-editor-core");
510
+ var accordionBlockDefinition = {
511
+ type: "accordion",
512
+ label: "Accordion",
513
+ category: "text",
514
+ description: "Collapsible FAQ sections",
515
+ defaultProps: {
516
+ items: [
517
+ { title: "Question 1", content: "Answer to question 1" },
518
+ { title: "Question 2", content: "Answer to question 2" }
519
+ ],
520
+ iconPosition: "right",
521
+ borderColor: "#e0e0e0"
522
+ },
523
+ propSchema: import_email_editor_core8.AccordionBlockSchema.omit({ id: true, type: true }),
524
+ toMJML: (block) => {
525
+ const attrs = [`css-class="el-accordion el-${block.id}"`];
526
+ if (block.iconPosition) attrs.push(`icon-position="${block.iconPosition}"`);
527
+ if (block.borderColor) attrs.push(`border="${block.borderColor}"`);
528
+ if (block.fontFamily) attrs.push(`font-family="${block.fontFamily}"`);
529
+ const items = block.items.map(
530
+ (item) => `
531
+ <mj-accordion-element>
532
+ <mj-accordion-title>${item.title}</mj-accordion-title>
533
+ <mj-accordion-text>${item.content}</mj-accordion-text>
534
+ </mj-accordion-element>`
535
+ ).join("\n");
536
+ return `
537
+ <mj-accordion ${attrs.join(" ")}>
538
+ ${items}
539
+ </mj-accordion>
540
+ `.trim();
541
+ }
542
+ };
543
+
544
+ // src/raw/index.ts
545
+ var import_email_editor_core9 = require("@marlinjai/email-editor-core");
546
+ var rawBlockDefinition = {
547
+ type: "raw",
548
+ label: "HTML Block",
549
+ category: "layout",
550
+ description: "Custom HTML code",
551
+ defaultProps: {
552
+ html: "<!-- Custom HTML here -->"
553
+ },
554
+ propSchema: import_email_editor_core9.RawBlockSchema.omit({ id: true, type: true }),
555
+ toMJML: (block) => {
556
+ return `<mj-raw css-class="el-raw el-${block.id}">${block.html}</mj-raw>`;
557
+ }
558
+ };
559
+
560
+ // src/navbar/index.ts
561
+ var import_email_editor_core10 = require("@marlinjai/email-editor-core");
562
+ var navbarBlockDefinition = {
563
+ type: "navbar",
564
+ label: "Navigation",
565
+ category: "layout",
566
+ description: "Navigation menu with links",
567
+ defaultProps: {
568
+ // `example.com`, not `#`: a fragment is a dead end in a reader's inbox,
569
+ // where there is no page to scroll. It has to be replaced either way, and
570
+ // an address that goes somewhere fails visibly rather than silently.
571
+ links: [
572
+ { label: "Home", href: "https://example.com" },
573
+ { label: "About", href: "https://example.com" },
574
+ { label: "Contact", href: "https://example.com" }
575
+ ],
576
+ hamburger: true,
577
+ align: "center"
578
+ },
579
+ propSchema: import_email_editor_core10.NavbarBlockSchema.omit({ id: true, type: true }),
580
+ toMJML: (block) => {
581
+ const attrs = [`css-class="el-navbar el-${block.id}"`];
582
+ if (block.hamburger) attrs.push('hamburger="hamburger"');
583
+ if (block.baseUrl) attrs.push(`base-url="${block.baseUrl}"`);
584
+ if (block.align) attrs.push(`align="${block.align}"`);
585
+ if (block.icoColor) attrs.push(`ico-color="${block.icoColor}"`);
586
+ if (block.padding) {
587
+ const padding = [
588
+ block.padding.top,
589
+ block.padding.right,
590
+ block.padding.bottom,
591
+ block.padding.left
592
+ ].filter(Boolean).join(" ");
593
+ if (padding) attrs.push(`padding="${padding}"`);
594
+ }
595
+ const links = block.links.map((link) => {
596
+ const linkAttrs = [`href="${link.href}"`];
597
+ if (link.color) linkAttrs.push(`color="${link.color}"`);
598
+ return `<mj-navbar-link ${linkAttrs.join(" ")}>${link.label}</mj-navbar-link>`;
599
+ }).join("\n ");
600
+ return `
601
+ <mj-navbar ${attrs.join(" ")}>
602
+ ${links}
603
+ </mj-navbar>
604
+ `.trim();
605
+ }
606
+ };
607
+
608
+ // src/carousel/index.ts
609
+ var import_email_editor_core11 = require("@marlinjai/email-editor-core");
610
+ var carouselBlockDefinition = {
611
+ type: "carousel",
612
+ label: "Carousel",
613
+ category: "media",
614
+ description: "Image gallery with navigation",
615
+ defaultProps: {
616
+ images: [
617
+ // `data:` URIs, so a `service_only` workspace can send a carousel whose
618
+ // slides have not been replaced yet.
619
+ { src: placeholderImage(600, 300), alt: PLACEHOLDER_ALT },
620
+ { src: placeholderImage(600, 300), alt: PLACEHOLDER_ALT },
621
+ { src: placeholderImage(600, 300), alt: PLACEHOLDER_ALT }
622
+ ],
623
+ thumbnails: "visible",
624
+ borderRadius: "6px"
625
+ },
626
+ propSchema: import_email_editor_core11.CarouselBlockSchema.omit({ id: true, type: true }),
627
+ toMJML: (block) => {
628
+ const attrs = [`css-class="el-carousel el-${block.id}"`];
629
+ if (block.thumbnails) attrs.push(`thumbnails="${block.thumbnails}"`);
630
+ if (block.borderRadius) attrs.push(`border-radius="${block.borderRadius}"`);
631
+ if (block.iconWidth) attrs.push(`icon-width="${block.iconWidth}"`);
632
+ if (block.tbBorderRadius) attrs.push(`tb-border-radius="${block.tbBorderRadius}"`);
633
+ if (block.padding) {
634
+ const padding = [
635
+ block.padding.top,
636
+ block.padding.right,
637
+ block.padding.bottom,
638
+ block.padding.left
639
+ ].filter(Boolean).join(" ");
640
+ if (padding) attrs.push(`padding="${padding}"`);
641
+ }
642
+ const images = block.images.map((img) => {
643
+ const imgAttrs = [`src="${img.src}"`];
644
+ if (img.alt) imgAttrs.push(`alt="${img.alt}"`);
645
+ if (img.href) imgAttrs.push(`href="${img.href}"`);
646
+ if (img.thumbnailSrc) imgAttrs.push(`thumbnails-src="${img.thumbnailSrc}"`);
647
+ return `<mj-carousel-image ${imgAttrs.join(" ")} />`;
648
+ }).join("\n ");
649
+ return `
650
+ <mj-carousel ${attrs.join(" ")}>
651
+ ${images}
652
+ </mj-carousel>
653
+ `.trim();
654
+ }
655
+ };
656
+
657
+ // src/table/index.ts
658
+ var import_email_editor_core12 = require("@marlinjai/email-editor-core");
659
+ var tableBlockDefinition = {
660
+ type: "table",
661
+ label: "Table",
662
+ category: "text",
663
+ description: "Data table with rows and columns",
664
+ defaultProps: {
665
+ headers: ["Column 1", "Column 2", "Column 3"],
666
+ rows: [
667
+ ["Data 1", "Data 2", "Data 3"],
668
+ ["Data 4", "Data 5", "Data 6"]
669
+ ],
670
+ align: "left",
671
+ color: "#000000",
672
+ fontSize: "14px",
673
+ cellpadding: "8px"
674
+ },
675
+ propSchema: import_email_editor_core12.TableBlockSchema.omit({ id: true, type: true }),
676
+ toMJML: (block) => {
677
+ const attrs = [`css-class="el-table el-${block.id}"`];
678
+ if (block.align) attrs.push(`align="${block.align}"`);
679
+ if (block.color) attrs.push(`color="${block.color}"`);
680
+ if (block.fontFamily) attrs.push(`font-family="${block.fontFamily}"`);
681
+ if (block.fontSize) attrs.push(`font-size="${block.fontSize}"`);
682
+ if (block.cellpadding) attrs.push(`cellpadding="${block.cellpadding}"`);
683
+ if (block.cellspacing) attrs.push(`cellspacing="${block.cellspacing}"`);
684
+ if (block.border) attrs.push(`border="${block.border}"`);
685
+ if (block.padding) {
686
+ const padding = [
687
+ block.padding.top,
688
+ block.padding.right,
689
+ block.padding.bottom,
690
+ block.padding.left
691
+ ].filter(Boolean).join(" ");
692
+ if (padding) attrs.push(`padding="${padding}"`);
693
+ }
694
+ const headerCells = block.headers.map((h) => `<th style="padding: 8px; border-bottom: 1px solid #ddd; text-align: left;">${h}</th>`).join("");
695
+ const headerRow = `<tr style="background-color: #f5f5f5;">${headerCells}</tr>`;
696
+ const dataRows = block.rows.map((row) => {
697
+ const cells = row.map((cell) => `<td style="padding: 8px; border-bottom: 1px solid #eee;">${cell}</td>`).join("");
698
+ return `<tr>${cells}</tr>`;
699
+ }).join("\n ");
700
+ return `
701
+ <mj-table ${attrs.join(" ")}>
702
+ ${headerRow}
703
+ ${dataRows}
704
+ </mj-table>
705
+ `.trim();
706
+ }
707
+ };
708
+
709
+ // src/branded/index.ts
710
+ var import_email_editor_core13 = require("@marlinjai/email-editor-core");
711
+ var headerBlockDefinition = {
712
+ type: "header",
713
+ label: "Header",
714
+ category: "brand",
715
+ description: "Newsletter header",
716
+ locked: true,
717
+ defaultProps: {
718
+ locked: true
719
+ },
720
+ propSchema: import_email_editor_core13.HeaderBlockSchema.omit({ id: true, type: true }),
721
+ toMJML: (block) => {
722
+ return `
723
+ <mj-wrapper background-color="#ffffff" padding="20px" css-class="el-header el-${block.id}">
724
+ <mj-section>
725
+ <mj-column>
726
+ <!-- Nothing: this block carries no props, so anything here is content
727
+ whoever sends the mail cannot change. It held a placeholder logo,
728
+ which the send guard would refuse with no way for them to fix it. -->
729
+ <mj-spacer height="1px" />
730
+ </mj-column>
731
+ </mj-section>
732
+ </mj-wrapper>
733
+ `.trim();
734
+ }
735
+ };
736
+ var footerBlockDefinition = {
737
+ type: "footer",
738
+ label: "Footer",
739
+ category: "brand",
740
+ description: "Newsletter footer with the unsubscribe link",
741
+ locked: true,
742
+ defaultProps: {
743
+ locked: true
744
+ },
745
+ propSchema: import_email_editor_core13.FooterBlockSchema.omit({ id: true, type: true }),
746
+ toMJML: (block) => {
747
+ return `
748
+ <mj-wrapper background-color="#f5f5f5" padding="20px" css-class="el-footer el-${block.id}">
749
+ <mj-section>
750
+ <mj-column>
751
+ <mj-text align="center" font-size="12px" color="#666666">
752
+ <a href="{{unsubscribe_url}}" style="color: #374151; text-decoration: underline;">Unsubscribe</a>
753
+ </mj-text>
754
+ </mj-column>
755
+ </mj-section>
756
+ </mj-wrapper>
757
+ `.trim();
758
+ }
759
+ };
760
+
761
+ // src/registry.ts
762
+ function createStandardBlockRegistry(options = {}) {
763
+ const registry = (0, import_email_editor_core14.createBlockRegistry)();
764
+ const hosted = (definition) => options.placeholderBase ? { ...definition, defaultProps: withHostedPlaceholders(definition.defaultProps, options.placeholderBase) } : definition;
765
+ registry.register(textBlockDefinition);
766
+ registry.register(hosted(imageBlockDefinition));
767
+ registry.register(buttonBlockDefinition);
768
+ registry.register(dividerBlockDefinition);
769
+ registry.register(spacerBlockDefinition);
770
+ registry.register(socialBlockDefinition);
771
+ registry.register(hosted(heroBlockDefinition));
772
+ registry.register(accordionBlockDefinition);
773
+ registry.register(rawBlockDefinition);
774
+ registry.register(navbarBlockDefinition);
775
+ registry.register(hosted(carouselBlockDefinition));
776
+ registry.register(tableBlockDefinition);
777
+ registry.register(headerBlockDefinition);
778
+ registry.register(footerBlockDefinition);
779
+ return registry;
780
+ }
781
+
782
+ // src/prebuilt/index.ts
783
+ var import_email_editor_core15 = require("@marlinjai/email-editor-core");
784
+
785
+ // src/prebuilt/hero-templates.ts
786
+ var heroMainTemplate = {
787
+ id: "hero-main",
788
+ name: "Hero - Main",
789
+ category: "hero",
790
+ description: "Full-width hero with a coloured background and a button",
791
+ section: {
792
+ id: "hero-main-section",
793
+ type: "section",
794
+ backgroundColor: PALETTE.primary,
795
+ padding: { top: "80px", bottom: "80px" },
796
+ columns: [
797
+ {
798
+ id: "hero-main-col",
799
+ blocks: [
800
+ {
801
+ id: "hero-main-title",
802
+ type: "text",
803
+ content: `<h1 style="margin:0;${TYPOGRAPHY.h1}color:${PALETTE.textWhite};">Your headline here</h1>`,
804
+ align: "center"
805
+ },
806
+ {
807
+ id: "hero-main-subtitle",
808
+ type: "text",
809
+ content: `<p style="margin:20px 0 32px 0;${TYPOGRAPHY.body}color:${PALETTE.textWhite};">${PLACEHOLDER.tagline}</p>`,
810
+ align: "center"
811
+ },
812
+ {
813
+ id: "hero-main-button",
814
+ type: "button",
815
+ label: PLACEHOLDER.ctaBookSession,
816
+ href: PLACEHOLDER.website,
817
+ align: "center",
818
+ backgroundColor: PALETTE.bgWhite,
819
+ color: PALETTE.primary,
820
+ borderRadius: "30px",
821
+ padding: { left: "32px", right: "32px", top: "14px", bottom: "14px" }
822
+ }
823
+ ]
824
+ }
825
+ ]
826
+ }
827
+ };
828
+ var heroNewsletterTemplate = {
829
+ id: "hero-newsletter",
830
+ name: "Hero - Newsletter Header",
831
+ category: "hero",
832
+ description: "Centered logo with welcome headline for newsletters",
833
+ section: {
834
+ id: "hero-newsletter-section",
835
+ type: "section",
836
+ backgroundColor: PALETTE.bgMuted,
837
+ padding: { top: "50px", bottom: "40px" },
838
+ columns: [
839
+ {
840
+ id: "hero-newsletter-col",
841
+ blocks: [
842
+ {
843
+ id: "hero-newsletter-logo",
844
+ type: "image",
845
+ src: PLACEHOLDER.logoUrl,
846
+ alt: PLACEHOLDER_ALT,
847
+ width: "120px",
848
+ align: "center"
849
+ },
850
+ {
851
+ id: "hero-newsletter-title",
852
+ type: "text",
853
+ content: `<h1 style="margin:30px 0 16px 0;${TYPOGRAPHY.h1}color:${PALETTE.textDark};">Your newsletter title</h1>`,
854
+ align: "center"
855
+ },
856
+ {
857
+ id: "hero-newsletter-tagline",
858
+ type: "text",
859
+ content: `<p style="margin:0;${TYPOGRAPHY.h3}color:${PALETTE.primary};">${PLACEHOLDER.tagline}</p>`,
860
+ align: "center"
861
+ }
862
+ ]
863
+ }
864
+ ]
865
+ }
866
+ };
867
+ var heroMinimalTemplate = {
868
+ id: "hero-minimal",
869
+ name: "Hero - Minimal",
870
+ category: "hero",
871
+ description: "Clean minimal hero with divider",
872
+ section: {
873
+ id: "hero-minimal-section",
874
+ type: "section",
875
+ backgroundColor: PALETTE.bgWhite,
876
+ padding: { top: "50px", bottom: "40px" },
877
+ columns: [
878
+ {
879
+ id: "hero-minimal-col",
880
+ blocks: [
881
+ {
882
+ id: "hero-minimal-title",
883
+ type: "text",
884
+ content: `<h1 style="margin:0;${TYPOGRAPHY.h1}color:${PALETTE.textDark};">A second headline</h1>`,
885
+ align: "center"
886
+ },
887
+ {
888
+ id: "hero-minimal-divider",
889
+ type: "divider",
890
+ borderColor: PALETTE.divider,
891
+ borderWidth: "2px",
892
+ borderStyle: "solid",
893
+ padding: { top: "24px", bottom: "24px" }
894
+ },
895
+ {
896
+ id: "hero-minimal-text",
897
+ type: "text",
898
+ content: `<p style="margin:0;${TYPOGRAPHY.body}color:${PALETTE.textBody};">${PLACEHOLDER.bodyText.destination}</p>`,
899
+ align: "center"
900
+ }
901
+ ]
902
+ }
903
+ ]
904
+ }
905
+ };
906
+ var heroSplitTemplate = {
907
+ id: "hero-split",
908
+ name: "Hero - Split",
909
+ category: "hero",
910
+ description: "Hero with image and text side by side",
911
+ section: {
912
+ id: "hero-split-section",
913
+ type: "section",
914
+ backgroundColor: PALETTE.bgMuted,
915
+ padding: { top: "40px", bottom: "40px" },
916
+ noStack: true,
917
+ columns: [
918
+ {
919
+ id: "hero-split-text-col",
920
+ width: 50,
921
+ verticalAlign: "middle",
922
+ padding: { right: "20px" },
923
+ blocks: [
924
+ {
925
+ id: "hero-split-label",
926
+ type: "text",
927
+ content: `<p style="margin:0 0 12px 0;${TYPOGRAPHY.label}color:${PALETTE.primary};">CATEGORY</p>`,
928
+ align: "left"
929
+ },
930
+ {
931
+ id: "hero-split-title",
932
+ type: "text",
933
+ content: `<h1 style="margin:0;${TYPOGRAPHY.h1}color:${PALETTE.textDark};">A third headline</h1>`,
934
+ align: "left"
935
+ },
936
+ {
937
+ id: "hero-split-desc",
938
+ type: "text",
939
+ content: `<p style="margin:20px 0 28px 0;${TYPOGRAPHY.body}color:${PALETTE.textBody};">${PLACEHOLDER.bodyText.intro}</p>`,
940
+ align: "left"
941
+ },
942
+ {
943
+ id: "hero-split-button",
944
+ type: "button",
945
+ label: PLACEHOLDER.ctaLearnMore,
946
+ href: PLACEHOLDER.website,
947
+ align: "left",
948
+ backgroundColor: PALETTE.primary,
949
+ color: PALETTE.textWhite,
950
+ borderRadius: "30px",
951
+ padding: { left: "28px", right: "28px", top: "12px", bottom: "12px" }
952
+ }
953
+ ]
954
+ },
955
+ {
956
+ id: "hero-split-image-col",
957
+ width: 50,
958
+ blocks: [
959
+ {
960
+ id: "hero-split-image",
961
+ type: "image",
962
+ src: placeholderImage(400, 350),
963
+ alt: PLACEHOLDER_ALT,
964
+ width: "100%",
965
+ align: "center",
966
+ borderRadius: "8px"
967
+ }
968
+ ]
969
+ }
970
+ ]
971
+ }
972
+ };
973
+ var heroTemplates = [
974
+ heroMainTemplate,
975
+ heroNewsletterTemplate,
976
+ heroMinimalTemplate,
977
+ heroSplitTemplate
978
+ ];
979
+
980
+ // src/prebuilt/content-templates.ts
981
+ var textImageRightTemplate = {
982
+ id: "text-image-right",
983
+ name: "Text + Image Right",
984
+ category: "content",
985
+ description: "Text block with image on the right",
986
+ section: {
987
+ id: "text-image-right-section",
988
+ type: "section",
989
+ backgroundColor: PALETTE.bgWhite,
990
+ padding: { top: "40px", bottom: "40px" },
991
+ noStack: true,
992
+ columns: [
993
+ {
994
+ id: "text-image-right-text-col",
995
+ width: 55,
996
+ verticalAlign: "middle",
997
+ padding: { right: "24px" },
998
+ blocks: [
999
+ {
1000
+ id: "text-image-right-label",
1001
+ type: "text",
1002
+ content: `<p style="margin:0 0 8px 0;${TYPOGRAPHY.label}color:${PALETTE.primary};">YOUR JOURNEY</p>`,
1003
+ align: "left"
1004
+ },
1005
+ {
1006
+ id: "text-image-right-title",
1007
+ type: "text",
1008
+ content: `<h2 style="margin:0;${TYPOGRAPHY.h2}color:${PALETTE.textDark};">Your headline here</h2>`,
1009
+ align: "left"
1010
+ },
1011
+ {
1012
+ id: "text-image-right-body",
1013
+ type: "text",
1014
+ content: `<p style="margin:16px 0 0 0;${TYPOGRAPHY.body}color:${PALETTE.textBody};">${PLACEHOLDER.bodyText.intro}</p>`,
1015
+ align: "left"
1016
+ }
1017
+ ]
1018
+ },
1019
+ {
1020
+ id: "text-image-right-image-col",
1021
+ width: 45,
1022
+ blocks: [
1023
+ {
1024
+ id: "text-image-right-image",
1025
+ type: "image",
1026
+ src: placeholderImage(350, 280),
1027
+ alt: PLACEHOLDER_ALT,
1028
+ width: "100%",
1029
+ align: "center",
1030
+ borderRadius: "8px"
1031
+ }
1032
+ ]
1033
+ }
1034
+ ]
1035
+ }
1036
+ };
1037
+ var textImageLeftTemplate = {
1038
+ id: "text-image-left",
1039
+ name: "Text + Image Left",
1040
+ category: "content",
1041
+ description: "Text block with image on the left",
1042
+ section: {
1043
+ id: "text-image-left-section",
1044
+ type: "section",
1045
+ backgroundColor: PALETTE.bgMuted,
1046
+ padding: { top: "40px", bottom: "40px" },
1047
+ noStack: true,
1048
+ columns: [
1049
+ {
1050
+ id: "text-image-left-image-col",
1051
+ width: 45,
1052
+ blocks: [
1053
+ {
1054
+ id: "text-image-left-image",
1055
+ type: "image",
1056
+ src: placeholderImage(350, 280),
1057
+ alt: PLACEHOLDER_ALT,
1058
+ width: "100%",
1059
+ align: "center",
1060
+ borderRadius: "8px"
1061
+ }
1062
+ ]
1063
+ },
1064
+ {
1065
+ id: "text-image-left-text-col",
1066
+ width: 55,
1067
+ verticalAlign: "middle",
1068
+ padding: { left: "24px" },
1069
+ blocks: [
1070
+ {
1071
+ id: "text-image-left-label",
1072
+ type: "text",
1073
+ content: `<p style="margin:0 0 8px 0;${TYPOGRAPHY.label}color:${PALETTE.primary};">THE SESSION</p>`,
1074
+ align: "left"
1075
+ },
1076
+ {
1077
+ id: "text-image-left-title",
1078
+ type: "text",
1079
+ content: `<h2 style="margin:0;${TYPOGRAPHY.h2}color:${PALETTE.textDark};">What to Expect</h2>`,
1080
+ align: "left"
1081
+ },
1082
+ {
1083
+ id: "text-image-left-body",
1084
+ type: "text",
1085
+ content: `<p style="margin:16px 0 0 0;${TYPOGRAPHY.body}color:${PALETTE.textBody};">${PLACEHOLDER.bodyText.intro}</p>`,
1086
+ align: "left"
1087
+ }
1088
+ ]
1089
+ }
1090
+ ]
1091
+ }
1092
+ };
1093
+ var sectionTitle1Template = {
1094
+ id: "section-title-1",
1095
+ name: "Section Title - Simple",
1096
+ category: "content",
1097
+ description: "Centered headline with body text",
1098
+ section: {
1099
+ id: "section-title-1-section",
1100
+ type: "section",
1101
+ backgroundColor: PALETTE.bgWhite,
1102
+ padding: { top: "40px", bottom: "40px", left: "40px", right: "40px" },
1103
+ columns: [
1104
+ {
1105
+ id: "section-title-1-col",
1106
+ blocks: [
1107
+ {
1108
+ id: "section-title-1-title",
1109
+ type: "text",
1110
+ content: `<h2 style="margin:0;${TYPOGRAPHY.h2}color:${PALETTE.textDark};">A second headline</h2>`,
1111
+ align: "left"
1112
+ },
1113
+ {
1114
+ id: "section-title-1-divider",
1115
+ type: "divider",
1116
+ borderColor: PALETTE.primary,
1117
+ borderWidth: "2px",
1118
+ borderStyle: "solid",
1119
+ padding: { top: "16px", bottom: "16px" },
1120
+ width: "60px"
1121
+ },
1122
+ {
1123
+ id: "section-title-1-body",
1124
+ type: "text",
1125
+ content: `<p style="margin:0;${TYPOGRAPHY.body}color:${PALETTE.textBody};">${PLACEHOLDER.bodyText.intro}</p>`,
1126
+ align: "left"
1127
+ }
1128
+ ]
1129
+ }
1130
+ ]
1131
+ }
1132
+ };
1133
+ var sectionTitle2Template = {
1134
+ id: "section-title-2",
1135
+ name: "Section Title - With Button",
1136
+ category: "content",
1137
+ description: "Headline with body text and CTA button",
1138
+ section: {
1139
+ id: "section-title-2-section",
1140
+ type: "section",
1141
+ backgroundColor: PALETTE.bgMuted,
1142
+ padding: { top: "40px", bottom: "40px", left: "40px", right: "40px" },
1143
+ columns: [
1144
+ {
1145
+ id: "section-title-2-col",
1146
+ blocks: [
1147
+ {
1148
+ id: "section-title-2-title",
1149
+ type: "text",
1150
+ content: `<h2 style="margin:0;${TYPOGRAPHY.h2}color:${PALETTE.textDark};">Ready to Begin?</h2>`,
1151
+ align: "left"
1152
+ },
1153
+ {
1154
+ id: "section-title-2-divider",
1155
+ type: "divider",
1156
+ borderColor: PALETTE.primary,
1157
+ borderWidth: "2px",
1158
+ borderStyle: "solid",
1159
+ padding: { top: "16px", bottom: "16px" },
1160
+ width: "60px"
1161
+ },
1162
+ {
1163
+ id: "section-title-2-body",
1164
+ type: "text",
1165
+ content: `<p style="margin:0 0 24px 0;${TYPOGRAPHY.body}color:${PALETTE.textBody};">${PLACEHOLDER.bodyText.destination}</p>`,
1166
+ align: "left"
1167
+ },
1168
+ {
1169
+ id: "section-title-2-button",
1170
+ type: "button",
1171
+ label: PLACEHOLDER.ctaBookSession,
1172
+ href: PLACEHOLDER.website,
1173
+ align: "left",
1174
+ backgroundColor: PALETTE.primary,
1175
+ color: PALETTE.textWhite,
1176
+ borderRadius: "30px",
1177
+ padding: { left: "28px", right: "28px", top: "12px", bottom: "12px" }
1178
+ }
1179
+ ]
1180
+ }
1181
+ ]
1182
+ }
1183
+ };
1184
+ var sectionTitle3Template = {
1185
+ id: "section-title-3",
1186
+ name: "Section Title - Colored",
1187
+ category: "content",
1188
+ description: "Headline with colored background strip",
1189
+ section: {
1190
+ id: "section-title-3-section",
1191
+ type: "section",
1192
+ backgroundColor: PALETTE.primary,
1193
+ padding: { top: "30px", bottom: "30px", left: "40px", right: "40px" },
1194
+ columns: [
1195
+ {
1196
+ id: "section-title-3-col",
1197
+ blocks: [
1198
+ {
1199
+ id: "section-title-3-title",
1200
+ type: "text",
1201
+ content: `<h2 style="margin:0;${TYPOGRAPHY.h2}color:${PALETTE.textWhite};">A third headline</h2>`,
1202
+ align: "center"
1203
+ },
1204
+ {
1205
+ id: "section-title-3-body",
1206
+ type: "text",
1207
+ content: `<p style="margin:12px 0 0 0;${TYPOGRAPHY.body}color:rgba(255,255,255,0.9);">${PLACEHOLDER.bodyText.destination}</p>`,
1208
+ align: "center"
1209
+ }
1210
+ ]
1211
+ }
1212
+ ]
1213
+ }
1214
+ };
1215
+ var quoteBlockTemplate = {
1216
+ id: "quote-block",
1217
+ name: "Quote Block",
1218
+ category: "content",
1219
+ description: "Centered quote with attribution",
1220
+ section: {
1221
+ id: "quote-block-section",
1222
+ type: "section",
1223
+ backgroundColor: PALETTE.bgLight,
1224
+ padding: { top: "50px", bottom: "50px", left: "60px", right: "60px" },
1225
+ columns: [
1226
+ {
1227
+ id: "quote-block-col",
1228
+ blocks: [
1229
+ {
1230
+ id: "quote-block-text",
1231
+ type: "text",
1232
+ content: `<p style="margin:0;${TYPOGRAPHY.h3}color:${PALETTE.textDark};">&ldquo;A short quotation goes here. Replace it with something a reader of yours would want to pass on.&rdquo;</p>`,
1233
+ align: "center"
1234
+ },
1235
+ {
1236
+ id: "quote-block-divider",
1237
+ type: "divider",
1238
+ borderColor: PALETTE.divider,
1239
+ borderWidth: "1px",
1240
+ borderStyle: "solid",
1241
+ padding: { top: "24px", bottom: "24px" },
1242
+ width: "80px"
1243
+ },
1244
+ {
1245
+ id: "quote-block-attribution",
1246
+ type: "text",
1247
+ content: `<p style="margin:0;${TYPOGRAPHY.bodySmall}color:${PALETTE.primary};">${PLACEHOLDER.ownerName}</p>`,
1248
+ align: "center"
1249
+ }
1250
+ ]
1251
+ }
1252
+ ]
1253
+ }
1254
+ };
1255
+ var dividerSectionTemplate = {
1256
+ id: "divider-section",
1257
+ name: "Divider",
1258
+ category: "content",
1259
+ description: "Simple decorative divider",
1260
+ section: {
1261
+ id: "divider-section-section",
1262
+ type: "section",
1263
+ backgroundColor: PALETTE.bgWhite,
1264
+ padding: { top: "20px", bottom: "20px" },
1265
+ columns: [
1266
+ {
1267
+ id: "divider-section-col",
1268
+ blocks: [
1269
+ {
1270
+ id: "divider-section-divider",
1271
+ type: "divider",
1272
+ borderColor: PALETTE.border,
1273
+ borderWidth: "1px",
1274
+ borderStyle: "solid"
1275
+ }
1276
+ ]
1277
+ }
1278
+ ]
1279
+ }
1280
+ };
1281
+ var spacerSectionTemplate = {
1282
+ id: "spacer-section",
1283
+ name: "Spacer",
1284
+ category: "content",
1285
+ description: "Empty space between sections",
1286
+ section: {
1287
+ id: "spacer-section-section",
1288
+ type: "section",
1289
+ backgroundColor: PALETTE.bgMuted,
1290
+ padding: { top: "0px", bottom: "0px" },
1291
+ columns: [
1292
+ {
1293
+ id: "spacer-section-col",
1294
+ blocks: [
1295
+ {
1296
+ id: "spacer-section-spacer",
1297
+ type: "spacer",
1298
+ height: "40px"
1299
+ }
1300
+ ]
1301
+ }
1302
+ ]
1303
+ }
1304
+ };
1305
+ var contentTemplates = [
1306
+ textImageRightTemplate,
1307
+ textImageLeftTemplate,
1308
+ sectionTitle1Template,
1309
+ sectionTitle2Template,
1310
+ sectionTitle3Template,
1311
+ quoteBlockTemplate,
1312
+ dividerSectionTemplate,
1313
+ spacerSectionTemplate
1314
+ ];
1315
+
1316
+ // src/prebuilt/feature-templates.ts
1317
+ var features2ColTemplate = {
1318
+ id: "features-2col",
1319
+ name: "Features - 2 Columns",
1320
+ category: "content",
1321
+ description: "Two feature boxes with icons side by side",
1322
+ section: {
1323
+ id: "features-2col-section",
1324
+ type: "section",
1325
+ backgroundColor: PALETTE.bgWhite,
1326
+ padding: { top: "50px", bottom: "50px" },
1327
+ noStack: true,
1328
+ columns: [
1329
+ {
1330
+ id: "features-2col-col-1",
1331
+ width: 50,
1332
+ padding: { left: "20px", right: "20px" },
1333
+ backgroundColor: PALETTE.bgLight,
1334
+ blocks: [
1335
+ {
1336
+ id: "features-2col-1-icon",
1337
+ type: "image",
1338
+ src: placeholderImage(60, 60),
1339
+ alt: PLACEHOLDER_ALT,
1340
+ width: "60px",
1341
+ align: "center"
1342
+ },
1343
+ {
1344
+ id: "features-2col-1-title",
1345
+ type: "text",
1346
+ content: `<h3 style="margin:16px 0 8px 0;${TYPOGRAPHY.h4}color:${PALETTE.textDark};">Feature one</h3>`,
1347
+ align: "center"
1348
+ },
1349
+ {
1350
+ id: "features-2col-1-body",
1351
+ type: "text",
1352
+ content: `<p style="margin:0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textBody};">A sentence or two about this feature. Replace it with your own.</p>`,
1353
+ align: "center"
1354
+ }
1355
+ ]
1356
+ },
1357
+ {
1358
+ id: "features-2col-col-2",
1359
+ width: 50,
1360
+ padding: { left: "20px", right: "20px" },
1361
+ backgroundColor: PALETTE.bgLight,
1362
+ blocks: [
1363
+ {
1364
+ id: "features-2col-2-icon",
1365
+ type: "image",
1366
+ src: placeholderImage(60, 60),
1367
+ alt: PLACEHOLDER_ALT,
1368
+ width: "60px",
1369
+ align: "center"
1370
+ },
1371
+ {
1372
+ id: "features-2col-2-title",
1373
+ type: "text",
1374
+ content: `<h3 style="margin:16px 0 8px 0;${TYPOGRAPHY.h4}color:${PALETTE.textDark};">Feature two</h3>`,
1375
+ align: "center"
1376
+ },
1377
+ {
1378
+ id: "features-2col-2-body",
1379
+ type: "text",
1380
+ content: `<p style="margin:0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textBody};">A sentence or two about this feature. Replace it with your own.</p>`,
1381
+ align: "center"
1382
+ }
1383
+ ]
1384
+ }
1385
+ ]
1386
+ }
1387
+ };
1388
+ var features3ColTemplate = {
1389
+ id: "features-3col",
1390
+ name: "Features - 3 Columns",
1391
+ category: "content",
1392
+ description: "Three feature boxes with icons",
1393
+ section: {
1394
+ id: "features-3col-section",
1395
+ type: "section",
1396
+ backgroundColor: PALETTE.bgMuted,
1397
+ padding: { top: "50px", bottom: "50px" },
1398
+ noStack: true,
1399
+ columns: [
1400
+ {
1401
+ id: "features-3col-col-1",
1402
+ width: 33,
1403
+ padding: { left: "16px", right: "16px" },
1404
+ blocks: [
1405
+ {
1406
+ id: "features-3col-1-icon",
1407
+ type: "image",
1408
+ src: placeholderImage(50, 50),
1409
+ alt: PLACEHOLDER_ALT,
1410
+ width: "50px",
1411
+ align: "center"
1412
+ },
1413
+ {
1414
+ id: "features-3col-1-title",
1415
+ type: "text",
1416
+ content: `<h3 style="margin:14px 0 6px 0;${TYPOGRAPHY.h4}color:${PALETTE.textDark};">Feature one</h3>`,
1417
+ align: "center"
1418
+ },
1419
+ {
1420
+ id: "features-3col-1-body",
1421
+ type: "text",
1422
+ content: `<p style="margin:0;${TYPOGRAPHY.caption}color:${PALETTE.textBody};">A short line about this feature. Replace it with your own.</p>`,
1423
+ align: "center"
1424
+ }
1425
+ ]
1426
+ },
1427
+ {
1428
+ id: "features-3col-col-2",
1429
+ width: 33,
1430
+ padding: { left: "16px", right: "16px" },
1431
+ blocks: [
1432
+ {
1433
+ id: "features-3col-2-icon",
1434
+ type: "image",
1435
+ src: placeholderImage(50, 50),
1436
+ alt: PLACEHOLDER_ALT,
1437
+ width: "50px",
1438
+ align: "center"
1439
+ },
1440
+ {
1441
+ id: "features-3col-2-title",
1442
+ type: "text",
1443
+ content: `<h3 style="margin:14px 0 6px 0;${TYPOGRAPHY.h4}color:${PALETTE.textDark};">Feature two</h3>`,
1444
+ align: "center"
1445
+ },
1446
+ {
1447
+ id: "features-3col-2-body",
1448
+ type: "text",
1449
+ content: `<p style="margin:0;${TYPOGRAPHY.caption}color:${PALETTE.textBody};">A short line about this feature. Replace it with your own.</p>`,
1450
+ align: "center"
1451
+ }
1452
+ ]
1453
+ },
1454
+ {
1455
+ id: "features-3col-col-3",
1456
+ width: 33,
1457
+ padding: { left: "16px", right: "16px" },
1458
+ blocks: [
1459
+ {
1460
+ id: "features-3col-3-icon",
1461
+ type: "image",
1462
+ src: placeholderImage(50, 50),
1463
+ alt: PLACEHOLDER_ALT,
1464
+ width: "50px",
1465
+ align: "center"
1466
+ },
1467
+ {
1468
+ id: "features-3col-3-title",
1469
+ type: "text",
1470
+ content: `<h3 style="margin:14px 0 6px 0;${TYPOGRAPHY.h4}color:${PALETTE.textDark};">Feature three</h3>`,
1471
+ align: "center"
1472
+ },
1473
+ {
1474
+ id: "features-3col-3-body",
1475
+ type: "text",
1476
+ content: `<p style="margin:0;${TYPOGRAPHY.caption}color:${PALETTE.textBody};">A short line about this feature. Replace it with your own.</p>`,
1477
+ align: "center"
1478
+ }
1479
+ ]
1480
+ }
1481
+ ]
1482
+ }
1483
+ };
1484
+ var features4ColTemplate = {
1485
+ id: "features-4col",
1486
+ name: "Features - 4 Grid",
1487
+ category: "content",
1488
+ description: "Four feature boxes in 2x2 grid",
1489
+ section: {
1490
+ id: "features-4col-section",
1491
+ type: "section",
1492
+ backgroundColor: PALETTE.bgWhite,
1493
+ padding: { top: "40px", bottom: "40px" },
1494
+ noStack: true,
1495
+ columns: [
1496
+ {
1497
+ id: "features-4col-col-1",
1498
+ width: 50,
1499
+ padding: { left: "20px", right: "20px", bottom: "30px" },
1500
+ blocks: [
1501
+ {
1502
+ id: "features-4col-1-icon",
1503
+ type: "image",
1504
+ src: placeholderImage(45, 45),
1505
+ alt: PLACEHOLDER_ALT,
1506
+ width: "45px",
1507
+ align: "center"
1508
+ },
1509
+ {
1510
+ id: "features-4col-1-title",
1511
+ type: "text",
1512
+ content: `<h3 style="margin:12px 0 6px 0;${TYPOGRAPHY.h4}color:${PALETTE.textDark};">Feature one</h3>`,
1513
+ align: "center"
1514
+ },
1515
+ {
1516
+ id: "features-4col-1-body",
1517
+ type: "text",
1518
+ content: `<p style="margin:0;${TYPOGRAPHY.caption}color:${PALETTE.textBody};">A short line about this feature. Replace it with your own.</p>`,
1519
+ align: "center"
1520
+ }
1521
+ ]
1522
+ },
1523
+ {
1524
+ id: "features-4col-col-2",
1525
+ width: 50,
1526
+ padding: { left: "20px", right: "20px", bottom: "30px" },
1527
+ blocks: [
1528
+ {
1529
+ id: "features-4col-2-icon",
1530
+ type: "image",
1531
+ src: placeholderImage(45, 45),
1532
+ alt: PLACEHOLDER_ALT,
1533
+ width: "45px",
1534
+ align: "center"
1535
+ },
1536
+ {
1537
+ id: "features-4col-2-title",
1538
+ type: "text",
1539
+ content: `<h3 style="margin:12px 0 6px 0;${TYPOGRAPHY.h4}color:${PALETTE.textDark};">Feature two</h3>`,
1540
+ align: "center"
1541
+ },
1542
+ {
1543
+ id: "features-4col-2-body",
1544
+ type: "text",
1545
+ content: `<p style="margin:0;${TYPOGRAPHY.caption}color:${PALETTE.textBody};">A short line about this feature. Replace it with your own.</p>`,
1546
+ align: "center"
1547
+ }
1548
+ ]
1549
+ }
1550
+ ]
1551
+ }
1552
+ };
1553
+ var features4ColRow2Template = {
1554
+ id: "features-4col-row2",
1555
+ name: "Features - 4 Grid (Row 2)",
1556
+ category: "content",
1557
+ description: "Second row of 4-column grid",
1558
+ section: {
1559
+ id: "features-4col-row2-section",
1560
+ type: "section",
1561
+ backgroundColor: PALETTE.bgWhite,
1562
+ padding: { top: "0px", bottom: "40px" },
1563
+ noStack: true,
1564
+ columns: [
1565
+ {
1566
+ id: "features-4col-row2-col-1",
1567
+ width: 50,
1568
+ padding: { left: "20px", right: "20px" },
1569
+ blocks: [
1570
+ {
1571
+ id: "features-4col-row2-1-icon",
1572
+ type: "image",
1573
+ src: placeholderImage(45, 45),
1574
+ alt: PLACEHOLDER_ALT,
1575
+ width: "45px",
1576
+ align: "center"
1577
+ },
1578
+ {
1579
+ id: "features-4col-row2-1-title",
1580
+ type: "text",
1581
+ content: `<h3 style="margin:12px 0 6px 0;${TYPOGRAPHY.h4}color:${PALETTE.textDark};">Feature three</h3>`,
1582
+ align: "center"
1583
+ },
1584
+ {
1585
+ id: "features-4col-row2-1-body",
1586
+ type: "text",
1587
+ content: `<p style="margin:0;${TYPOGRAPHY.caption}color:${PALETTE.textBody};">A short line about this feature. Replace it with your own.</p>`,
1588
+ align: "center"
1589
+ }
1590
+ ]
1591
+ },
1592
+ {
1593
+ id: "features-4col-row2-col-2",
1594
+ width: 50,
1595
+ padding: { left: "20px", right: "20px" },
1596
+ blocks: [
1597
+ {
1598
+ id: "features-4col-row2-2-icon",
1599
+ type: "image",
1600
+ src: placeholderImage(45, 45),
1601
+ alt: PLACEHOLDER_ALT,
1602
+ width: "45px",
1603
+ align: "center"
1604
+ },
1605
+ {
1606
+ id: "features-4col-row2-2-title",
1607
+ type: "text",
1608
+ content: `<h3 style="margin:12px 0 6px 0;${TYPOGRAPHY.h4}color:${PALETTE.textDark};">Feature four</h3>`,
1609
+ align: "center"
1610
+ },
1611
+ {
1612
+ id: "features-4col-row2-2-body",
1613
+ type: "text",
1614
+ content: `<p style="margin:0;${TYPOGRAPHY.caption}color:${PALETTE.textBody};">A short line about this feature. Replace it with your own.</p>`,
1615
+ align: "center"
1616
+ }
1617
+ ]
1618
+ }
1619
+ ]
1620
+ }
1621
+ };
1622
+ var takeActionTemplate = {
1623
+ id: "take-action",
1624
+ name: "Take Action / CTA",
1625
+ category: "content",
1626
+ description: "Call-to-action section with guidance label",
1627
+ section: {
1628
+ id: "take-action-section",
1629
+ type: "section",
1630
+ backgroundColor: PALETTE.bgWhite,
1631
+ padding: { top: "40px", bottom: "40px", left: "30px", right: "30px" },
1632
+ columns: [
1633
+ {
1634
+ id: "take-action-col",
1635
+ blocks: [
1636
+ {
1637
+ id: "take-action-label",
1638
+ type: "text",
1639
+ content: `<p style="margin:0 0 8px 0;${TYPOGRAPHY.label}color:${PALETTE.primary};">GUIDANCE</p>`,
1640
+ align: "left"
1641
+ },
1642
+ {
1643
+ id: "take-action-title",
1644
+ type: "text",
1645
+ content: `<h2 style="margin:0;${TYPOGRAPHY.h3}color:${PALETTE.textDark};">Your headline here</h2>`,
1646
+ align: "left"
1647
+ },
1648
+ {
1649
+ id: "take-action-body",
1650
+ type: "text",
1651
+ content: `<p style="margin:16px 0 24px 0;${TYPOGRAPHY.body}color:${PALETTE.textBody};">${PLACEHOLDER.bodyText.intro}</p>`,
1652
+ align: "left"
1653
+ },
1654
+ {
1655
+ id: "take-action-button",
1656
+ type: "button",
1657
+ label: PLACEHOLDER.ctaExplore,
1658
+ href: PLACEHOLDER.website,
1659
+ align: "left",
1660
+ backgroundColor: PALETTE.primaryDark,
1661
+ color: PALETTE.textWhite,
1662
+ borderRadius: "4px",
1663
+ padding: { left: "24px", right: "24px", top: "12px", bottom: "12px" }
1664
+ }
1665
+ ]
1666
+ }
1667
+ ]
1668
+ }
1669
+ };
1670
+ var featureTemplates = [
1671
+ features2ColTemplate,
1672
+ features3ColTemplate,
1673
+ features4ColTemplate,
1674
+ features4ColRow2Template,
1675
+ takeActionTemplate
1676
+ ];
1677
+
1678
+ // src/prebuilt/marketing-templates.ts
1679
+ var eventSimpleTemplate = {
1680
+ id: "event-simple",
1681
+ name: "Event - Simple",
1682
+ category: "content",
1683
+ description: "Event with date and time details",
1684
+ section: {
1685
+ id: "event-simple-section",
1686
+ type: "section",
1687
+ backgroundColor: PALETTE.bgWhite,
1688
+ padding: { top: "40px", bottom: "40px", left: "30px", right: "30px" },
1689
+ columns: [
1690
+ {
1691
+ id: "event-simple-col",
1692
+ blocks: [
1693
+ {
1694
+ id: "event-simple-label",
1695
+ type: "text",
1696
+ content: `<p style="margin:0 0 8px 0;${TYPOGRAPHY.label}color:${PALETTE.primary};">CATEGORY</p>`,
1697
+ align: "left"
1698
+ },
1699
+ {
1700
+ id: "event-simple-title",
1701
+ type: "text",
1702
+ content: `<h2 style="margin:0;${TYPOGRAPHY.h3}color:${PALETTE.textDark};">Your event name</h2>`,
1703
+ align: "left"
1704
+ },
1705
+ {
1706
+ id: "event-simple-desc",
1707
+ type: "text",
1708
+ content: `<p style="margin:16px 0;${TYPOGRAPHY.body}color:${PALETTE.textBody};">${PLACEHOLDER.bodyText.intro}</p>`,
1709
+ align: "left"
1710
+ },
1711
+ {
1712
+ id: "event-simple-date",
1713
+ type: "text",
1714
+ content: `<p style="margin:0 0 4px 0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textDark};"><strong>Date:</strong> Your date</p>`,
1715
+ align: "left"
1716
+ },
1717
+ {
1718
+ id: "event-simple-time",
1719
+ type: "text",
1720
+ content: `<p style="margin:0 0 20px 0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textDark};"><strong>Time:</strong> Your time</p>`,
1721
+ align: "left"
1722
+ },
1723
+ {
1724
+ id: "event-simple-button",
1725
+ type: "button",
1726
+ label: "Register Now",
1727
+ href: PLACEHOLDER.website,
1728
+ align: "left",
1729
+ backgroundColor: PALETTE.primary,
1730
+ color: PALETTE.textWhite,
1731
+ borderRadius: "4px",
1732
+ padding: { left: "24px", right: "24px", top: "12px", bottom: "12px" }
1733
+ }
1734
+ ]
1735
+ }
1736
+ ]
1737
+ }
1738
+ };
1739
+ var eventImageTemplate = {
1740
+ id: "event-image",
1741
+ name: "Event - With Image",
1742
+ category: "content",
1743
+ description: "Event card with image",
1744
+ section: {
1745
+ id: "event-image-section",
1746
+ type: "section",
1747
+ backgroundColor: PALETTE.bgMuted,
1748
+ padding: { top: "40px", bottom: "40px" },
1749
+ noStack: true,
1750
+ columns: [
1751
+ {
1752
+ id: "event-image-text-col",
1753
+ width: 55,
1754
+ padding: { left: "30px", right: "20px" },
1755
+ blocks: [
1756
+ {
1757
+ id: "event-image-label",
1758
+ type: "text",
1759
+ content: `<p style="margin:0 0 8px 0;${TYPOGRAPHY.label}color:${PALETTE.primary};">CATEGORY</p>`,
1760
+ align: "left"
1761
+ },
1762
+ {
1763
+ id: "event-image-title",
1764
+ type: "text",
1765
+ content: `<h2 style="margin:0;${TYPOGRAPHY.h3}color:${PALETTE.textDark};">Your second event name</h2>`,
1766
+ align: "left"
1767
+ },
1768
+ {
1769
+ id: "event-image-desc",
1770
+ type: "text",
1771
+ content: `<p style="margin:12px 0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textBody};">A short line about this event. Replace it with your own.</p>`,
1772
+ align: "left"
1773
+ },
1774
+ {
1775
+ id: "event-image-datetime",
1776
+ type: "text",
1777
+ content: `<p style="margin:0 0 16px 0;${TYPOGRAPHY.caption}color:${PALETTE.textLight};">Your date and time</p>`,
1778
+ align: "left"
1779
+ },
1780
+ {
1781
+ id: "event-image-button",
1782
+ type: "button",
1783
+ label: "Add to Calendar",
1784
+ href: PLACEHOLDER.website,
1785
+ align: "left",
1786
+ backgroundColor: PALETTE.primaryDark,
1787
+ color: PALETTE.textWhite,
1788
+ borderRadius: "4px",
1789
+ padding: { left: "20px", right: "20px", top: "10px", bottom: "10px" }
1790
+ }
1791
+ ]
1792
+ },
1793
+ {
1794
+ id: "event-image-image-col",
1795
+ width: 45,
1796
+ padding: { right: "30px" },
1797
+ blocks: [
1798
+ {
1799
+ id: "event-image-image",
1800
+ type: "image",
1801
+ src: placeholderImage(280, 220),
1802
+ alt: PLACEHOLDER_ALT,
1803
+ width: "100%",
1804
+ align: "center",
1805
+ borderRadius: "8px"
1806
+ }
1807
+ ]
1808
+ }
1809
+ ]
1810
+ }
1811
+ };
1812
+ var couponDiscountTemplate = {
1813
+ id: "coupon-discount",
1814
+ name: "Coupon - Discount",
1815
+ category: "content",
1816
+ description: "Discount offer with code box",
1817
+ section: {
1818
+ id: "coupon-discount-section",
1819
+ type: "section",
1820
+ backgroundColor: PALETTE.bgWhite,
1821
+ padding: { top: "40px", bottom: "40px" },
1822
+ noStack: true,
1823
+ columns: [
1824
+ {
1825
+ id: "coupon-discount-text-col",
1826
+ width: 60,
1827
+ padding: { left: "30px", right: "20px" },
1828
+ verticalAlign: "middle",
1829
+ blocks: [
1830
+ {
1831
+ id: "coupon-discount-label",
1832
+ type: "text",
1833
+ content: `<p style="margin:0 0 6px 0;${TYPOGRAPHY.label}color:${PALETTE.primary};">SPECIAL OFFER</p>`,
1834
+ align: "left"
1835
+ },
1836
+ {
1837
+ id: "coupon-discount-title",
1838
+ type: "text",
1839
+ content: `<h2 style="margin:0;${TYPOGRAPHY.h3}color:${PALETTE.textDark};">Your offer</h2>`,
1840
+ align: "left"
1841
+ },
1842
+ {
1843
+ id: "coupon-discount-desc",
1844
+ type: "text",
1845
+ content: `<p style="margin:12px 0 0 0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textBody};">A short line about this offer. Replace it with your own.</p>`,
1846
+ align: "left"
1847
+ }
1848
+ ]
1849
+ },
1850
+ {
1851
+ id: "coupon-discount-code-col",
1852
+ width: 40,
1853
+ padding: { right: "30px" },
1854
+ verticalAlign: "middle",
1855
+ blocks: [
1856
+ {
1857
+ id: "coupon-discount-amount",
1858
+ type: "text",
1859
+ content: `<p style="margin:0;font-family:Georgia,'Times New Roman',serif;font-size:48px;font-weight:600;color:${PALETTE.primary};">FREE</p>`,
1860
+ align: "center"
1861
+ },
1862
+ {
1863
+ id: "coupon-discount-codelabel",
1864
+ type: "text",
1865
+ content: `<p style="margin:8px 0 4px 0;${TYPOGRAPHY.caption}color:${PALETTE.textLight};">USE CODE:</p>`,
1866
+ align: "center"
1867
+ },
1868
+ {
1869
+ id: "coupon-discount-code",
1870
+ type: "text",
1871
+ content: `<p style="margin:0;padding:8px 16px;background:${PALETTE.bgMuted};border:2px dashed ${PALETTE.primary};border-radius:4px;${TYPOGRAPHY.label}color:${PALETTE.primary};display:inline-block;">YOUR-CODE</p>`,
1872
+ align: "center"
1873
+ }
1874
+ ]
1875
+ }
1876
+ ]
1877
+ }
1878
+ };
1879
+ var couponGiftCardTemplate = {
1880
+ id: "coupon-giftcard",
1881
+ name: "Coupon - Gift Card",
1882
+ category: "content",
1883
+ description: "Gift card style layout",
1884
+ section: {
1885
+ id: "coupon-giftcard-section",
1886
+ type: "section",
1887
+ backgroundColor: PALETTE.bgMuted,
1888
+ padding: { top: "50px", bottom: "50px", left: "40px", right: "40px" },
1889
+ columns: [
1890
+ {
1891
+ id: "coupon-giftcard-col",
1892
+ blocks: [
1893
+ {
1894
+ id: "coupon-giftcard-title",
1895
+ type: "text",
1896
+ content: `<h1 style="margin:0;font-family:Georgia,'Times New Roman',serif;font-style:italic;font-size:42px;font-weight:600;color:${PALETTE.primary};">Your gift certificate</h1>`,
1897
+ align: "center"
1898
+ },
1899
+ {
1900
+ id: "coupon-giftcard-divider",
1901
+ type: "divider",
1902
+ borderColor: PALETTE.textDark,
1903
+ borderWidth: "1px",
1904
+ borderStyle: "solid",
1905
+ padding: { top: "20px", bottom: "20px" },
1906
+ width: "120px"
1907
+ },
1908
+ {
1909
+ id: "coupon-giftcard-codelabel",
1910
+ type: "text",
1911
+ content: `<p style="margin:0 0 8px 0;${TYPOGRAPHY.label}color:${PALETTE.textLight};">CERTIFICATE CODE:</p>`,
1912
+ align: "center"
1913
+ },
1914
+ {
1915
+ id: "coupon-giftcard-code",
1916
+ type: "text",
1917
+ content: `<p style="margin:0;font-family:Georgia,'Times New Roman',serif;font-size:28px;font-weight:600;color:${PALETTE.primary};letter-spacing:4px;">YOUR-CODE</p>`,
1918
+ align: "center"
1919
+ }
1920
+ ]
1921
+ }
1922
+ ]
1923
+ }
1924
+ };
1925
+ var couponBannerTemplate = {
1926
+ id: "coupon-banner",
1927
+ name: "Coupon - Banner",
1928
+ category: "content",
1929
+ description: "Simple banner with promotional code",
1930
+ section: {
1931
+ id: "coupon-banner-section",
1932
+ type: "section",
1933
+ backgroundColor: PALETTE.primary,
1934
+ padding: { top: "20px", bottom: "20px" },
1935
+ columns: [
1936
+ {
1937
+ id: "coupon-banner-col",
1938
+ blocks: [
1939
+ {
1940
+ id: "coupon-banner-code",
1941
+ type: "text",
1942
+ content: `<p style="margin:0;${TYPOGRAPHY.label}color:${PALETTE.textWhite};letter-spacing:6px;font-size:18px;">YOUR-CODE</p>`,
1943
+ align: "center"
1944
+ }
1945
+ ]
1946
+ }
1947
+ ]
1948
+ }
1949
+ };
1950
+ var productRightTemplate = {
1951
+ id: "product-right",
1952
+ name: "Service - Image Right",
1953
+ category: "products",
1954
+ description: "Service offering with image on right",
1955
+ section: {
1956
+ id: "product-right-section",
1957
+ type: "section",
1958
+ backgroundColor: PALETTE.bgWhite,
1959
+ padding: { top: "40px", bottom: "40px" },
1960
+ noStack: true,
1961
+ columns: [
1962
+ {
1963
+ id: "product-right-text-col",
1964
+ width: 55,
1965
+ padding: { left: "30px", right: "20px" },
1966
+ verticalAlign: "middle",
1967
+ blocks: [
1968
+ {
1969
+ id: "product-right-label",
1970
+ type: "text",
1971
+ content: `<p style="margin:0 0 8px 0;${TYPOGRAPHY.label}color:${PALETTE.primary};">CATEGORY</p>`,
1972
+ align: "left"
1973
+ },
1974
+ {
1975
+ id: "product-right-title",
1976
+ type: "text",
1977
+ content: `<h2 style="margin:0;${TYPOGRAPHY.h3}color:${PALETTE.textDark};">Your product name</h2>`,
1978
+ align: "left"
1979
+ },
1980
+ {
1981
+ id: "product-right-desc",
1982
+ type: "text",
1983
+ content: `<p style="margin:12px 0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textBody};">A short line about this product. Replace it with your own.</p>`,
1984
+ align: "left"
1985
+ },
1986
+ {
1987
+ id: "product-right-price",
1988
+ type: "text",
1989
+ content: `<p style="margin:0 0 16px 0;font-family:Georgia,'Times New Roman',serif;font-size:24px;font-weight:600;color:${PALETTE.primary};">$99</p>`,
1990
+ align: "left"
1991
+ },
1992
+ {
1993
+ id: "product-right-button",
1994
+ type: "button",
1995
+ label: "Book Now",
1996
+ href: PLACEHOLDER.website,
1997
+ align: "left",
1998
+ backgroundColor: PALETTE.primaryDark,
1999
+ color: PALETTE.textWhite,
2000
+ borderRadius: "4px",
2001
+ padding: { left: "24px", right: "24px", top: "10px", bottom: "10px" }
2002
+ }
2003
+ ]
2004
+ },
2005
+ {
2006
+ id: "product-right-image-col",
2007
+ width: 45,
2008
+ padding: { right: "30px" },
2009
+ blocks: [
2010
+ {
2011
+ id: "product-right-image",
2012
+ type: "image",
2013
+ src: placeholderImage(300, 300),
2014
+ alt: PLACEHOLDER_ALT,
2015
+ width: "100%",
2016
+ align: "center",
2017
+ borderRadius: "8px"
2018
+ }
2019
+ ]
2020
+ }
2021
+ ]
2022
+ }
2023
+ };
2024
+ var productLeftTemplate = {
2025
+ id: "product-left",
2026
+ name: "Service - Image Left",
2027
+ category: "products",
2028
+ description: "Service offering with image on left",
2029
+ section: {
2030
+ id: "product-left-section",
2031
+ type: "section",
2032
+ backgroundColor: PALETTE.bgMuted,
2033
+ padding: { top: "40px", bottom: "40px" },
2034
+ noStack: true,
2035
+ columns: [
2036
+ {
2037
+ id: "product-left-image-col",
2038
+ width: 45,
2039
+ padding: { left: "30px" },
2040
+ blocks: [
2041
+ {
2042
+ id: "product-left-image",
2043
+ type: "image",
2044
+ src: placeholderImage(300, 300),
2045
+ alt: PLACEHOLDER_ALT,
2046
+ width: "100%",
2047
+ align: "center",
2048
+ borderRadius: "8px"
2049
+ }
2050
+ ]
2051
+ },
2052
+ {
2053
+ id: "product-left-text-col",
2054
+ width: 55,
2055
+ padding: { left: "20px", right: "30px" },
2056
+ verticalAlign: "middle",
2057
+ blocks: [
2058
+ {
2059
+ id: "product-left-label",
2060
+ type: "text",
2061
+ content: `<p style="margin:0 0 8px 0;${TYPOGRAPHY.label}color:${PALETTE.primary};">PACKAGE</p>`,
2062
+ align: "left"
2063
+ },
2064
+ {
2065
+ id: "product-left-title",
2066
+ type: "text",
2067
+ content: `<h2 style="margin:0;${TYPOGRAPHY.h3}color:${PALETTE.textDark};">Your bundle name</h2>`,
2068
+ align: "left"
2069
+ },
2070
+ {
2071
+ id: "product-left-desc",
2072
+ type: "text",
2073
+ content: `<p style="margin:12px 0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textBody};">A short line about this bundle. Replace it with your own.</p>`,
2074
+ align: "left"
2075
+ },
2076
+ {
2077
+ id: "product-left-price",
2078
+ type: "text",
2079
+ content: `<p style="margin:0;"><span style="${TYPOGRAPHY.caption}color:${PALETTE.textLight};text-decoration:line-through;">$297</span> <span style="font-family:Georgia,'Times New Roman',serif;font-size:24px;font-weight:600;color:${PALETTE.primary};">$249</span></p>`,
2080
+ align: "left"
2081
+ },
2082
+ {
2083
+ id: "product-left-save",
2084
+ type: "text",
2085
+ content: `<p style="margin:4px 0 16px 0;${TYPOGRAPHY.caption}color:${PALETTE.primary};">You save $48</p>`,
2086
+ align: "left"
2087
+ },
2088
+ {
2089
+ id: "product-left-button",
2090
+ type: "button",
2091
+ label: "Learn More",
2092
+ href: PLACEHOLDER.website,
2093
+ align: "left",
2094
+ backgroundColor: PALETTE.primary,
2095
+ color: PALETTE.textWhite,
2096
+ borderRadius: "4px",
2097
+ padding: { left: "24px", right: "24px", top: "10px", bottom: "10px" }
2098
+ }
2099
+ ]
2100
+ }
2101
+ ]
2102
+ }
2103
+ };
2104
+ var products2ColTemplate = {
2105
+ id: "products-2col",
2106
+ name: "Services - 2 Columns",
2107
+ category: "products",
2108
+ description: "Two service offerings side by side",
2109
+ section: {
2110
+ id: "products-2col-section",
2111
+ type: "section",
2112
+ backgroundColor: PALETTE.bgWhite,
2113
+ padding: { top: "40px", bottom: "40px" },
2114
+ noStack: true,
2115
+ columns: [
2116
+ {
2117
+ id: "products-2col-col-1",
2118
+ width: 50,
2119
+ padding: { left: "20px", right: "15px" },
2120
+ blocks: [
2121
+ {
2122
+ id: "products-2col-1-image",
2123
+ type: "image",
2124
+ src: placeholderImage(260, 200),
2125
+ alt: PLACEHOLDER_ALT,
2126
+ width: "100%",
2127
+ align: "center",
2128
+ borderRadius: "6px"
2129
+ },
2130
+ {
2131
+ id: "products-2col-1-title",
2132
+ type: "text",
2133
+ content: `<h3 style="margin:16px 0 8px 0;${TYPOGRAPHY.h4}color:${PALETTE.textDark};">Your first product</h3>`,
2134
+ align: "left"
2135
+ },
2136
+ {
2137
+ id: "products-2col-1-price",
2138
+ type: "text",
2139
+ content: `<p style="margin:0 0 12px 0;font-family:Georgia,'Times New Roman',serif;font-size:20px;font-weight:600;color:${PALETTE.primary};">$99</p>`,
2140
+ align: "left"
2141
+ },
2142
+ {
2143
+ id: "products-2col-1-button",
2144
+ type: "button",
2145
+ label: "Book Now",
2146
+ href: PLACEHOLDER.website,
2147
+ align: "left",
2148
+ backgroundColor: PALETTE.primaryDark,
2149
+ color: PALETTE.textWhite,
2150
+ borderRadius: "4px",
2151
+ padding: { left: "20px", right: "20px", top: "8px", bottom: "8px" }
2152
+ }
2153
+ ]
2154
+ },
2155
+ {
2156
+ id: "products-2col-col-2",
2157
+ width: 50,
2158
+ padding: { left: "15px", right: "20px" },
2159
+ blocks: [
2160
+ {
2161
+ id: "products-2col-2-image",
2162
+ type: "image",
2163
+ src: placeholderImage(260, 200),
2164
+ alt: PLACEHOLDER_ALT,
2165
+ width: "100%",
2166
+ align: "center",
2167
+ borderRadius: "6px"
2168
+ },
2169
+ {
2170
+ id: "products-2col-2-title",
2171
+ type: "text",
2172
+ content: `<h3 style="margin:16px 0 8px 0;${TYPOGRAPHY.h4}color:${PALETTE.textDark};">Your second product</h3>`,
2173
+ align: "left"
2174
+ },
2175
+ {
2176
+ id: "products-2col-2-price",
2177
+ type: "text",
2178
+ content: `<p style="margin:0 0 12px 0;font-family:Georgia,'Times New Roman',serif;font-size:20px;font-weight:600;color:${PALETTE.primary};">$149</p>`,
2179
+ align: "left"
2180
+ },
2181
+ {
2182
+ id: "products-2col-2-button",
2183
+ type: "button",
2184
+ label: "Book Now",
2185
+ href: PLACEHOLDER.website,
2186
+ align: "left",
2187
+ backgroundColor: PALETTE.primaryDark,
2188
+ color: PALETTE.textWhite,
2189
+ borderRadius: "4px",
2190
+ padding: { left: "20px", right: "20px", top: "8px", bottom: "8px" }
2191
+ }
2192
+ ]
2193
+ }
2194
+ ]
2195
+ }
2196
+ };
2197
+ var products3ColTemplate = {
2198
+ id: "products-3col",
2199
+ name: "Services - 3 Columns",
2200
+ category: "products",
2201
+ description: "Three service offerings in a row",
2202
+ section: {
2203
+ id: "products-3col-section",
2204
+ type: "section",
2205
+ backgroundColor: PALETTE.bgMuted,
2206
+ padding: { top: "40px", bottom: "40px" },
2207
+ noStack: true,
2208
+ columns: [
2209
+ {
2210
+ id: "products-3col-col-1",
2211
+ width: 33,
2212
+ padding: { left: "15px", right: "10px" },
2213
+ blocks: [
2214
+ {
2215
+ id: "products-3col-1-image",
2216
+ type: "image",
2217
+ src: placeholderImage(180, 140),
2218
+ alt: PLACEHOLDER_ALT,
2219
+ width: "100%",
2220
+ align: "center",
2221
+ borderRadius: "4px"
2222
+ },
2223
+ {
2224
+ id: "products-3col-1-title",
2225
+ type: "text",
2226
+ content: `<h4 style="margin:12px 0 4px 0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textDark};font-weight:600;">Your first tier</h4>`,
2227
+ align: "center"
2228
+ },
2229
+ {
2230
+ id: "products-3col-1-price",
2231
+ type: "text",
2232
+ content: `<p style="margin:0 0 10px 0;font-family:Georgia,'Times New Roman',serif;font-size:18px;color:${PALETTE.primary};">Free</p>`,
2233
+ align: "center"
2234
+ },
2235
+ {
2236
+ id: "products-3col-1-button",
2237
+ type: "button",
2238
+ label: "Schedule",
2239
+ href: PLACEHOLDER.website,
2240
+ align: "center",
2241
+ backgroundColor: PALETTE.primary,
2242
+ color: PALETTE.textWhite,
2243
+ borderRadius: "4px",
2244
+ padding: { left: "16px", right: "16px", top: "6px", bottom: "6px" }
2245
+ }
2246
+ ]
2247
+ },
2248
+ {
2249
+ id: "products-3col-col-2",
2250
+ width: 33,
2251
+ padding: { left: "10px", right: "10px" },
2252
+ blocks: [
2253
+ {
2254
+ id: "products-3col-2-image",
2255
+ type: "image",
2256
+ src: placeholderImage(180, 140),
2257
+ alt: PLACEHOLDER_ALT,
2258
+ width: "100%",
2259
+ align: "center",
2260
+ borderRadius: "4px"
2261
+ },
2262
+ {
2263
+ id: "products-3col-2-title",
2264
+ type: "text",
2265
+ content: `<h4 style="margin:12px 0 4px 0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textDark};font-weight:600;">Your second tier</h4>`,
2266
+ align: "center"
2267
+ },
2268
+ {
2269
+ id: "products-3col-2-price",
2270
+ type: "text",
2271
+ content: `<p style="margin:0 0 10px 0;font-family:Georgia,'Times New Roman',serif;font-size:18px;color:${PALETTE.primary};">$99</p>`,
2272
+ align: "center"
2273
+ },
2274
+ {
2275
+ id: "products-3col-2-button",
2276
+ type: "button",
2277
+ label: "Book",
2278
+ href: PLACEHOLDER.website,
2279
+ align: "center",
2280
+ backgroundColor: PALETTE.primary,
2281
+ color: PALETTE.textWhite,
2282
+ borderRadius: "4px",
2283
+ padding: { left: "16px", right: "16px", top: "6px", bottom: "6px" }
2284
+ }
2285
+ ]
2286
+ },
2287
+ {
2288
+ id: "products-3col-col-3",
2289
+ width: 33,
2290
+ padding: { left: "10px", right: "15px" },
2291
+ blocks: [
2292
+ {
2293
+ id: "products-3col-3-image",
2294
+ type: "image",
2295
+ src: placeholderImage(180, 140),
2296
+ alt: PLACEHOLDER_ALT,
2297
+ width: "100%",
2298
+ align: "center",
2299
+ borderRadius: "4px"
2300
+ },
2301
+ {
2302
+ id: "products-3col-3-title",
2303
+ type: "text",
2304
+ content: `<h4 style="margin:12px 0 4px 0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textDark};font-weight:600;">Your third tier</h4>`,
2305
+ align: "center"
2306
+ },
2307
+ {
2308
+ id: "products-3col-3-price",
2309
+ type: "text",
2310
+ content: `<p style="margin:0 0 10px 0;font-family:Georgia,'Times New Roman',serif;font-size:18px;color:${PALETTE.primary};">$249</p>`,
2311
+ align: "center"
2312
+ },
2313
+ {
2314
+ id: "products-3col-3-button",
2315
+ type: "button",
2316
+ label: "Book",
2317
+ href: PLACEHOLDER.website,
2318
+ align: "center",
2319
+ backgroundColor: PALETTE.primary,
2320
+ color: PALETTE.textWhite,
2321
+ borderRadius: "4px",
2322
+ padding: { left: "16px", right: "16px", top: "6px", bottom: "6px" }
2323
+ }
2324
+ ]
2325
+ }
2326
+ ]
2327
+ }
2328
+ };
2329
+ var marketingTemplates = [
2330
+ eventSimpleTemplate,
2331
+ eventImageTemplate,
2332
+ couponDiscountTemplate,
2333
+ couponGiftCardTemplate,
2334
+ couponBannerTemplate,
2335
+ productRightTemplate,
2336
+ productLeftTemplate,
2337
+ products2ColTemplate,
2338
+ products3ColTemplate
2339
+ ];
2340
+
2341
+ // src/prebuilt/utility-templates.ts
2342
+ var signature1Template = {
2343
+ id: "signature-1",
2344
+ name: "Signature - Simple",
2345
+ category: "footer",
2346
+ description: "Simple name and title signature",
2347
+ section: {
2348
+ id: "signature-1-section",
2349
+ type: "section",
2350
+ backgroundColor: PALETTE.bgWhite,
2351
+ padding: { top: "30px", bottom: "30px", left: "30px", right: "30px" },
2352
+ columns: [
2353
+ {
2354
+ id: "signature-1-col",
2355
+ blocks: [
2356
+ {
2357
+ id: "signature-1-name",
2358
+ type: "text",
2359
+ content: `<p style="margin:0;${TYPOGRAPHY.h4}color:${PALETTE.textDark};font-weight:600;">${PLACEHOLDER.ownerName}</p>`,
2360
+ align: "left"
2361
+ },
2362
+ {
2363
+ id: "signature-1-title",
2364
+ type: "text",
2365
+ content: `<p style="margin:4px 0 0 0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textBody};">${PLACEHOLDER.ownerTitle}</p>`,
2366
+ align: "left"
2367
+ }
2368
+ ]
2369
+ }
2370
+ ]
2371
+ }
2372
+ };
2373
+ var signature2Template = {
2374
+ id: "signature-2",
2375
+ name: "Signature - Centered",
2376
+ category: "footer",
2377
+ description: "Centered name with cursive signature style",
2378
+ section: {
2379
+ id: "signature-2-section",
2380
+ type: "section",
2381
+ backgroundColor: PALETTE.bgMuted,
2382
+ padding: { top: "40px", bottom: "40px" },
2383
+ columns: [
2384
+ {
2385
+ id: "signature-2-col",
2386
+ blocks: [
2387
+ {
2388
+ id: "signature-2-name",
2389
+ type: "text",
2390
+ content: `<p style="margin:0;${TYPOGRAPHY.h4}color:${PALETTE.textDark};font-weight:600;">${PLACEHOLDER.ownerName}</p>`,
2391
+ align: "center"
2392
+ },
2393
+ {
2394
+ id: "signature-2-title",
2395
+ type: "text",
2396
+ content: `<p style="margin:4px 0 16px 0;${TYPOGRAPHY.caption}color:${PALETTE.textLight};">${PLACEHOLDER.ownerTitle}</p>`,
2397
+ align: "center"
2398
+ },
2399
+ {
2400
+ id: "signature-2-cursive",
2401
+ type: "text",
2402
+ content: `<p style="margin:0;${TYPOGRAPHY.signature}color:${PALETTE.primary};">${PLACEHOLDER.ownerName}</p>`,
2403
+ align: "center"
2404
+ }
2405
+ ]
2406
+ }
2407
+ ]
2408
+ }
2409
+ };
2410
+ var signature3Template = {
2411
+ id: "signature-3",
2412
+ name: "Signature - With Contact",
2413
+ category: "footer",
2414
+ description: "Name with email and phone contact",
2415
+ section: {
2416
+ id: "signature-3-section",
2417
+ type: "section",
2418
+ backgroundColor: PALETTE.bgWhite,
2419
+ padding: { top: "30px", bottom: "30px", left: "30px", right: "30px" },
2420
+ columns: [
2421
+ {
2422
+ id: "signature-3-col",
2423
+ blocks: [
2424
+ {
2425
+ id: "signature-3-name",
2426
+ type: "text",
2427
+ content: `<p style="margin:0;${TYPOGRAPHY.h4}color:${PALETTE.textDark};font-weight:600;">${PLACEHOLDER.ownerName}</p>`,
2428
+ align: "center"
2429
+ },
2430
+ {
2431
+ id: "signature-3-title",
2432
+ type: "text",
2433
+ content: `<p style="margin:4px 0 12px 0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textBody};">${PLACEHOLDER.ownerTitle}</p>`,
2434
+ align: "center"
2435
+ },
2436
+ {
2437
+ id: "signature-3-contact",
2438
+ type: "text",
2439
+ content: `<p style="margin:0;${TYPOGRAPHY.caption}color:${PALETTE.textLight};">\u2709 ${PLACEHOLDER.ownerContact}</p>`,
2440
+ align: "center"
2441
+ }
2442
+ ]
2443
+ }
2444
+ ]
2445
+ }
2446
+ };
2447
+ var signature4Template = {
2448
+ id: "signature-4",
2449
+ name: "Signature - Full",
2450
+ category: "footer",
2451
+ description: "Full signature with closing message",
2452
+ section: {
2453
+ id: "signature-4-section",
2454
+ type: "section",
2455
+ backgroundColor: PALETTE.bgWhite,
2456
+ padding: { top: "40px", bottom: "40px", left: "40px", right: "40px" },
2457
+ columns: [
2458
+ {
2459
+ id: "signature-4-col",
2460
+ blocks: [
2461
+ {
2462
+ id: "signature-4-closing",
2463
+ type: "text",
2464
+ content: `<p style="margin:0 0 16px 0;${TYPOGRAPHY.body}color:${PALETTE.textBody};">${PLACEHOLDER.closing.gratitude}</p>`,
2465
+ align: "center"
2466
+ },
2467
+ {
2468
+ id: "signature-4-name",
2469
+ type: "text",
2470
+ content: `<p style="margin:0;${TYPOGRAPHY.h3}color:${PALETTE.primary};">${PLACEHOLDER.ownerName}</p>`,
2471
+ align: "center"
2472
+ },
2473
+ {
2474
+ id: "signature-4-title",
2475
+ type: "text",
2476
+ content: `<p style="margin:8px 0 0 0;font-family:Georgia,'Times New Roman',serif;font-style:italic;font-size:16px;color:${PALETTE.textBody};">${PLACEHOLDER.ownerTitle}</p>`,
2477
+ align: "center"
2478
+ }
2479
+ ]
2480
+ }
2481
+ ]
2482
+ }
2483
+ };
2484
+ var buttonsDualTemplate = {
2485
+ id: "buttons-dual",
2486
+ name: "Buttons - Dual CTA",
2487
+ category: "content",
2488
+ description: "Two side-by-side call-to-action buttons",
2489
+ section: {
2490
+ id: "buttons-dual-section",
2491
+ type: "section",
2492
+ backgroundColor: PALETTE.bgWhite,
2493
+ padding: { top: "30px", bottom: "30px" },
2494
+ noStack: true,
2495
+ columns: [
2496
+ {
2497
+ id: "buttons-dual-col-1",
2498
+ width: 50,
2499
+ padding: { left: "30px", right: "10px" },
2500
+ blocks: [
2501
+ {
2502
+ id: "buttons-dual-primary",
2503
+ type: "button",
2504
+ label: PLACEHOLDER.ctaBookSession,
2505
+ href: PLACEHOLDER.website,
2506
+ align: "right",
2507
+ backgroundColor: PALETTE.primary,
2508
+ color: PALETTE.textWhite,
2509
+ borderRadius: "30px",
2510
+ padding: { left: "28px", right: "28px", top: "14px", bottom: "14px" }
2511
+ }
2512
+ ]
2513
+ },
2514
+ {
2515
+ id: "buttons-dual-col-2",
2516
+ width: 50,
2517
+ padding: { left: "10px", right: "30px" },
2518
+ blocks: [
2519
+ {
2520
+ id: "buttons-dual-secondary",
2521
+ type: "button",
2522
+ label: PLACEHOLDER.ctaLearnMore,
2523
+ href: PLACEHOLDER.website,
2524
+ align: "left",
2525
+ backgroundColor: PALETTE.bgWhite,
2526
+ color: PALETTE.primary,
2527
+ borderRadius: "30px",
2528
+ border: `2px solid ${PALETTE.primary}`,
2529
+ padding: { left: "28px", right: "28px", top: "12px", bottom: "12px" }
2530
+ }
2531
+ ]
2532
+ }
2533
+ ]
2534
+ }
2535
+ };
2536
+ var appDownloadTemplate = {
2537
+ id: "app-download",
2538
+ name: "App Download",
2539
+ category: "content",
2540
+ description: "App store download badges",
2541
+ section: {
2542
+ id: "app-download-section",
2543
+ type: "section",
2544
+ backgroundColor: PALETTE.bgMuted,
2545
+ padding: { top: "40px", bottom: "40px" },
2546
+ columns: [
2547
+ {
2548
+ id: "app-download-col",
2549
+ blocks: [
2550
+ {
2551
+ id: "app-download-title",
2552
+ type: "text",
2553
+ content: `<p style="margin:0 0 20px 0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textBody};">Download our app:</p>`,
2554
+ align: "center"
2555
+ },
2556
+ {
2557
+ id: "app-download-badges",
2558
+ type: "image",
2559
+ src: placeholderImage(300, 44),
2560
+ alt: PLACEHOLDER_ALT,
2561
+ width: "300px",
2562
+ align: "center",
2563
+ href: PLACEHOLDER.website
2564
+ }
2565
+ ]
2566
+ }
2567
+ ]
2568
+ }
2569
+ };
2570
+ var footerStandardTemplate = {
2571
+ id: "footer-standard",
2572
+ name: "Footer - Standard",
2573
+ category: "footer",
2574
+ description: "Standard newsletter footer with unsubscribe",
2575
+ section: {
2576
+ id: "footer-standard-section",
2577
+ type: "section",
2578
+ backgroundColor: PALETTE.bgWhite,
2579
+ padding: { top: "40px", bottom: "40px", left: "40px", right: "40px" },
2580
+ columns: [
2581
+ {
2582
+ id: "footer-standard-col",
2583
+ blocks: [
2584
+ {
2585
+ id: "footer-standard-divider",
2586
+ type: "divider",
2587
+ borderColor: PALETTE.border,
2588
+ borderWidth: "1px",
2589
+ borderStyle: "solid",
2590
+ padding: { top: "0px", bottom: "24px" }
2591
+ },
2592
+ {
2593
+ id: "footer-standard-received",
2594
+ type: "text",
2595
+ content: `<p style="margin:0 0 16px 0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textBody};">${PLACEHOLDER.footer.received}</p>`,
2596
+ align: "center"
2597
+ },
2598
+ {
2599
+ id: "footer-standard-unsubscribe",
2600
+ type: "text",
2601
+ content: `<p style="margin:0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textBody};">${PLACEHOLDER.footer.unsubscribe}<br><a href="{{unsubscribe_url}}" style="color:${PALETTE.primary};text-decoration:underline;">${PLACEHOLDER.footer.unsubscribeLink}</a>.</p>`,
2602
+ align: "center"
2603
+ }
2604
+ ]
2605
+ }
2606
+ ]
2607
+ }
2608
+ };
2609
+ var footerSocialTemplate = {
2610
+ id: "footer-social",
2611
+ name: "Footer - With Social",
2612
+ category: "footer",
2613
+ description: "Footer with social media icons",
2614
+ section: {
2615
+ id: "footer-social-section",
2616
+ type: "section",
2617
+ backgroundColor: PALETTE.bgMuted,
2618
+ padding: { top: "40px", bottom: "40px" },
2619
+ columns: [
2620
+ {
2621
+ id: "footer-social-col",
2622
+ blocks: [
2623
+ {
2624
+ id: "footer-social-icons",
2625
+ type: "social",
2626
+ mode: "horizontal",
2627
+ iconSize: "28px",
2628
+ iconPadding: "8px",
2629
+ links: [
2630
+ { platform: "facebook", url: "https://facebook.com" },
2631
+ { platform: "instagram", url: "https://instagram.com" },
2632
+ { platform: "youtube", url: "https://youtube.com" }
2633
+ ]
2634
+ },
2635
+ {
2636
+ id: "footer-social-divider",
2637
+ type: "divider",
2638
+ borderColor: PALETTE.border,
2639
+ borderWidth: "1px",
2640
+ borderStyle: "solid",
2641
+ padding: { top: "24px", bottom: "24px" }
2642
+ },
2643
+ {
2644
+ id: "footer-social-company",
2645
+ type: "text",
2646
+ content: `<p style="margin:0;${TYPOGRAPHY.caption}color:${PALETTE.textLight};">${PLACEHOLDER.companyName}</p>`,
2647
+ align: "center"
2648
+ },
2649
+ {
2650
+ id: "footer-social-copyright",
2651
+ type: "text",
2652
+ content: `<p style="margin:8px 0 0 0;${TYPOGRAPHY.caption}color:${PALETTE.textLight};">\xA9 ${(/* @__PURE__ */ new Date()).getFullYear()} All rights reserved.</p>`,
2653
+ align: "center"
2654
+ }
2655
+ ]
2656
+ }
2657
+ ]
2658
+ }
2659
+ };
2660
+ var footerLinksTemplate = {
2661
+ id: "footer-links",
2662
+ name: "Footer - With Links",
2663
+ category: "footer",
2664
+ description: "Footer with navigation and contact info",
2665
+ section: {
2666
+ id: "footer-links-section",
2667
+ type: "section",
2668
+ backgroundColor: PALETTE.primaryDark,
2669
+ padding: { top: "40px", bottom: "40px" },
2670
+ noStack: true,
2671
+ columns: [
2672
+ {
2673
+ id: "footer-links-col-1",
2674
+ width: 50,
2675
+ padding: { left: "30px", right: "20px" },
2676
+ blocks: [
2677
+ {
2678
+ id: "footer-links-phone",
2679
+ type: "text",
2680
+ content: `<p style="margin:0;${TYPOGRAPHY.caption}color:rgba(255,255,255,0.8);">Contact</p>`,
2681
+ align: "left"
2682
+ },
2683
+ {
2684
+ id: "footer-links-email",
2685
+ type: "text",
2686
+ content: `<p style="margin:8px 0 0 0;${TYPOGRAPHY.bodySmall}color:${PALETTE.textWhite};">${PLACEHOLDER.ownerContact}</p>`,
2687
+ align: "left"
2688
+ }
2689
+ ]
2690
+ },
2691
+ {
2692
+ id: "footer-links-col-2",
2693
+ width: 50,
2694
+ padding: { left: "20px", right: "30px" },
2695
+ blocks: [
2696
+ {
2697
+ id: "footer-links-copyright",
2698
+ type: "text",
2699
+ content: `<p style="margin:0;${TYPOGRAPHY.caption}color:rgba(255,255,255,0.6);">\xA9 ${(/* @__PURE__ */ new Date()).getFullYear()} ${PLACEHOLDER.companyName}</p>`,
2700
+ align: "right"
2701
+ },
2702
+ {
2703
+ id: "footer-links-legal",
2704
+ type: "text",
2705
+ content: `<p style="margin:8px 0 0 0;${TYPOGRAPHY.caption}color:rgba(255,255,255,0.8);"><a href="${PLACEHOLDER.website}" style="color:rgba(255,255,255,0.8);">Privacy</a> | <a href="{{unsubscribe_url}}" style="color:rgba(255,255,255,0.8);">Unsubscribe</a></p>`,
2706
+ align: "right"
2707
+ }
2708
+ ]
2709
+ }
2710
+ ]
2711
+ }
2712
+ };
2713
+ var utilityTemplates = [
2714
+ signature1Template,
2715
+ signature2Template,
2716
+ signature3Template,
2717
+ signature4Template,
2718
+ buttonsDualTemplate,
2719
+ appDownloadTemplate,
2720
+ footerStandardTemplate,
2721
+ footerSocialTemplate,
2722
+ footerLinksTemplate
2723
+ ];
2724
+
2725
+ // src/prebuilt/index.ts
2726
+ var allPrebuiltTemplates = [
2727
+ ...heroTemplates,
2728
+ ...contentTemplates,
2729
+ ...featureTemplates,
2730
+ ...marketingTemplates,
2731
+ ...utilityTemplates
2732
+ ];
2733
+ function getTemplatesByCategory(category) {
2734
+ return allPrebuiltTemplates.filter((t) => t.category === category);
2735
+ }
2736
+ var templateCategories = [
2737
+ { id: "hero", name: "Hero Sections", count: heroTemplates.length },
2738
+ { id: "content", name: "Content Blocks", count: contentTemplates.length + featureTemplates.length },
2739
+ { id: "products", name: "Services & Products", count: marketingTemplates.filter((t) => t.category === "products").length },
2740
+ { id: "footer", name: "Signatures & Footers", count: utilityTemplates.length }
2741
+ ];
2742
+ function createStandardPrebuiltRegistry(options = {}) {
2743
+ const registry = (0, import_email_editor_core15.createPrebuiltTemplateRegistry)();
2744
+ allPrebuiltTemplates.forEach((template) => {
2745
+ registry.register(withHostedPlaceholders(template, options.placeholderBase));
2746
+ });
2747
+ return registry;
2748
+ }
2749
+ // Annotate the CommonJS export names for ESM import in node:
2750
+ 0 && (module.exports = {
2751
+ PALETTE,
2752
+ PLACEHOLDER,
2753
+ PLACEHOLDER_ALT,
2754
+ SOCIAL_COLORS,
2755
+ TYPOGRAPHY,
2756
+ accordionBlockDefinition,
2757
+ allPrebuiltTemplates,
2758
+ appDownloadTemplate,
2759
+ buttonBlockDefinition,
2760
+ buttonsDualTemplate,
2761
+ carouselBlockDefinition,
2762
+ contentTemplates,
2763
+ couponBannerTemplate,
2764
+ couponDiscountTemplate,
2765
+ couponGiftCardTemplate,
2766
+ createPrebuiltRegistry,
2767
+ createStandardBlockRegistry,
2768
+ createStandardPrebuiltRegistry,
2769
+ dividerBlockDefinition,
2770
+ dividerSectionTemplate,
2771
+ eventImageTemplate,
2772
+ eventSimpleTemplate,
2773
+ featureTemplates,
2774
+ features2ColTemplate,
2775
+ features3ColTemplate,
2776
+ features4ColRow2Template,
2777
+ features4ColTemplate,
2778
+ footerBlockDefinition,
2779
+ footerLinksTemplate,
2780
+ footerSocialTemplate,
2781
+ footerStandardTemplate,
2782
+ getTemplatesByCategory,
2783
+ headerBlockDefinition,
2784
+ heroBlockDefinition,
2785
+ heroMainTemplate,
2786
+ heroMinimalTemplate,
2787
+ heroNewsletterTemplate,
2788
+ heroSplitTemplate,
2789
+ heroTemplates,
2790
+ hostedPlaceholder,
2791
+ imageBlockDefinition,
2792
+ marketingTemplates,
2793
+ navbarBlockDefinition,
2794
+ placeholderImage,
2795
+ placeholderSize,
2796
+ productLeftTemplate,
2797
+ productRightTemplate,
2798
+ products2ColTemplate,
2799
+ products3ColTemplate,
2800
+ quoteBlockTemplate,
2801
+ rawBlockDefinition,
2802
+ sectionTitle1Template,
2803
+ sectionTitle2Template,
2804
+ sectionTitle3Template,
2805
+ signature1Template,
2806
+ signature2Template,
2807
+ signature3Template,
2808
+ signature4Template,
2809
+ socialBlockDefinition,
2810
+ spacerBlockDefinition,
2811
+ spacerSectionTemplate,
2812
+ styledBody,
2813
+ styledHeading,
2814
+ styledLabel,
2815
+ tableBlockDefinition,
2816
+ takeActionTemplate,
2817
+ templateCategories,
2818
+ textBlockDefinition,
2819
+ textImageLeftTemplate,
2820
+ textImageRightTemplate,
2821
+ utilityTemplates,
2822
+ withHostedPlaceholders
2823
+ });