@templatical/import-beefree 0.0.1

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.cjs ADDED
@@ -0,0 +1,568 @@
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
+ convertBeeFreeTemplate: () => convertBeeFreeTemplate
24
+ });
25
+ module.exports = __toCommonJS(index_exports);
26
+
27
+ // src/converter.ts
28
+ var import_types2 = require("@templatical/types");
29
+
30
+ // src/block-mapper.ts
31
+ var import_types = require("@templatical/types");
32
+
33
+ // src/style-parser.ts
34
+ function parsePxValue(value) {
35
+ if (!value) return 0;
36
+ const match = value.match(/^(-?\d+(?:\.\d+)?)\s*px/);
37
+ return match ? Math.round(parseFloat(match[1])) : 0;
38
+ }
39
+ function parseColor(value) {
40
+ if (!value || value === "transparent") return "";
41
+ const trimmed = value.trim();
42
+ if (/^#[0-9a-fA-F]{6}$/.test(trimmed)) return trimmed.toLowerCase();
43
+ if (/^#[0-9a-fA-F]{3}$/.test(trimmed)) {
44
+ const r = trimmed[1];
45
+ const g = trimmed[2];
46
+ const b = trimmed[3];
47
+ return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();
48
+ }
49
+ return trimmed;
50
+ }
51
+ function parseBorderTop(value) {
52
+ if (!value) return { width: 0, style: "solid", color: "#000000" };
53
+ const parts = value.trim().split(/\s+/);
54
+ return {
55
+ width: parsePxValue(parts[0]),
56
+ style: parts[1] || "solid",
57
+ color: parseColor(parts[2]) || "#000000"
58
+ };
59
+ }
60
+ function extractPadding(style) {
61
+ if (!style) return { top: 0, right: 0, bottom: 0, left: 0 };
62
+ if (style.padding) {
63
+ return parseShorthandPadding(style.padding);
64
+ }
65
+ return {
66
+ top: parsePxValue(style["padding-top"]),
67
+ right: parsePxValue(style["padding-right"]),
68
+ bottom: parsePxValue(style["padding-bottom"]),
69
+ left: parsePxValue(style["padding-left"])
70
+ };
71
+ }
72
+ function parseShorthandPadding(value) {
73
+ const parts = value.trim().split(/\s+/);
74
+ const values = parts.map((p) => parsePxValue(p));
75
+ switch (values.length) {
76
+ case 1:
77
+ return {
78
+ top: values[0],
79
+ right: values[0],
80
+ bottom: values[0],
81
+ left: values[0]
82
+ };
83
+ case 2:
84
+ return {
85
+ top: values[0],
86
+ right: values[1],
87
+ bottom: values[0],
88
+ left: values[1]
89
+ };
90
+ case 3:
91
+ return {
92
+ top: values[0],
93
+ right: values[1],
94
+ bottom: values[2],
95
+ left: values[1]
96
+ };
97
+ default:
98
+ return {
99
+ top: values[0],
100
+ right: values[1],
101
+ bottom: values[2],
102
+ left: values[3]
103
+ };
104
+ }
105
+ }
106
+ function parseWidthPercent(value) {
107
+ if (!value) return 100;
108
+ const match = value.match(/^(\d+(?:\.\d+)?)\s*%/);
109
+ if (match) return Math.round(parseFloat(match[1]));
110
+ return 100;
111
+ }
112
+ function parseFontFamily(value) {
113
+ if (!value) return "";
114
+ return value.split(",")[0].trim().replace(/['"]/g, "");
115
+ }
116
+
117
+ // src/block-mapper.ts
118
+ var MODULE_TYPE_MAP = {
119
+ "mailup-bee-newsletter-modules-text": "text",
120
+ "mailup-bee-newsletter-modules-paragraph": "text",
121
+ "mailup-bee-newsletter-modules-heading": "heading",
122
+ "mailup-bee-newsletter-modules-list": "list",
123
+ "mailup-bee-newsletter-modules-image": "image",
124
+ "mailup-bee-newsletter-modules-button": "button",
125
+ "mailup-bee-newsletter-modules-divider": "divider",
126
+ "mailup-bee-newsletter-modules-spacer": "spacer",
127
+ "mailup-bee-newsletter-modules-html": "html",
128
+ "mailup-bee-newsletter-modules-social": "social",
129
+ "mailup-bee-newsletter-modules-video": "video",
130
+ "mailup-bee-newsletter-modules-menu": "menu",
131
+ "mailup-bee-newsletter-modules-table": "table"
132
+ };
133
+ var SOCIAL_PLATFORM_MAP = {
134
+ facebook: "facebook",
135
+ twitter: "twitter",
136
+ x: "twitter",
137
+ instagram: "instagram",
138
+ linkedin: "linkedin",
139
+ youtube: "youtube",
140
+ tiktok: "tiktok",
141
+ pinterest: "pinterest",
142
+ email: "email",
143
+ whatsapp: "whatsapp",
144
+ telegram: "telegram",
145
+ discord: "discord",
146
+ snapchat: "snapchat",
147
+ reddit: "reddit",
148
+ github: "github",
149
+ dribbble: "dribbble",
150
+ behance: "behance"
151
+ };
152
+ function toAlign(value, fallback = "left") {
153
+ if (value === "left" || value === "center" || value === "right") return value;
154
+ return fallback;
155
+ }
156
+ function toFontWeight(value, fallback = "normal") {
157
+ if (value === "bold") return "bold";
158
+ return fallback;
159
+ }
160
+ function toLineStyle(value, fallback = "solid") {
161
+ if (value === "solid" || value === "dashed" || value === "dotted")
162
+ return value;
163
+ return fallback;
164
+ }
165
+ function defaultMargin() {
166
+ return { top: 0, right: 0, bottom: 0, left: 0 };
167
+ }
168
+ function makeStyles(descriptor) {
169
+ const padding = extractPadding(descriptor.style);
170
+ const bg = parseColor(descriptor.style?.["background-color"]);
171
+ return {
172
+ padding,
173
+ margin: defaultMargin(),
174
+ ...bg ? { backgroundColor: bg } : {}
175
+ };
176
+ }
177
+ function convertText(descriptor) {
178
+ const textContent = descriptor.text ?? descriptor.paragraph ?? descriptor.list;
179
+ const html = textContent?.html ?? "";
180
+ const style = textContent?.style ?? {};
181
+ return (0, import_types.createTextBlock)({
182
+ content: html,
183
+ fontSize: parsePxValue(style["font-size"]) || 16,
184
+ color: parseColor(style.color) || "#1a1a1a",
185
+ textAlign: toAlign(style["text-align"]),
186
+ fontWeight: toFontWeight(style["font-weight"]),
187
+ fontFamily: parseFontFamily(style["font-family"]) || void 0,
188
+ styles: makeStyles(descriptor)
189
+ });
190
+ }
191
+ function convertHeading(descriptor) {
192
+ const heading = descriptor.heading;
193
+ if (!heading) return convertText(descriptor);
194
+ const style = heading.style ?? {};
195
+ const tag = heading.title ?? "h2";
196
+ const text = heading.text ?? "";
197
+ const content = text.startsWith("<") ? text : `<${tag}>${text}</${tag}>`;
198
+ return (0, import_types.createTextBlock)({
199
+ content,
200
+ fontSize: parsePxValue(style["font-size"]) || 24,
201
+ color: parseColor(style.color) || "#1a1a1a",
202
+ textAlign: toAlign(style["text-align"]),
203
+ fontWeight: toFontWeight(style["font-weight"], "bold"),
204
+ fontFamily: parseFontFamily(style["font-family"]) || void 0,
205
+ styles: makeStyles(descriptor)
206
+ });
207
+ }
208
+ function convertImage(descriptor) {
209
+ const image = descriptor.image;
210
+ if (!image) {
211
+ return (0, import_types.createImageBlock)({ styles: makeStyles(descriptor) });
212
+ }
213
+ return (0, import_types.createImageBlock)({
214
+ src: image.src || "",
215
+ alt: image.alt || "",
216
+ width: parsePxValue(image.width) || 600,
217
+ align: toAlign(image.style?.["text-align"], "center"),
218
+ linkUrl: image.href || void 0,
219
+ styles: makeStyles(descriptor)
220
+ });
221
+ }
222
+ function convertButton(descriptor) {
223
+ const button = descriptor.button;
224
+ if (!button) {
225
+ return (0, import_types.createButtonBlock)({ styles: makeStyles(descriptor) });
226
+ }
227
+ const style = button.style ?? {};
228
+ const label = button.label?.replace(/<[^>]*>/g, "") ?? "Button";
229
+ return (0, import_types.createButtonBlock)({
230
+ text: label,
231
+ url: button.href || "#",
232
+ backgroundColor: parseColor(style["background-color"]) || "#4f46e5",
233
+ textColor: parseColor(style.color) || "#ffffff",
234
+ borderRadius: parsePxValue(style["border-radius"]),
235
+ fontSize: parsePxValue(style["font-size"]) || 16,
236
+ fontFamily: parseFontFamily(style["font-family"]) || void 0,
237
+ buttonPadding: {
238
+ top: parsePxValue(style["padding-top"]) || 12,
239
+ right: parsePxValue(style["padding-right"]) || 24,
240
+ bottom: parsePxValue(style["padding-bottom"]) || 12,
241
+ left: parsePxValue(style["padding-left"]) || 24
242
+ },
243
+ styles: makeStyles(descriptor)
244
+ });
245
+ }
246
+ function convertDivider(descriptor) {
247
+ const divider = descriptor.divider;
248
+ const style = divider?.style ?? {};
249
+ const border = parseBorderTop(style["border-top"]);
250
+ return (0, import_types.createDividerBlock)({
251
+ lineStyle: toLineStyle(border.style),
252
+ color: border.color,
253
+ thickness: border.width || 1,
254
+ width: parseWidthPercent(style.width),
255
+ styles: makeStyles(descriptor)
256
+ });
257
+ }
258
+ function convertSpacer(descriptor) {
259
+ const spacer = descriptor.spacer;
260
+ const height = parsePxValue(spacer?.style?.height) || 24;
261
+ return (0, import_types.createSpacerBlock)({
262
+ height,
263
+ styles: makeStyles(descriptor)
264
+ });
265
+ }
266
+ function convertHtml(descriptor) {
267
+ const html = descriptor.html?.html ?? "";
268
+ return (0, import_types.createHtmlBlock)({
269
+ content: html,
270
+ styles: makeStyles(descriptor)
271
+ });
272
+ }
273
+ function convertSocial(descriptor, warnings) {
274
+ const iconsList = descriptor.iconsList;
275
+ if (!iconsList?.icons) {
276
+ return (0, import_types.createSocialIconsBlock)({ styles: makeStyles(descriptor) });
277
+ }
278
+ const icons = [];
279
+ for (const beeIcon of iconsList.icons) {
280
+ const id = (beeIcon.id ?? beeIcon.name ?? "").toLowerCase();
281
+ const platform = SOCIAL_PLATFORM_MAP[id];
282
+ if (!platform) {
283
+ warnings.push(
284
+ `Unrecognized social icon "${beeIcon.name || id}" was skipped.`
285
+ );
286
+ continue;
287
+ }
288
+ icons.push({
289
+ id: (0, import_types.generateId)(),
290
+ platform,
291
+ url: beeIcon.image?.href || "#"
292
+ });
293
+ }
294
+ return (0, import_types.createSocialIconsBlock)({
295
+ icons,
296
+ styles: makeStyles(descriptor)
297
+ });
298
+ }
299
+ function convertVideo(descriptor) {
300
+ const video = descriptor.video;
301
+ if (!video) {
302
+ return (0, import_types.createVideoBlock)({ styles: makeStyles(descriptor) });
303
+ }
304
+ return (0, import_types.createVideoBlock)({
305
+ url: video.src || "",
306
+ thumbnailUrl: video.thumbnail || "",
307
+ alt: video.alt || "",
308
+ width: parsePxValue(video.style?.width) || 600,
309
+ align: toAlign(video.style?.["text-align"], "center"),
310
+ styles: makeStyles(descriptor)
311
+ });
312
+ }
313
+ function convertMenu(descriptor) {
314
+ const menu = descriptor.menu;
315
+ if (!menu) {
316
+ return (0, import_types.createMenuBlock)({ styles: makeStyles(descriptor) });
317
+ }
318
+ const style = menu.style ?? {};
319
+ const items = (menu.items ?? []).map((item) => ({
320
+ id: (0, import_types.generateId)(),
321
+ text: item.text || "",
322
+ url: item.link || item.href || "#",
323
+ openInNewTab: item.target === "_blank",
324
+ bold: false,
325
+ underline: false
326
+ }));
327
+ return (0, import_types.createMenuBlock)({
328
+ items,
329
+ separator: menu.separator || "|",
330
+ separatorColor: parseColor(menu.separatorColor) || "#999999",
331
+ fontSize: parsePxValue(style["font-size"]) || 14,
332
+ color: parseColor(style.color) || "#1a1a1a",
333
+ fontFamily: parseFontFamily(style["font-family"]) || void 0,
334
+ textAlign: toAlign(style["text-align"], "center"),
335
+ styles: makeStyles(descriptor)
336
+ });
337
+ }
338
+ function convertTable(descriptor) {
339
+ const table = descriptor.table;
340
+ if (!table) {
341
+ return (0, import_types.createTableBlock)({ styles: makeStyles(descriptor) });
342
+ }
343
+ const style = table.style ?? {};
344
+ const rows = (table.rows ?? []).map((row) => ({
345
+ id: (0, import_types.generateId)(),
346
+ cells: (row.cells ?? []).map(
347
+ (cell) => ({
348
+ id: (0, import_types.generateId)(),
349
+ content: cell.content ?? cell.html ?? ""
350
+ })
351
+ )
352
+ }));
353
+ return (0, import_types.createTableBlock)({
354
+ rows,
355
+ hasHeaderRow: table.hasHeaderRow ?? false,
356
+ headerBackgroundColor: parseColor(table.headerBackgroundColor) || void 0,
357
+ borderColor: parseColor(style["border-color"]) || "#dddddd",
358
+ borderWidth: parsePxValue(style["border-width"]) || 1,
359
+ cellPadding: typeof table.cellPadding === "number" ? table.cellPadding : parsePxValue(table.cellPadding) || 8,
360
+ fontSize: parsePxValue(style["font-size"]) || 14,
361
+ color: parseColor(style.color) || "#1a1a1a",
362
+ textAlign: toAlign(style["text-align"]),
363
+ styles: makeStyles(descriptor)
364
+ });
365
+ }
366
+ function convertHtmlFallback(module2) {
367
+ const descriptor = module2.descriptor;
368
+ let html = "";
369
+ if (descriptor.text?.html) html = descriptor.text.html;
370
+ else if (descriptor.html?.html) html = descriptor.html.html;
371
+ else if (descriptor.heading?.text) html = descriptor.heading.text;
372
+ else html = `<!-- Unsupported BeeFree module: ${module2.type} -->`;
373
+ return (0, import_types.createHtmlBlock)({
374
+ content: html,
375
+ styles: makeStyles(descriptor)
376
+ });
377
+ }
378
+ function convertModule(module2, warnings) {
379
+ const mappedType = MODULE_TYPE_MAP[module2.type];
380
+ const descriptor = module2.descriptor;
381
+ if (!mappedType) {
382
+ return {
383
+ block: convertHtmlFallback(module2),
384
+ entry: {
385
+ beeFreeModuleType: module2.type,
386
+ templaticalBlockType: "html",
387
+ status: "html-fallback",
388
+ note: `Unknown module type "${module2.type}" converted to HTML block.`
389
+ }
390
+ };
391
+ }
392
+ let block;
393
+ let isApproximation = false;
394
+ switch (mappedType) {
395
+ case "text":
396
+ case "list":
397
+ block = convertText(descriptor);
398
+ break;
399
+ case "heading":
400
+ block = convertHeading(descriptor);
401
+ break;
402
+ case "image":
403
+ block = convertImage(descriptor);
404
+ break;
405
+ case "button":
406
+ block = convertButton(descriptor);
407
+ break;
408
+ case "divider":
409
+ block = convertDivider(descriptor);
410
+ break;
411
+ case "spacer":
412
+ block = convertSpacer(descriptor);
413
+ break;
414
+ case "html":
415
+ block = convertHtml(descriptor);
416
+ break;
417
+ case "social":
418
+ block = convertSocial(descriptor, warnings);
419
+ break;
420
+ case "video":
421
+ block = convertVideo(descriptor);
422
+ break;
423
+ case "menu":
424
+ block = convertMenu(descriptor);
425
+ isApproximation = true;
426
+ break;
427
+ case "table":
428
+ block = convertTable(descriptor);
429
+ break;
430
+ default:
431
+ block = convertHtmlFallback(module2);
432
+ return {
433
+ block,
434
+ entry: {
435
+ beeFreeModuleType: module2.type,
436
+ templaticalBlockType: "html",
437
+ status: "html-fallback"
438
+ }
439
+ };
440
+ }
441
+ return {
442
+ block,
443
+ entry: {
444
+ beeFreeModuleType: module2.type,
445
+ templaticalBlockType: block.type,
446
+ status: isApproximation ? "approximated" : "converted"
447
+ }
448
+ };
449
+ }
450
+
451
+ // src/converter.ts
452
+ function resolveColumnLayout(columns, warnings) {
453
+ if (columns.length === 1) return null;
454
+ if (columns.length === 3) return "3";
455
+ if (columns.length === 2) {
456
+ const left = columns[0]["grid-columns"] ?? 6;
457
+ const right = columns[1]["grid-columns"] ?? 6;
458
+ const total = left + right;
459
+ const ratio = left / total;
460
+ if (ratio > 0.58) return "2-1";
461
+ if (ratio < 0.42) return "1-2";
462
+ return "2";
463
+ }
464
+ if (columns.length >= 4) {
465
+ warnings.push(
466
+ `Row with ${columns.length} columns was flattened to a single column. BeeFree supports arbitrary columns, but Templatical supports up to 3.`
467
+ );
468
+ return null;
469
+ }
470
+ return "2";
471
+ }
472
+ function convertColumnModules(column, entries, warnings) {
473
+ const blocks = [];
474
+ for (const module2 of column.modules) {
475
+ const { block, entry } = convertModule(module2, warnings);
476
+ blocks.push(block);
477
+ entries.push(entry);
478
+ }
479
+ return blocks;
480
+ }
481
+ function processRow(row, entries, warnings) {
482
+ const columns = row.columns;
483
+ if (!columns || columns.length === 0) return [];
484
+ if (row.locked) {
485
+ warnings.push(
486
+ "A locked row was imported. Lock metadata was dropped; content is preserved."
487
+ );
488
+ }
489
+ if (row.synced) {
490
+ warnings.push(
491
+ "A synced row was imported. Sync metadata was dropped; content is preserved."
492
+ );
493
+ }
494
+ const layout = resolveColumnLayout(columns, warnings);
495
+ if (!layout) {
496
+ const blocks = [];
497
+ for (const column of columns) {
498
+ blocks.push(...convertColumnModules(column, entries, warnings));
499
+ }
500
+ return blocks;
501
+ }
502
+ const children = columns.map(
503
+ (col) => convertColumnModules(col, entries, warnings)
504
+ );
505
+ const rowBg = parseColor(row.content?.style?.["background-color"]);
506
+ const section = (0, import_types2.createSectionBlock)({
507
+ columns: layout,
508
+ children,
509
+ styles: {
510
+ padding: { top: 0, right: 0, bottom: 0, left: 0 },
511
+ margin: { top: 0, right: 0, bottom: 0, left: 0 },
512
+ ...rowBg ? { backgroundColor: rowBg } : {}
513
+ }
514
+ });
515
+ return [section];
516
+ }
517
+ function extractSettings(template) {
518
+ const body = template.page.body;
519
+ const contentStyle = body?.content?.style ?? {};
520
+ const containerStyle = body?.container?.style ?? {};
521
+ const width = parsePxValue(contentStyle["width"] ?? contentStyle.width);
522
+ const bgColor = parseColor(contentStyle["background-color"]) || parseColor(containerStyle["background-color"]) || "#ffffff";
523
+ const fontFamily = parseFontFamily(contentStyle["font-family"]) || "Arial";
524
+ return {
525
+ width: width || 600,
526
+ backgroundColor: bgColor,
527
+ fontFamily
528
+ };
529
+ }
530
+ function convertBeeFreeTemplate(template) {
531
+ if (!template?.page?.rows) {
532
+ throw new Error(
533
+ "Invalid BeeFree template: missing page.rows. Ensure you are passing a valid BeeFree JSON export."
534
+ );
535
+ }
536
+ const entries = [];
537
+ const warnings = [];
538
+ const blocks = [];
539
+ const webFonts = template.page.body?.webFonts;
540
+ if (webFonts && webFonts.length > 1) {
541
+ warnings.push(
542
+ `Template uses ${webFonts.length} web fonts. Only the primary font is preserved; additional fonts may need to be configured via the fonts option.`
543
+ );
544
+ }
545
+ for (const row of template.page.rows) {
546
+ if (row.empty) continue;
547
+ blocks.push(...processRow(row, entries, warnings));
548
+ }
549
+ const content = {
550
+ ...(0, import_types2.createDefaultTemplateContent)(),
551
+ blocks,
552
+ settings: extractSettings(template)
553
+ };
554
+ const summary = {
555
+ total: entries.length,
556
+ converted: entries.filter((e) => e.status === "converted").length,
557
+ approximated: entries.filter((e) => e.status === "approximated").length,
558
+ htmlFallback: entries.filter((e) => e.status === "html-fallback").length,
559
+ skipped: entries.filter((e) => e.status === "skipped").length
560
+ };
561
+ const report = { entries, warnings, summary };
562
+ return { content, report };
563
+ }
564
+ // Annotate the CommonJS export names for ESM import in node:
565
+ 0 && (module.exports = {
566
+ convertBeeFreeTemplate
567
+ });
568
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/converter.ts","../src/block-mapper.ts","../src/style-parser.ts"],"sourcesContent":["export { convertBeeFreeTemplate } from \"./converter\";\nexport type {\n BeeFreeTemplate,\n ImportResult,\n ImportReport,\n ImportReportEntry,\n ConversionStatus,\n} from \"./types\";\n","import {\n createSectionBlock,\n createDefaultTemplateContent,\n} from \"@templatical/types\";\nimport type { Block, ColumnLayout, TemplateContent } from \"@templatical/types\";\nimport type {\n BeeFreeTemplate,\n BeeFreeeRow,\n BeeFreeeColumn,\n ImportResult,\n ImportReport,\n ImportReportEntry,\n} from \"./types\";\nimport { convertModule } from \"./block-mapper\";\nimport { parsePxValue, parseColor, parseFontFamily } from \"./style-parser\";\n\n/**\n * Determines the Templatical ColumnLayout from BeeFree column grid values.\n */\nfunction resolveColumnLayout(\n columns: BeeFreeeColumn[],\n warnings: string[],\n): ColumnLayout | null {\n if (columns.length === 1) return null; // Single column — no section wrapper needed\n if (columns.length === 3) return \"3\";\n\n if (columns.length === 2) {\n const left = columns[0][\"grid-columns\"] ?? 6;\n const right = columns[1][\"grid-columns\"] ?? 6;\n const total = left + right;\n const ratio = left / total;\n\n if (ratio > 0.58) return \"2-1\";\n if (ratio < 0.42) return \"1-2\";\n return \"2\";\n }\n\n if (columns.length >= 4) {\n warnings.push(\n `Row with ${columns.length} columns was flattened to a single column. BeeFree supports arbitrary columns, but Templatical supports up to 3.`,\n );\n return null; // Flatten to single column\n }\n\n return \"2\";\n}\n\n/**\n * Converts all modules in a column to Templatical blocks.\n */\nfunction convertColumnModules(\n column: BeeFreeeColumn,\n entries: ImportReportEntry[],\n warnings: string[],\n): Block[] {\n const blocks: Block[] = [];\n\n for (const module of column.modules) {\n const { block, entry } = convertModule(module, warnings);\n blocks.push(block);\n entries.push(entry);\n }\n\n return blocks;\n}\n\n/**\n * Processes a single BeeFree row into one or more Templatical blocks.\n */\nfunction processRow(\n row: BeeFreeeRow,\n entries: ImportReportEntry[],\n warnings: string[],\n): Block[] {\n const columns = row.columns;\n if (!columns || columns.length === 0) return [];\n\n // Track locked/synced metadata\n if (row.locked) {\n warnings.push(\n \"A locked row was imported. Lock metadata was dropped; content is preserved.\",\n );\n }\n if (row.synced) {\n warnings.push(\n \"A synced row was imported. Sync metadata was dropped; content is preserved.\",\n );\n }\n\n const layout = resolveColumnLayout(columns, warnings);\n\n if (!layout) {\n // Single column (or flattened 4+ columns) — return modules directly\n const blocks: Block[] = [];\n for (const column of columns) {\n blocks.push(...convertColumnModules(column, entries, warnings));\n }\n return blocks;\n }\n\n // Multi-column — wrap in a SectionBlock\n const children: Block[][] = columns.map((col) =>\n convertColumnModules(col, entries, warnings),\n );\n\n // Extract section-level background from row content styles\n const rowBg = parseColor(row.content?.style?.[\"background-color\"]);\n\n const section = createSectionBlock({\n columns: layout,\n children,\n styles: {\n padding: { top: 0, right: 0, bottom: 0, left: 0 },\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\n ...(rowBg ? { backgroundColor: rowBg } : {}),\n },\n });\n\n return [section];\n}\n\n/**\n * Extracts template-level settings from the BeeFree body.\n */\nfunction extractSettings(\n template: BeeFreeTemplate,\n): TemplateContent[\"settings\"] {\n const body = template.page.body;\n const contentStyle = body?.content?.style ?? {};\n const containerStyle = body?.container?.style ?? {};\n\n const width = parsePxValue(contentStyle[\"width\"] ?? contentStyle.width);\n const bgColor =\n parseColor(contentStyle[\"background-color\"]) ||\n parseColor(containerStyle[\"background-color\"]) ||\n \"#ffffff\";\n const fontFamily = parseFontFamily(contentStyle[\"font-family\"]) || \"Arial\";\n\n return {\n width: width || 600,\n backgroundColor: bgColor,\n fontFamily,\n };\n}\n\n/**\n * Converts a BeeFree template JSON to Templatical TemplateContent.\n *\n * @param template - The parsed BeeFree JSON object\n * @returns An ImportResult with the converted content and a detailed report\n *\n * @example\n * ```ts\n * import { convertBeeFreeTemplate } from '@templatical/import-beefree';\n *\n * const beeFreeJson = JSON.parse(fileContent);\n * const { content, report } = convertBeeFreeTemplate(beeFreeJson);\n *\n * // Use the content with the editor\n * const editor = init({ container: '#editor', content });\n *\n * // Check the report for any issues\n * console.log(report.summary);\n * console.log(report.warnings);\n * ```\n */\nexport function convertBeeFreeTemplate(\n template: BeeFreeTemplate,\n): ImportResult {\n // Validate structure\n if (!template?.page?.rows) {\n throw new Error(\n \"Invalid BeeFree template: missing page.rows. Ensure you are passing a valid BeeFree JSON export.\",\n );\n }\n\n const entries: ImportReportEntry[] = [];\n const warnings: string[] = [];\n const blocks: Block[] = [];\n\n // Extract web font warnings\n const webFonts = template.page.body?.webFonts;\n if (webFonts && webFonts.length > 1) {\n warnings.push(\n `Template uses ${webFonts.length} web fonts. Only the primary font is preserved; additional fonts may need to be configured via the fonts option.`,\n );\n }\n\n // Process rows\n for (const row of template.page.rows) {\n if (row.empty) continue;\n blocks.push(...processRow(row, entries, warnings));\n }\n\n // Build template content\n const content: TemplateContent = {\n ...createDefaultTemplateContent(),\n blocks,\n settings: extractSettings(template),\n };\n\n // Build report summary\n const summary = {\n total: entries.length,\n converted: entries.filter((e) => e.status === \"converted\").length,\n approximated: entries.filter((e) => e.status === \"approximated\").length,\n htmlFallback: entries.filter((e) => e.status === \"html-fallback\").length,\n skipped: entries.filter((e) => e.status === \"skipped\").length,\n };\n\n const report: ImportReport = { entries, warnings, summary };\n\n return { content, report };\n}\n","import {\n createTextBlock,\n createImageBlock,\n createButtonBlock,\n createDividerBlock,\n createSpacerBlock,\n createHtmlBlock,\n createSocialIconsBlock,\n createMenuBlock,\n createTableBlock,\n createVideoBlock,\n generateId,\n} from \"@templatical/types\";\nimport type {\n Block,\n SocialPlatform,\n SocialIcon,\n MenuItemData,\n TableRowData,\n TableCellData,\n SpacingValue,\n} from \"@templatical/types\";\nimport type {\n BeeFreeeModule,\n BeeFreeeModuleDescriptor,\n ImportReportEntry,\n} from \"./types\";\nimport {\n parsePxValue,\n parseColor,\n parseBorderTop,\n extractPadding,\n parseWidthPercent,\n parseFontFamily,\n} from \"./style-parser\";\n\n/**\n * Maps BeeFree module type strings to short keys.\n */\nconst MODULE_TYPE_MAP: Record<string, string> = {\n \"mailup-bee-newsletter-modules-text\": \"text\",\n \"mailup-bee-newsletter-modules-paragraph\": \"text\",\n \"mailup-bee-newsletter-modules-heading\": \"heading\",\n \"mailup-bee-newsletter-modules-list\": \"list\",\n \"mailup-bee-newsletter-modules-image\": \"image\",\n \"mailup-bee-newsletter-modules-button\": \"button\",\n \"mailup-bee-newsletter-modules-divider\": \"divider\",\n \"mailup-bee-newsletter-modules-spacer\": \"spacer\",\n \"mailup-bee-newsletter-modules-html\": \"html\",\n \"mailup-bee-newsletter-modules-social\": \"social\",\n \"mailup-bee-newsletter-modules-video\": \"video\",\n \"mailup-bee-newsletter-modules-menu\": \"menu\",\n \"mailup-bee-newsletter-modules-table\": \"table\",\n};\n\nconst SOCIAL_PLATFORM_MAP: Record<string, SocialPlatform> = {\n facebook: \"facebook\",\n twitter: \"twitter\",\n x: \"twitter\",\n instagram: \"instagram\",\n linkedin: \"linkedin\",\n youtube: \"youtube\",\n tiktok: \"tiktok\",\n pinterest: \"pinterest\",\n email: \"email\",\n whatsapp: \"whatsapp\",\n telegram: \"telegram\",\n discord: \"discord\",\n snapchat: \"snapchat\",\n reddit: \"reddit\",\n github: \"github\",\n dribbble: \"dribbble\",\n behance: \"behance\",\n};\n\ntype Align = \"left\" | \"center\" | \"right\";\ntype FontWeight = \"normal\" | \"bold\";\ntype LineStyle = \"solid\" | \"dashed\" | \"dotted\";\n\nfunction toAlign(value: string | undefined, fallback: Align = \"left\"): Align {\n if (value === \"left\" || value === \"center\" || value === \"right\") return value;\n return fallback;\n}\n\nfunction toFontWeight(\n value: string | undefined,\n fallback: FontWeight = \"normal\",\n): FontWeight {\n if (value === \"bold\") return \"bold\";\n return fallback;\n}\n\nfunction toLineStyle(\n value: string | undefined,\n fallback: LineStyle = \"solid\",\n): LineStyle {\n if (value === \"solid\" || value === \"dashed\" || value === \"dotted\")\n return value;\n return fallback;\n}\n\nfunction defaultMargin(): SpacingValue {\n return { top: 0, right: 0, bottom: 0, left: 0 };\n}\n\nfunction makeStyles(descriptor: BeeFreeeModuleDescriptor): Block[\"styles\"] {\n const padding = extractPadding(descriptor.style);\n const bg = parseColor(descriptor.style?.[\"background-color\"]);\n return {\n padding,\n margin: defaultMargin(),\n ...(bg ? { backgroundColor: bg } : {}),\n };\n}\n\nfunction convertText(descriptor: BeeFreeeModuleDescriptor): Block {\n const textContent =\n descriptor.text ?? descriptor.paragraph ?? descriptor.list;\n const html = textContent?.html ?? \"\";\n const style = textContent?.style ?? {};\n\n return createTextBlock({\n content: html,\n fontSize: parsePxValue(style[\"font-size\"]) || 16,\n color: parseColor(style.color) || \"#1a1a1a\",\n textAlign: toAlign(style[\"text-align\"]),\n fontWeight: toFontWeight(style[\"font-weight\"]),\n fontFamily: parseFontFamily(style[\"font-family\"]) || undefined,\n styles: makeStyles(descriptor),\n });\n}\n\nfunction convertHeading(descriptor: BeeFreeeModuleDescriptor): Block {\n const heading = descriptor.heading;\n if (!heading) return convertText(descriptor);\n\n const style = heading.style ?? {};\n const tag = heading.title ?? \"h2\";\n const text = heading.text ?? \"\";\n const content = text.startsWith(\"<\") ? text : `<${tag}>${text}</${tag}>`;\n\n return createTextBlock({\n content,\n fontSize: parsePxValue(style[\"font-size\"]) || 24,\n color: parseColor(style.color) || \"#1a1a1a\",\n textAlign: toAlign(style[\"text-align\"]),\n fontWeight: toFontWeight(style[\"font-weight\"], \"bold\"),\n fontFamily: parseFontFamily(style[\"font-family\"]) || undefined,\n styles: makeStyles(descriptor),\n });\n}\n\nfunction convertImage(descriptor: BeeFreeeModuleDescriptor): Block {\n const image = descriptor.image;\n if (!image) {\n return createImageBlock({ styles: makeStyles(descriptor) });\n }\n\n return createImageBlock({\n src: image.src || \"\",\n alt: image.alt || \"\",\n width: parsePxValue(image.width) || 600,\n align: toAlign(image.style?.[\"text-align\"], \"center\"),\n linkUrl: image.href || undefined,\n styles: makeStyles(descriptor),\n });\n}\n\nfunction convertButton(descriptor: BeeFreeeModuleDescriptor): Block {\n const button = descriptor.button;\n if (!button) {\n return createButtonBlock({ styles: makeStyles(descriptor) });\n }\n\n const style = button.style ?? {};\n const label = button.label?.replace(/<[^>]*>/g, \"\") ?? \"Button\";\n\n return createButtonBlock({\n text: label,\n url: button.href || \"#\",\n backgroundColor: parseColor(style[\"background-color\"]) || \"#4f46e5\",\n textColor: parseColor(style.color) || \"#ffffff\",\n borderRadius: parsePxValue(style[\"border-radius\"]),\n fontSize: parsePxValue(style[\"font-size\"]) || 16,\n fontFamily: parseFontFamily(style[\"font-family\"]) || undefined,\n buttonPadding: {\n top: parsePxValue(style[\"padding-top\"]) || 12,\n right: parsePxValue(style[\"padding-right\"]) || 24,\n bottom: parsePxValue(style[\"padding-bottom\"]) || 12,\n left: parsePxValue(style[\"padding-left\"]) || 24,\n },\n styles: makeStyles(descriptor),\n });\n}\n\nfunction convertDivider(descriptor: BeeFreeeModuleDescriptor): Block {\n const divider = descriptor.divider;\n const style = divider?.style ?? {};\n const border = parseBorderTop(style[\"border-top\"]);\n\n return createDividerBlock({\n lineStyle: toLineStyle(border.style),\n color: border.color,\n thickness: border.width || 1,\n width: parseWidthPercent(style.width),\n styles: makeStyles(descriptor),\n });\n}\n\nfunction convertSpacer(descriptor: BeeFreeeModuleDescriptor): Block {\n const spacer = descriptor.spacer;\n const height = parsePxValue(spacer?.style?.height) || 24;\n\n return createSpacerBlock({\n height,\n styles: makeStyles(descriptor),\n });\n}\n\nfunction convertHtml(descriptor: BeeFreeeModuleDescriptor): Block {\n const html = descriptor.html?.html ?? \"\";\n\n return createHtmlBlock({\n content: html,\n styles: makeStyles(descriptor),\n });\n}\n\nfunction convertSocial(\n descriptor: BeeFreeeModuleDescriptor,\n warnings: string[],\n): Block {\n const iconsList = descriptor.iconsList;\n if (!iconsList?.icons) {\n return createSocialIconsBlock({ styles: makeStyles(descriptor) });\n }\n\n const icons: SocialIcon[] = [];\n\n for (const beeIcon of iconsList.icons) {\n const id = (beeIcon.id ?? beeIcon.name ?? \"\").toLowerCase();\n const platform = SOCIAL_PLATFORM_MAP[id];\n\n if (!platform) {\n warnings.push(\n `Unrecognized social icon \"${beeIcon.name || id}\" was skipped.`,\n );\n continue;\n }\n\n icons.push({\n id: generateId(),\n platform,\n url: beeIcon.image?.href || \"#\",\n });\n }\n\n return createSocialIconsBlock({\n icons,\n styles: makeStyles(descriptor),\n });\n}\n\nfunction convertVideo(descriptor: BeeFreeeModuleDescriptor): Block {\n const video = descriptor.video;\n if (!video) {\n return createVideoBlock({ styles: makeStyles(descriptor) });\n }\n\n return createVideoBlock({\n url: video.src || \"\",\n thumbnailUrl: video.thumbnail || \"\",\n alt: video.alt || \"\",\n width: parsePxValue(video.style?.width) || 600,\n align: toAlign(video.style?.[\"text-align\"], \"center\"),\n styles: makeStyles(descriptor),\n });\n}\n\nfunction convertMenu(descriptor: BeeFreeeModuleDescriptor): Block {\n const menu = descriptor.menu;\n if (!menu) {\n return createMenuBlock({ styles: makeStyles(descriptor) });\n }\n\n const style = menu.style ?? {};\n\n const items: MenuItemData[] = (menu.items ?? []).map((item) => ({\n id: generateId(),\n text: item.text || \"\",\n url: item.link || item.href || \"#\",\n openInNewTab: item.target === \"_blank\",\n bold: false,\n underline: false,\n }));\n\n return createMenuBlock({\n items,\n separator: menu.separator || \"|\",\n separatorColor: parseColor(menu.separatorColor) || \"#999999\",\n fontSize: parsePxValue(style[\"font-size\"]) || 14,\n color: parseColor(style.color) || \"#1a1a1a\",\n fontFamily: parseFontFamily(style[\"font-family\"]) || undefined,\n textAlign: toAlign(style[\"text-align\"], \"center\"),\n styles: makeStyles(descriptor),\n });\n}\n\nfunction convertTable(descriptor: BeeFreeeModuleDescriptor): Block {\n const table = descriptor.table;\n if (!table) {\n return createTableBlock({ styles: makeStyles(descriptor) });\n }\n\n const style = table.style ?? {};\n\n const rows: TableRowData[] = (table.rows ?? []).map((row) => ({\n id: generateId(),\n cells: (row.cells ?? []).map(\n (cell): TableCellData => ({\n id: generateId(),\n content: cell.content ?? cell.html ?? \"\",\n }),\n ),\n }));\n\n return createTableBlock({\n rows,\n hasHeaderRow: table.hasHeaderRow ?? false,\n headerBackgroundColor: parseColor(table.headerBackgroundColor) || undefined,\n borderColor: parseColor(style[\"border-color\"]) || \"#dddddd\",\n borderWidth: parsePxValue(style[\"border-width\"]) || 1,\n cellPadding:\n typeof table.cellPadding === \"number\"\n ? table.cellPadding\n : parsePxValue(table.cellPadding as string) || 8,\n fontSize: parsePxValue(style[\"font-size\"]) || 14,\n color: parseColor(style.color) || \"#1a1a1a\",\n textAlign: toAlign(style[\"text-align\"]),\n styles: makeStyles(descriptor),\n });\n}\n\nfunction convertHtmlFallback(module: BeeFreeeModule): Block {\n // Attempt to extract any HTML content from the descriptor\n const descriptor = module.descriptor;\n let html = \"\";\n\n // Try common content fields\n if (descriptor.text?.html) html = descriptor.text.html;\n else if (descriptor.html?.html) html = descriptor.html.html;\n else if (descriptor.heading?.text) html = descriptor.heading.text;\n else html = `<!-- Unsupported BeeFree module: ${module.type} -->`;\n\n return createHtmlBlock({\n content: html,\n styles: makeStyles(descriptor),\n });\n}\n\n/**\n * Converts a single BeeFree module to a Templatical block.\n * Returns the block and a report entry.\n */\nexport function convertModule(\n module: BeeFreeeModule,\n warnings: string[],\n): { block: Block; entry: ImportReportEntry } {\n const mappedType = MODULE_TYPE_MAP[module.type];\n const descriptor = module.descriptor;\n\n if (!mappedType) {\n return {\n block: convertHtmlFallback(module),\n entry: {\n beeFreeModuleType: module.type,\n templaticalBlockType: \"html\",\n status: \"html-fallback\",\n note: `Unknown module type \"${module.type}\" converted to HTML block.`,\n },\n };\n }\n\n let block: Block;\n let isApproximation = false;\n\n switch (mappedType) {\n case \"text\":\n case \"list\":\n block = convertText(descriptor);\n break;\n case \"heading\":\n block = convertHeading(descriptor);\n break;\n case \"image\":\n block = convertImage(descriptor);\n break;\n case \"button\":\n block = convertButton(descriptor);\n break;\n case \"divider\":\n block = convertDivider(descriptor);\n break;\n case \"spacer\":\n block = convertSpacer(descriptor);\n break;\n case \"html\":\n block = convertHtml(descriptor);\n break;\n case \"social\":\n block = convertSocial(descriptor, warnings);\n break;\n case \"video\":\n block = convertVideo(descriptor);\n break;\n case \"menu\":\n block = convertMenu(descriptor);\n isApproximation = true; // menu styles are approximate\n break;\n case \"table\":\n block = convertTable(descriptor);\n break;\n default:\n block = convertHtmlFallback(module);\n return {\n block,\n entry: {\n beeFreeModuleType: module.type,\n templaticalBlockType: \"html\",\n status: \"html-fallback\",\n },\n };\n }\n\n return {\n block,\n entry: {\n beeFreeModuleType: module.type,\n templaticalBlockType: block.type,\n status: isApproximation ? \"approximated\" : \"converted\",\n },\n };\n}\n","import type { SpacingValue } from \"@templatical/types\";\n\n/**\n * Parses CSS-like style values from BeeFree descriptors.\n */\n\nexport function parsePxValue(value: string | undefined): number {\n if (!value) return 0;\n const match = value.match(/^(-?\\d+(?:\\.\\d+)?)\\s*px/);\n return match ? Math.round(parseFloat(match[1])) : 0;\n}\n\nexport function parseColor(value: string | undefined): string {\n if (!value || value === \"transparent\") return \"\";\n\n const trimmed = value.trim();\n\n // Already a valid hex color\n if (/^#[0-9a-fA-F]{6}$/.test(trimmed)) return trimmed.toLowerCase();\n\n // 3-digit hex → 6-digit\n if (/^#[0-9a-fA-F]{3}$/.test(trimmed)) {\n const r = trimmed[1];\n const g = trimmed[2];\n const b = trimmed[3];\n return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();\n }\n\n // Return as-is for rgb(), named colors, etc.\n return trimmed;\n}\n\nexport function parseBorderTop(value: string | undefined): {\n width: number;\n style: string;\n color: string;\n} {\n if (!value) return { width: 0, style: \"solid\", color: \"#000000\" };\n\n // \"2px solid #cccccc\"\n const parts = value.trim().split(/\\s+/);\n return {\n width: parsePxValue(parts[0]),\n style: parts[1] || \"solid\",\n color: parseColor(parts[2]) || \"#000000\",\n };\n}\n\nexport function extractPadding(\n style: Record<string, string> | undefined,\n): SpacingValue {\n if (!style) return { top: 0, right: 0, bottom: 0, left: 0 };\n\n // Check for shorthand `padding` first\n if (style.padding) {\n return parseShorthandPadding(style.padding);\n }\n\n return {\n top: parsePxValue(style[\"padding-top\"]),\n right: parsePxValue(style[\"padding-right\"]),\n bottom: parsePxValue(style[\"padding-bottom\"]),\n left: parsePxValue(style[\"padding-left\"]),\n };\n}\n\nfunction parseShorthandPadding(value: string): SpacingValue {\n const parts = value.trim().split(/\\s+/);\n const values = parts.map((p) => parsePxValue(p));\n\n switch (values.length) {\n case 1:\n return {\n top: values[0],\n right: values[0],\n bottom: values[0],\n left: values[0],\n };\n case 2:\n return {\n top: values[0],\n right: values[1],\n bottom: values[0],\n left: values[1],\n };\n case 3:\n return {\n top: values[0],\n right: values[1],\n bottom: values[2],\n left: values[1],\n };\n default:\n return {\n top: values[0],\n right: values[1],\n bottom: values[2],\n left: values[3],\n };\n }\n}\n\nexport function parseWidthPercent(value: string | undefined): number {\n if (!value) return 100;\n const match = value.match(/^(\\d+(?:\\.\\d+)?)\\s*%/);\n if (match) return Math.round(parseFloat(match[1]));\n // Might be px — return 100 as default\n return 100;\n}\n\nexport function parseFontFamily(value: string | undefined): string {\n if (!value) return \"\";\n // Take the first font in the stack\n return value.split(\",\")[0].trim().replace(/['\"]/g, \"\");\n}\n"],"mappings":"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","names":["import_types","module","module"]}