@vitrina/email-builder 0.1.4
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/LICENSE +21 -0
- package/README.md +150 -0
- package/dist/index.d.ts +243 -0
- package/dist/index.js +1475 -0
- package/dist/index.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/compile.ts","../src/dnd.ts","../src/Canvas.tsx","../src/CodeArea.tsx","../src/RightPanel.tsx","../src/labels.ts","../src/EmailBuilder.tsx"],"names":["content","ImageIcon","escapeHtml","useRef","jsxs","jsx","useState","Trash2","MenuIcon","Code2","rows","row"],"mappings":"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","file":"index.js","sourcesContent":["// Email design model — the JSON that round-trips through campaign.content.design.\n//\n// Kept deliberately self-contained (no vitrina imports) so this whole folder\n// can later be lifted into @vitrina/email-builder unchanged. The layout\n// model is Unlayer-shaped: an email is a vertical stack of full-width Rows;\n// each Row centers a content area split into weighted Columns; each Column\n// holds a vertical stack of Blocks. compile.ts turns this into email-safe\n// table HTML.\n\nexport type BlockAlign = 'left' | 'center' | 'right';\n\n// Every block carries a container padding (Unlayer \"Container Padding\").\ninterface BlockBase {\n id: string;\n padding: number; // px, all sides, around the block within its column\n}\n\nexport interface TextBlock extends BlockBase {\n type: 'text';\n html: string; // sanitized inline HTML, may contain {{merge}} tags\n align: BlockAlign;\n fontSize: number;\n color: string;\n lineHeight: number;\n}\n\nexport interface HeadingBlock extends BlockBase {\n type: 'heading';\n html: string;\n level: 1 | 2 | 3;\n align: BlockAlign;\n color: string;\n}\n\nexport interface ButtonBlock extends BlockBase {\n type: 'button';\n label: string;\n href: string;\n align: BlockAlign;\n background: string;\n color: string;\n radius: number;\n fullWidth: boolean;\n}\n\nexport type LinkAction = 'url' | 'email' | 'phone';\n\nexport interface ImageBlock extends BlockBase {\n type: 'image';\n src: string;\n alt: string;\n href: string; // raw value; linkAction decides the scheme. '' = no link\n linkAction: LinkAction;\n align: BlockAlign;\n width: number; // px, 0 = full column width\n}\n\nexport interface DividerBlock extends BlockBase {\n type: 'divider';\n color: string;\n thickness: number;\n}\n\nexport interface SpacerBlock extends BlockBase {\n type: 'spacer';\n height: number;\n}\n\nexport interface SocialItem {\n network: string; // key into SOCIAL_NETWORKS (compile.ts)\n url: string;\n}\n\nexport type IconStyle = 'circle' | 'rounded' | 'square';\n\nexport interface SocialBlock extends BlockBase {\n type: 'social';\n align: BlockAlign;\n size: number;\n spacing: number;\n iconStyle: IconStyle;\n items: SocialItem[];\n}\n\nexport interface HtmlBlock extends BlockBase {\n type: 'html';\n html: string; // raw, tenant-authored; <script> stripped at compile\n}\n\nexport interface MenuItem {\n label: string;\n url: string;\n}\n\nexport interface MenuBlock extends BlockBase {\n type: 'menu';\n items: MenuItem[];\n layout: 'horizontal' | 'vertical';\n align: BlockAlign;\n fontSize: number;\n color: string;\n gap: number; // px between items\n}\n\nexport type Block =\n | TextBlock | HeadingBlock | ButtonBlock | ImageBlock | DividerBlock\n | SpacerBlock | SocialBlock | HtmlBlock | MenuBlock;\n\nexport type BlockType = Block['type'];\n\nexport interface Column {\n id: string;\n weight: number; // relative width within the row (1 = equal share)\n background: string; // '' = transparent\n paddingX: number;\n paddingY: number;\n blocks: Block[];\n}\n\nexport interface Row {\n id: string;\n background: string; // full-width band color\n contentBackground: string; // centered content column color ('' = transparent)\n backgroundImage: string; // band background image url ('' = none)\n paddingY: number; // vertical padding of the full-width band\n gap: number; // vertical space between blocks in a column\n columns: Column[];\n}\n\nexport interface EmailSettings {\n backgroundColor: string; // page background behind the content column\n contentWidth: number; // px, typically 600\n fontFamily: string; // css font stack\n textColor: string;\n linkColor: string;\n preheader: string; // hidden inbox-preview line\n}\n\nexport interface EmailDesign {\n version: 1;\n settings: EmailSettings;\n rows: Row[];\n}\n\n// ── Factories ─────────────────────────────────────────────────────────\n\nexport function uid(): string {\n return typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).slice(2);\n}\n\nexport const EMAIL_FONT_STACKS: { label: string; value: string }[] = [\n { label: 'Sistema', value: '-apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif' },\n { label: 'Arial', value: 'Arial, Helvetica, sans-serif' },\n { label: 'Georgia', value: 'Georgia, \"Times New Roman\", serif' },\n { label: 'Verdana', value: 'Verdana, Geneva, sans-serif' },\n { label: 'Trebuchet', value: '\"Trebuchet MS\", Tahoma, sans-serif' },\n { label: 'Courier', value: '\"Courier New\", Courier, monospace' },\n];\n\n// Column layouts (weights per column) — shown both in the Rows tab and the\n// selected-row column picker.\nexport const ROW_LAYOUTS: { key: string; weights: number[] }[] = [\n { key: '1', weights: [1] },\n { key: '1-1', weights: [1, 1] },\n { key: '1-2', weights: [1, 2] },\n { key: '2-1', weights: [2, 1] },\n { key: '1-1-1', weights: [1, 1, 1] },\n { key: '1-2-1', weights: [1, 2, 1] },\n { key: '2-1-1', weights: [2, 1, 1] },\n { key: '1-1-2', weights: [1, 1, 2] },\n { key: '1-1-1-1', weights: [1, 1, 1, 1] },\n];\n\nexport function defaultSettings(): EmailSettings {\n return {\n backgroundColor: '#f4f4f5',\n contentWidth: 600,\n fontFamily: EMAIL_FONT_STACKS[0].value,\n textColor: '#18181b',\n linkColor: '#2563eb',\n preheader: '',\n };\n}\n\nexport function makeBlock(type: BlockType): Block {\n const base = { id: uid(), padding: 0 };\n switch (type) {\n case 'text':\n return { ...base, type, html: 'Escribe tu mensaje aquí…', align: 'left', fontSize: 15, color: '#3f3f46', lineHeight: 1.6 };\n case 'heading':\n return { ...base, type, html: 'Un título que engancha', level: 2, align: 'left', color: '#18181b' };\n case 'button':\n return { ...base, type, label: 'Ver más', href: 'https://', align: 'left', background: '#2563eb', color: '#ffffff', radius: 8, fullWidth: false };\n case 'image':\n return { ...base, type, src: '', alt: '', href: '', linkAction: 'url', align: 'center', width: 0 };\n case 'divider':\n return { ...base, type, color: '#e4e4e7', thickness: 1 };\n case 'spacer':\n return { ...base, type, height: 24 };\n case 'social':\n return { ...base, type, align: 'center', size: 32, spacing: 8, iconStyle: 'circle', items: [{ network: 'instagram', url: 'https://' }, { network: 'facebook', url: 'https://' }, { network: 'whatsapp', url: 'https://' }] };\n case 'html':\n return { ...base, type, html: '' };\n case 'menu':\n return { ...base, type, layout: 'horizontal', align: 'center', fontSize: 14, color: '#3f3f46', gap: 20, items: [{ label: 'Inicio', url: 'https://' }, { label: 'Productos', url: 'https://' }, { label: 'Contacto', url: 'https://' }] };\n default: {\n const never: never = type;\n throw new Error(`unknown block type ${String(never)}`);\n }\n }\n}\n\nexport function makeColumn(weight = 1, blocks: Block[] = []): Column {\n return { id: uid(), weight, background: '', paddingX: 0, paddingY: 0, blocks };\n}\n\nexport function makeRow(weights: number[] = [1]): Row {\n const ws = weights.length ? weights : [1];\n return { id: uid(), background: '#ffffff', contentBackground: '', backgroundImage: '', paddingY: 24, gap: 16, columns: ws.map((w) => makeColumn(w)) };\n}\n\n/** A pleasant starter so a fresh campaign is never a blank canvas. */\nexport function defaultDesign(): EmailDesign {\n const row = makeRow([1]);\n row.paddingY = 32;\n row.columns[0].blocks = [makeBlock('heading'), makeBlock('text'), makeBlock('button')];\n return { version: 1, settings: defaultSettings(), rows: [row] };\n}\n\n/** Count blocks across every row/column — the wizard gates \"next\" on ≥1. */\nexport function blockCount(design: EmailDesign): number {\n return design.rows.reduce((n, r) => n + r.columns.reduce((m, c) => m + c.blocks.length, 0), 0);\n}\n\n/** Re-split a row to `weights.length` columns, preserving block content: kept\n * columns keep their blocks; extra columns' blocks merge into the last kept\n * one; new columns start empty. */\nexport function relayoutRow(row: Row, weights: number[]): Row {\n const ws = weights.length ? weights : [1];\n const cols: Column[] = ws.map((w, i) => (row.columns[i] ? { ...row.columns[i], weight: w } : makeColumn(w)));\n if (row.columns.length > ws.length) {\n const overflow = row.columns.slice(ws.length).flatMap((c) => c.blocks);\n const last = cols[cols.length - 1];\n cols[cols.length - 1] = { ...last, blocks: [...last.blocks, ...overflow] };\n }\n return { ...row, columns: cols };\n}\n","// Design → email-safe HTML. This is the export contract: the string it\n// produces goes into campaign.content.html, and the vitrina-app server wraps\n// it in the compliant shell (footer + unsubscribe) at send time. Table-based,\n// inline styles only — the rules of email HTML. Merge tags ({{nombre}}) are\n// left verbatim; the server renders them per recipient.\n//\n// Same module drives the live canvas: BlockView renders non-text blocks via\n// compileBlockInner (so what you see IS what sends), and shares textStyle /\n// headingStyle with the compiler so the two renderers can't drift.\n\nimport type { Block, Column, EmailDesign, EmailSettings, HeadingBlock, MenuBlock, Row, SocialBlock, TextBlock } from './types';\n\n// ── low-level ─────────────────────────────────────────────────────────\n\n/** Escape text destined for element content. Braces survive, so a {{tag}}\n * typed into a button label still reaches the server. */\nexport function escapeHtml(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\n/** Escape a value going into a double-quoted attribute (href/src/alt). */\nexport function escapeAttr(s: string): string {\n return escapeHtml(s).replace(/\"/g, '"');\n}\n\n/** camelCase style object → inline CSS string. Values already carry units. */\nexport function styleToString(style: Record<string, string>): string {\n return Object.entries(style)\n .map(([k, v]) => `${k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)}:${v}`)\n .join(';');\n}\n\nconst HEADING_SIZE: Record<1 | 2 | 3, string> = { 1: '28px', 2: '22px', 3: '18px' };\n\n/** Text-block CSS — shared by the compiler and the canvas contentEditable. */\nexport function textStyle(b: TextBlock, s: EmailSettings): Record<string, string> {\n return {\n margin: '0',\n fontFamily: s.fontFamily,\n fontSize: `${b.fontSize}px`,\n lineHeight: String(b.lineHeight),\n color: b.color,\n textAlign: b.align,\n };\n}\n\n/** Heading-block CSS — rendered as a styled div to dodge <h*> UA margins. */\nexport function headingStyle(b: HeadingBlock, s: EmailSettings): Record<string, string> {\n return {\n margin: '0',\n fontFamily: s.fontFamily,\n fontSize: HEADING_SIZE[b.level],\n lineHeight: '1.3',\n fontWeight: '700',\n color: b.color,\n textAlign: b.align,\n };\n}\n\n// Brand registry. `bg`/`mark` drive the self-contained fallback chip; when a\n// host provides socialIconBase, we render real <slug>.png icons instead. The\n// slug is the icon filename the host hosts (see SOCIAL_SLUGS).\nexport const SOCIAL_NETWORKS: Record<string, { label: string; bg: string; mark: string }> = {\n instagram: { label: 'Instagram', bg: '#E4405F', mark: 'IG' },\n facebook: { label: 'Facebook', bg: '#1877F2', mark: 'f' },\n whatsapp: { label: 'WhatsApp', bg: '#25D366', mark: 'WA' },\n x: { label: 'X', bg: '#000000', mark: 'X' },\n twitter: { label: 'Twitter', bg: '#1DA1F2', mark: 't' },\n linkedin: { label: 'LinkedIn', bg: '#0A66C2', mark: 'in' },\n youtube: { label: 'YouTube', bg: '#FF0000', mark: 'YT' },\n tiktok: { label: 'TikTok', bg: '#111111', mark: 'TT' },\n pinterest: { label: 'Pinterest', bg: '#E60023', mark: 'P' },\n snapchat: { label: 'Snapchat', bg: '#FFFC00', mark: 'SC' },\n telegram: { label: 'Telegram', bg: '#26A5E4', mark: 'TG' },\n messenger: { label: 'Messenger', bg: '#0084FF', mark: 'M' },\n reddit: { label: 'Reddit', bg: '#FF4500', mark: 'R' },\n spotify: { label: 'Spotify', bg: '#1DB954', mark: 'S' },\n threads: { label: 'Threads', bg: '#000000', mark: '@' },\n github: { label: 'GitHub', bg: '#181717', mark: 'GH' },\n vimeo: { label: 'Vimeo', bg: '#1AB7EA', mark: 'V' },\n tumblr: { label: 'Tumblr', bg: '#36465D', mark: 't' },\n discord: { label: 'Discord', bg: '#5865F2', mark: 'D' },\n email: { label: 'Email', bg: '#52525b', mark: '@' },\n website: { label: 'Sitio web', bg: '#52525b', mark: 'WWW' },\n};\n\n/** The icon filenames a host must provide under socialIconBase (as <slug>.png,\n * or .svg). Exposed so the app can list them / validate the drop folder. */\nexport const SOCIAL_SLUGS = Object.keys(SOCIAL_NETWORKS);\n\nfunction socialMeta(network: string) {\n return SOCIAL_NETWORKS[network] ?? { label: network, bg: '#52525b', mark: (network[0] ?? '?').toUpperCase() };\n}\n\nexport interface CompileOpts {\n /** Absolute base URL for hosted social icons (<base>/<slug>.png). When\n * omitted, social renders the self-contained colored-chip fallback. */\n socialIconBase?: string;\n}\n\n/** Optional. Multi-column rows already stack on narrow screens via the fluid\n * hybrid layout (no media query needed — Gmail included). This just widens\n * the stacked columns to the full width on phones for a touch more polish;\n * drop it into your email's <head> if you like (compileDesign emits body-only\n * HTML, so the head belongs to the consumer's shell). */\nexport const MOBILE_STACK_CSS =\n '<style>@media only screen and (max-width:600px){.eb-col{max-width:100%!important}}</style>';\n\n// ── inline sanitizer (canvas → stored html) ───────────────────────────\n// contentEditable produces arbitrary markup (paste, execCommand); email\n// wants a tiny allow-list. DOM-based, so it's correct on nesting the way a\n// regex never is. Runs only in the browser (called from onBlur).\n\nconst ALLOWED_INLINE = new Set(['B', 'STRONG', 'I', 'EM', 'U', 'S', 'STRIKE', 'A', 'BR', 'SPAN', 'FONT', 'UL', 'OL', 'LI', 'DIV', 'P']);\n// Dropped element-AND-content (never legitimately in inline text; unwrapping\n// would leak their text, e.g. a <script>'s source, as visible content).\nconst DROP_ENTIRELY = new Set(['SCRIPT', 'STYLE', 'IFRAME', 'OBJECT', 'EMBED', 'LINK', 'META', 'NOSCRIPT']);\nconst ALLOWED_STYLE = /^(color|font-size|font-weight|font-style|text-decoration|text-align|background-color|line-height)$/;\n\nfunction scrubStyle(el: HTMLElement): void {\n const raw = el.getAttribute('style');\n if (!raw) return;\n const kept = raw.split(';').map((d) => d.trim()).filter(Boolean)\n .filter((d) => ALLOWED_STYLE.test(d.split(':')[0]?.trim() ?? ''));\n if (kept.length) el.setAttribute('style', kept.join(';'));\n else el.removeAttribute('style');\n}\n\nfunction scrub(node: Node): void {\n for (const child of Array.from(node.childNodes)) {\n if (child.nodeType === 3 /* text */) continue;\n if (child.nodeType !== 1 /* element */) {\n child.parentNode?.removeChild(child);\n continue;\n }\n const el = child as HTMLElement;\n if (DROP_ENTIRELY.has(el.tagName)) { el.remove(); continue; } // drop tag AND content\n scrub(el); // depth-first: children are clean before we judge the parent\n if (!ALLOWED_INLINE.has(el.tagName)) {\n el.replaceWith(...Array.from(el.childNodes)); // unwrap, keep text\n continue;\n }\n for (const attr of Array.from(el.attributes)) {\n if (el.tagName === 'A' && attr.name === 'href') continue;\n if (attr.name === 'style') continue; // scrubbed below\n if (el.tagName === 'FONT' && (attr.name === 'color' || attr.name === 'size')) continue;\n el.removeAttribute(attr.name);\n }\n scrubStyle(el);\n if (el.tagName === 'A') {\n const href = el.getAttribute('href') ?? '';\n if (!/^(https?:|mailto:)/i.test(href)) el.replaceWith(...Array.from(el.childNodes));\n }\n }\n}\n\nexport function sanitizeInline(html: string): string {\n if (typeof document === 'undefined') return html.replace(/<[^>]+>/g, '');\n const root = document.createElement('div');\n root.innerHTML = html;\n scrub(root);\n return root.innerHTML.trim();\n}\n\n/** Strip <script>/<style>/on* handlers from an HTML block. Email clients drop\n * these anyway; this keeps the on-canvas preview from executing them. */\nexport function sanitizeRawHtml(html: string): string {\n return html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n .replace(/\\son\\w+\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, '');\n}\n\n// ── preview substitution (display only, never stored) ─────────────────\n\nconst SAMPLE: Record<string, string> = { nombre: 'María', name: 'María', email: 'maria@ejemplo.cl' };\n\nexport function previewFill(html: string): string {\n return html.replace(/\\{\\{\\s*([a-z_]+)(?:\\|([^}]*))?\\s*\\}\\}/gi, (_m, key: string, fb?: string) => SAMPLE[key.toLowerCase()] ?? fb ?? '');\n}\n\n// ── block rendering ───────────────────────────────────────────────────\n\nexport function iconRadius(style: string | undefined, size: number): string {\n if (style === 'square') return '0';\n if (style === 'rounded') return `${Math.round(size * 0.25)}px`;\n return '50%';\n}\n\nfunction renderSocial(block: SocialBlock, opts?: CompileOpts): string {\n const s = block.size;\n const gap = Math.max(0, Math.round((block.spacing ?? 8) / 2));\n const radius = iconRadius(block.iconStyle, s);\n const base = opts?.socialIconBase?.replace(/\\/+$/, '');\n const chips = block.items.map((it) => {\n const m = socialMeta(it.network);\n const inner = base\n ? `<img src=\"${escapeAttr(`${base}/${it.network}.png`)}\" alt=\"${escapeAttr(m.label)}\" width=\"${s}\" height=\"${s}\" style=\"display:inline-block;width:${s}px;height:${s}px;border:0;outline:none;border-radius:${radius};\" />`\n : `<span style=\"display:inline-block;width:${s}px;height:${s}px;line-height:${s}px;background:${m.bg};color:#ffffff;border-radius:${radius};text-align:center;font-family:Arial,sans-serif;font-size:${Math.round(s * 0.4)}px;font-weight:700;\">${escapeHtml(m.mark)}</span>`;\n return `<a href=\"${escapeAttr(it.url || '#')}\" target=\"_blank\" style=\"display:inline-block;margin:0 ${gap}px;text-decoration:none;\">${inner}</a>`;\n }).join('');\n return `<div style=\"text-align:${block.align};font-size:0;\">${chips}</div>`;\n}\n\nfunction renderMenu(block: MenuBlock, s: EmailSettings): string {\n const sep = block.layout === 'horizontal' ? `margin:0 ${Math.round(block.gap / 2)}px` : `display:block;margin:${Math.round(block.gap / 2)}px 0`;\n const links = block.items.map((it) => `<a href=\"${escapeAttr(it.url || '#')}\" target=\"_blank\" style=\"${sep};font-family:${s.fontFamily};font-size:${block.fontSize}px;color:${block.color};text-decoration:none;\">${escapeHtml(it.label)}</a>`).join('');\n return `<div style=\"text-align:${block.align};\">${links}</div>`;\n}\n\nfunction imageHref(block: { href: string; linkAction?: 'url' | 'email' | 'phone' }): string {\n const raw = block.href.trim();\n if (!raw) return '';\n if (block.linkAction === 'email') return raw.startsWith('mailto:') ? raw : `mailto:${raw}`;\n if (block.linkAction === 'phone') return raw.startsWith('tel:') ? raw : `tel:${raw.replace(/[^\\d+]/g, '')}`;\n return raw;\n}\n\n/** The inner HTML of one block (no surrounding block-gap spacing). Shared\n * by the compiler and the canvas so preview fidelity is exact. */\nexport function compileBlockInner(block: Block, s: EmailSettings, opts?: CompileOpts): string {\n switch (block.type) {\n case 'text':\n return `<div style=\"${styleToString(textStyle(block, s))}\">${block.html || ' '}</div>`;\n case 'heading':\n return `<div style=\"${styleToString(headingStyle(block, s))}\">${block.html || ' '}</div>`;\n case 'button': {\n const a = `<a href=\"${escapeAttr(block.href || '#')}\" target=\"_blank\" style=\"display:${block.fullWidth ? 'block' : 'inline-block'};padding:12px 24px;font-family:${s.fontFamily};font-size:15px;font-weight:600;color:${block.color};text-decoration:none;border-radius:${block.radius}px;text-align:center;\">${escapeHtml(block.label)}</a>`;\n const tableStyle = block.fullWidth ? 'width:100%;' : 'display:inline-block;';\n const table = `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"${tableStyle}border-collapse:separate;line-height:1;\"><tr><td align=\"center\" bgcolor=\"${block.background}\" style=\"background:${block.background};border-radius:${block.radius}px;\">${a}</td></tr></table>`;\n return `<div style=\"text-align:${block.align};\">${table}</div>`;\n }\n case 'image': {\n if (!block.src) return '';\n const w = block.width > 0 ? `${block.width}px` : '100%';\n // Outlook (Word engine) sizes images off the width ATTRIBUTE, not CSS.\n const wAttr = block.width > 0 ? String(block.width) : '100%';\n const img = `<img src=\"${escapeAttr(block.src)}\" alt=\"${escapeAttr(block.alt)}\" width=\"${wAttr}\" style=\"display:inline-block;border:0;outline:none;text-decoration:none;width:${w};max-width:100%;height:auto;\" />`;\n const href = imageHref(block);\n const linked = href ? `<a href=\"${escapeAttr(href)}\" target=\"_blank\">${img}</a>` : img;\n return `<div style=\"text-align:${block.align};\">${linked}</div>`;\n }\n case 'divider':\n return `<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td style=\"border-top:${block.thickness}px solid ${block.color};font-size:0;line-height:0;\"> </td></tr></table>`;\n case 'spacer':\n return `<div style=\"height:${block.height}px;line-height:${block.height}px;font-size:0;\"> </div>`;\n case 'social':\n return renderSocial(block, opts);\n case 'menu':\n return renderMenu(block, s);\n case 'html':\n return sanitizeRawHtml(block.html);\n default: {\n const never: never = block;\n throw new Error(`unknown block ${JSON.stringify(never)}`);\n }\n }\n}\n\nfunction bandWrap(row: Row, content: string): string {\n const bandImg = row.backgroundImage ? `background-image:url('${escapeAttr(row.backgroundImage)}');background-size:cover;background-position:center;` : '';\n return `<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background:${row.background};${bandImg}\"><tr><td align=\"center\" style=\"padding:${row.paddingY}px 12px;\">${content}</td></tr></table>`;\n}\n\nfunction compileRow(row: Row, s: EmailSettings, opts?: CompileOpts): string {\n const cw = s.contentWidth;\n const contentBg = row.contentBackground ? `background:${row.contentBackground};` : '';\n const total = row.columns.reduce((n, c) => n + (c.weight || 1), 0) || 1;\n const colStyle = (c: Column) => `${c.background ? `background:${c.background};` : ''}padding:${c.paddingY}px ${c.paddingX}px;`;\n\n // Single column: a plain centered content table — nothing to stack.\n if (row.columns.length === 1) {\n const c = row.columns[0];\n const content = `<table role=\"presentation\" width=\"${cw}\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\" style=\"width:100%;max-width:${cw}px;${contentBg}\"><tr><td valign=\"top\" style=\"${colStyle(c)}\">${columnBody(c, row.gap, s, opts)}</td></tr></table>`;\n return bandWrap(row, content);\n }\n\n // Multi-column: the fluid \"hybrid\" pattern. Real clients see inline-block\n // divs (max-width per column) that WRAP — i.e. stack — on narrow screens\n // with no media query, so Gmail mobile stacks too. Outlook (Word engine)\n // ignores inline-block/max-width, so a `[if mso]` ghost table keeps the\n // columns side by side there. Container is font-size:0 to kill the whitespace\n // gaps between inline-blocks; each column resets it.\n const cells = row.columns.map((c) => {\n const px = Math.max(1, Math.round((cw * (c.weight || 1)) / total));\n const body = columnBody(c, row.gap, s, opts);\n return `<!--[if mso]><td width=\"${px}\" valign=\"top\"><![endif]-->`\n + `<div class=\"eb-col\" style=\"display:inline-block;width:100%;max-width:${px}px;vertical-align:top;box-sizing:border-box;font-size:14px;text-align:left;${colStyle(c)}\">${body}</div>`\n + '<!--[if mso]></td><![endif]-->';\n }).join('');\n\n const content = `<table role=\"presentation\" width=\"${cw}\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\" style=\"width:100%;max-width:${cw}px;${contentBg}\"><tr><td align=\"center\" style=\"font-size:0;\">`\n + '<!--[if mso]><table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><![endif]-->'\n + cells\n + '<!--[if mso]></tr></table><![endif]-->'\n + '</td></tr></table>';\n return bandWrap(row, content);\n}\n\n/** Inner stack of one column (block gaps), without the column <td>. */\nexport function columnBody(col: Column, gap: number, s: EmailSettings, opts?: CompileOpts): string {\n const last = col.blocks.length - 1;\n const cells = col.blocks\n .map((b, i) => {\n const inner = compileBlockInner(b, s, opts);\n if (!inner) return '';\n const padded = b.padding ? `<div style=\"padding:${b.padding}px;\">${inner}</div>` : inner;\n return `<div style=\"${i < last ? `padding-bottom:${gap}px;` : ''}\">${padded}</div>`;\n })\n .join('');\n return cells || ' ';\n}\n\nfunction preheaderSpan(text: string): string {\n if (!text.trim()) return '';\n return `<div style=\"display:none;max-height:0;overflow:hidden;mso-hide:all;font-size:1px;line-height:1px;color:#ffffff;opacity:0;\">${escapeHtml(text)}</div>`;\n}\n\n/** Design → the body HTML stored in campaign.content.html. Full-bleed rows on\n * the page background; the server appends the compliant footer at send time. */\nexport function compileDesign(design: EmailDesign, opts?: CompileOpts): string {\n const rows = design.rows.map((r) => compileRow(r, design.settings, opts)).join('');\n return `${preheaderSpan(design.settings.preheader)}<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background:${design.settings.backgroundColor};margin:0;\"><tr><td align=\"center\" style=\"padding:0;\">${rows}</td></tr></table>`;\n}\n","// Native HTML5 drag-and-drop payload — no dnd library. Drag sources (Content\n// tab = a new block, Rows tab = a new row layout, canvas = an existing block or\n// row being moved) all write this one MIME type; drop zones read it back on\n// drop. dataTransfer.getData is only readable on `drop` (not dragover), which\n// is exactly when we need it.\n\nimport type { BlockType } from './types';\nimport type { DragEvent } from 'react';\n\nexport type DragData =\n | { kind: 'new-block'; blockType: BlockType }\n | { kind: 'move-block'; blockId: string }\n | { kind: 'new-row'; weights: number[] }\n | { kind: 'move-row'; rowId: string };\n\nconst MIME = 'application/x-eb-block';\n\nexport function setDrag(e: DragEvent, data: DragData): void {\n e.dataTransfer.setData(MIME, JSON.stringify(data));\n e.dataTransfer.setData('text/plain', ''); // Firefox needs some plain payload to start a drag\n e.dataTransfer.effectAllowed = 'move';\n}\n\nexport function getDrag(e: DragEvent): DragData | null {\n try {\n return JSON.parse(e.dataTransfer.getData(MIME)) as DragData;\n } catch {\n return null;\n }\n}\n","'use client';\n\n// The editing surface. Renders the design exactly as the compiler will\n// (non-text blocks go through compileBlockInner + previewFill, so WYSIWYG is\n// literal), overlays selection / drag handles / a rich text toolbar, edits\n// text in place via contentEditable, and hosts drop zones for blocks (into a\n// column) and rows (between rows).\n\nimport { useEffect, useRef, useState, type CSSProperties, type MouseEvent } from 'react';\nimport {\n Bold, ChevronDown, ChevronUp, Code2, Copy, Eraser, GripVertical, Image as ImageIcon,\n Italic, Link2, List, ListOrdered, Strikethrough, Trash2, Underline, Upload,\n} from 'lucide-react';\n\nimport type { Block, Column, EmailDesign, Row, SocialBlock } from './types';\nimport { compileBlockInner, headingStyle, previewFill, sanitizeInline, SOCIAL_NETWORKS, textStyle } from './compile';\nimport { getDrag, setDrag, type DragData } from './dnd';\nimport type { BuilderLabels } from './labels';\n\nexport type BlockAction = 'duplicate' | 'remove' | 'up' | 'down';\nexport type RowAction = 'duplicate' | 'remove';\n\nexport interface CanvasProps {\n design: EmailDesign;\n labels: BuilderLabels;\n selectedBlockId: string | null;\n selectedRowId: string | null;\n selectedColumnId: string | null;\n dragging: boolean;\n socialIconBase?: string;\n uploadImage?: (file: File) => Promise<string>;\n onSelectBlock: (blockId: string, rowId: string) => void;\n onSelectRow: (rowId: string) => void;\n onSelectColumn: (colId: string, rowId: string) => void;\n onSelectNone: () => void;\n onBlockChange: (block: Block) => void;\n onBlockAction: (blockId: string, action: BlockAction) => void;\n onRowAction: (rowId: string, action: RowAction) => void;\n onDragStateChange: (dragging: boolean) => void;\n onDropInColumn: (colId: string, index: number, data: DragData) => void;\n onDropRow: (index: number, data: DragData) => void;\n}\n\n// contentEditable that syncs its HTML from props only when it isn't the focused\n// element — so it seeds on mount and reflects external design changes (undo /\n// redo, template load) without ever resetting the caret mid-typing. Commits\n// sanitized HTML on blur.\nfunction EditableText({ id, html, style, onCommit, onFocus }: {\n id: string; html: string; style: CSSProperties; onCommit: (html: string) => void; onFocus: () => void;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const el = ref.current;\n // While focused, `html` doesn't change until blur, so this never fights the\n // caret; when an undo/redo rewrites it from outside, the editable is blurred\n // (the toolbar button took focus) and this re-syncs the visible text.\n if (el && document.activeElement !== el && el.innerHTML !== html) el.innerHTML = html;\n }, [html, id]);\n return (\n <div\n ref={ref}\n contentEditable\n suppressContentEditableWarning\n spellCheck={false}\n className=\"outline-none focus:ring-2 focus:ring-primary/40 rounded-sm [&_ul]:list-disc [&_ol]:list-decimal [&_ul]:pl-5 [&_ol]:pl-5\"\n style={style}\n onFocus={onFocus}\n onBlur={(e) => onCommit(sanitizeInline(e.currentTarget.innerHTML))}\n />\n );\n}\n\nconst SWATCHES = ['#18181b', '#71717a', '#ffffff', '#2563eb', '#dc2626', '#16a34a', '#d97706', '#7c3aed'];\n\n// Formatting bar for the focused text/heading block. Buttons use\n// onMouseDown-preventDefault so the caret stays in the editable and\n// document.execCommand targets the right selection.\nfunction TextToolbar({ labels }: { labels: BuilderLabels }) {\n const [linkOpen, setLinkOpen] = useState(false);\n const [linkUrl, setLinkUrl] = useState('');\n const [sizeOpen, setSizeOpen] = useState(false);\n const savedRange = useRef<Range | null>(null);\n const exec = (cmd: string, value?: string) => document.execCommand(cmd, false, value);\n const hold = (fn: () => void) => (e: MouseEvent) => { e.preventDefault(); fn(); };\n const btn = 'rounded p-1.5 hover:bg-muted text-foreground';\n\n // mousedown-preventDefault keeps the caret in the editable, so the live\n // selection is still valid here (no onBlur has fired) and gets committed later.\n const applyFontSize = (px: number) => {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0 || sel.isCollapsed) return;\n const range = sel.getRangeAt(0);\n const span = document.createElement('span');\n span.style.fontSize = `${px}px`;\n try { range.surroundContents(span); } catch { span.appendChild(range.extractContents()); range.insertNode(span); }\n sel.removeAllRanges();\n };\n\n const saveRange = () => {\n const sel = window.getSelection();\n savedRange.current = sel && sel.rangeCount ? sel.getRangeAt(0).cloneRange() : null;\n };\n const applyLink = () => {\n const sel = window.getSelection();\n if (savedRange.current && sel) { sel.removeAllRanges(); sel.addRange(savedRange.current); }\n if (linkUrl.trim()) exec('createLink', linkUrl.trim());\n setLinkOpen(false); setLinkUrl('');\n };\n\n return (\n <div className=\"absolute -top-10 left-0 z-20 flex items-center gap-0.5 rounded-md border border-border bg-popover p-0.5 shadow-md\">\n <button type=\"button\" title={labels.bold} className={btn} onMouseDown={hold(() => exec('bold'))}><Bold size={14} /></button>\n <button type=\"button\" title={labels.italic} className={btn} onMouseDown={hold(() => exec('italic'))}><Italic size={14} /></button>\n <button type=\"button\" title={labels.underline} className={btn} onMouseDown={hold(() => exec('underline'))}><Underline size={14} /></button>\n <button type=\"button\" title={labels.strike} className={btn} onMouseDown={hold(() => exec('strikeThrough'))}><Strikethrough size={14} /></button>\n <div className=\"relative\">\n <button type=\"button\" title={labels.fontSize} className={`${btn} text-xs font-semibold`} onMouseDown={hold(() => setSizeOpen((v) => !v))}>A±</button>\n {sizeOpen && (\n <div className=\"absolute left-0 top-8 z-30 flex flex-col rounded-md border border-border bg-popover p-0.5 shadow-md\">\n {[12, 14, 16, 18, 20, 24, 28, 32].map((n) => (\n <button key={n} type=\"button\" className=\"rounded px-3 py-1 text-left text-xs hover:bg-muted\" onMouseDown={hold(() => { applyFontSize(n); setSizeOpen(false); })}>{n}px</button>\n ))}\n </div>\n )}\n </div>\n <span className=\"mx-0.5 h-4 w-px bg-border\" />\n <button type=\"button\" title={labels.bulletList} className={btn} onMouseDown={hold(() => exec('insertUnorderedList'))}><List size={14} /></button>\n <button type=\"button\" title={labels.numberList} className={btn} onMouseDown={hold(() => exec('insertOrderedList'))}><ListOrdered size={14} /></button>\n <span className=\"mx-0.5 h-4 w-px bg-border\" />\n <div className=\"relative\">\n <button type=\"button\" title={labels.link} className={btn} onMouseDown={hold(() => { saveRange(); setLinkOpen((v) => !v); })}><Link2 size={14} /></button>\n {linkOpen && (\n <div className=\"absolute left-0 top-8 z-30 flex gap-1 rounded-md border border-border bg-popover p-1 shadow-md\">\n <input\n autoFocus value={linkUrl} placeholder={labels.linkUrl}\n className=\"w-44 rounded border border-input bg-background px-2 py-1 text-xs outline-none\"\n onChange={(e) => setLinkUrl(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); applyLink(); } }}\n />\n <button type=\"button\" className=\"rounded bg-primary px-2 text-xs text-primary-foreground\" onMouseDown={(e) => { e.preventDefault(); applyLink(); }}>OK</button>\n </div>\n )}\n </div>\n <span className=\"mx-0.5 flex items-center gap-0.5\">\n {SWATCHES.map((c) => (\n <button\n key={c} type=\"button\" title={labels.textColor}\n className=\"h-4 w-4 rounded-full border border-border\"\n style={{ background: c }}\n onMouseDown={hold(() => document.execCommand('foreColor', false, c))}\n />\n ))}\n </span>\n <span className=\"mx-0.5 h-4 w-px bg-border\" />\n <select\n className=\"rounded bg-transparent px-1 py-0.5 text-xs outline-none hover:bg-muted\" value=\"\"\n onMouseDown={(e) => e.stopPropagation()}\n onChange={(e) => { const v = e.target.value; if (v) exec('insertText', v); e.currentTarget.value = ''; }}\n >\n <option value=\"\">{labels.insertField}</option>\n <option value=\"{{nombre|cliente}}\">nombre</option>\n <option value=\"{{email}}\">email</option>\n </select>\n <button type=\"button\" title={labels.clearFormat} className={btn} onMouseDown={hold(() => exec('removeFormat'))}><Eraser size={14} /></button>\n </div>\n );\n}\n\n// Empty-image drop target: click or drop a file to upload.\nfunction ImageDrop({ labels, uploadImage, onDone }: { labels: BuilderLabels; uploadImage?: (f: File) => Promise<string>; onDone: (url: string) => void }) {\n const ref = useRef<HTMLInputElement>(null);\n const [busy, setBusy] = useState(false);\n const [over, setOver] = useState(false);\n const take = async (f: File | undefined) => {\n if (!f || !uploadImage) return;\n setBusy(true);\n try { onDone(await uploadImage(f)); } finally { setBusy(false); }\n };\n return (\n <div\n className={`flex h-28 cursor-pointer flex-col items-center justify-center gap-1 rounded border border-dashed text-muted-foreground ${over ? 'border-primary bg-primary/5' : 'border-border'}`}\n onClick={(e) => { e.stopPropagation(); if (uploadImage) ref.current?.click(); }}\n onDragOver={(e) => { if (uploadImage) { e.preventDefault(); e.stopPropagation(); setOver(true); } }}\n onDragLeave={() => setOver(false)}\n onDrop={(e) => { e.preventDefault(); e.stopPropagation(); setOver(false); void take(e.dataTransfer.files?.[0]); }}\n >\n {uploadImage ? <Upload size={20} /> : <ImageIcon size={20} />}\n <span className=\"px-2 text-center text-xs\">{busy ? labels.uploading : uploadImage ? labels.dropImage : labels.blockNames.image}</span>\n <input ref={ref} type=\"file\" accept=\"image/*\" className=\"hidden\" onChange={(e) => { void take(e.target.files?.[0]); if (ref.current) ref.current.value = ''; }} />\n </div>\n );\n}\n\nfunction SelectionTag({ text }: { text: string }) {\n return <span className=\"absolute -top-[7px] left-2 z-10 rounded bg-primary px-1.5 py-px text-[10px] font-medium leading-tight text-primary-foreground\">{text}</span>;\n}\n\n// Social preview mirrors the compiled output (hosted <img>), but falls back to\n// the colored chip if the icon file 404s — so the editor never looks broken\n// while the host is still dropping in icon assets.\nfunction SocialChip({ network, size, base }: { network: string; size: number; base?: string }) {\n const [failed, setFailed] = useState(false);\n const m = SOCIAL_NETWORKS[network] ?? { label: network, bg: '#52525b', mark: (network[0] ?? '?').toUpperCase() };\n if (base && !failed) {\n return <img src={`${base.replace(/\\/+$/, '')}/${network}.png`} alt={m.label} width={size} height={size} style={{ display: 'inline-block' }} onError={() => setFailed(true)} />;\n }\n return <span style={{ display: 'inline-block', width: size, height: size, lineHeight: `${size}px`, background: m.bg, color: '#fff', borderRadius: '50%', textAlign: 'center', fontFamily: 'Arial, sans-serif', fontSize: Math.round(size * 0.4), fontWeight: 700 }}>{m.mark}</span>;\n}\n\nfunction SocialPreview({ block, base }: { block: SocialBlock; base?: string }) {\n const gap = Math.max(0, Math.round((block.spacing ?? 8) / 2));\n return (\n <div style={{ textAlign: block.align, fontSize: 0 }}>\n {block.items.map((it, i) => (\n <span key={i} style={{ display: 'inline-block', margin: `0 ${gap}px` }}><SocialChip network={it.network} size={block.size} base={base} /></span>\n ))}\n </div>\n );\n}\n\nfunction BlockPlaceholder({ label }: { label: string }) {\n return (\n <div className=\"flex h-24 flex-col items-center justify-center gap-1 rounded border border-dashed border-border text-muted-foreground\">\n <Code2 size={20} />\n <span className=\"text-xs\">{label}</span>\n </div>\n );\n}\n\nfunction BlockView({ block, rowId, props }: { block: Block; rowId: string; props: CanvasProps }) {\n const selected = props.selectedBlockId === block.id;\n const editable = block.type === 'text' || block.type === 'heading';\n const style = (block.type === 'text' ? textStyle(block, props.design.settings)\n : block.type === 'heading' ? headingStyle(block, props.design.settings) : {}) as CSSProperties;\n\n return (\n <div\n className={`group relative ${selected ? 'ring-2 ring-primary' : 'ring-1 ring-transparent hover:ring-primary/30'} rounded-sm`}\n onClick={(e) => { e.stopPropagation(); props.onSelectBlock(block.id, rowId); }}\n >\n {selected && <SelectionTag text={props.labels.blockNames[block.type]} />}\n {selected && editable && <TextToolbar labels={props.labels} />}\n\n {/* drag handle — only this is draggable, so contentEditable text stays selectable */}\n <div\n draggable\n onDragStart={(e) => { setDrag(e, { kind: 'move-block', blockId: block.id }); props.onDragStateChange(true); }}\n onDragEnd={() => props.onDragStateChange(false)}\n className={`absolute -left-6 top-0 hidden cursor-grab items-center text-muted-foreground group-hover:flex ${selected ? 'flex' : ''}`}\n title=\"Drag\"\n >\n <GripVertical size={15} />\n </div>\n\n {/* per-block actions */}\n <div className={`absolute -top-3 right-1 z-10 hidden items-center gap-0.5 rounded-md border border-border bg-popover p-0.5 shadow-sm group-hover:flex ${selected ? 'flex' : ''}`}>\n <button type=\"button\" title={props.labels.moveUp} className=\"rounded p-1 hover:bg-muted\" onClick={(e) => { e.stopPropagation(); props.onBlockAction(block.id, 'up'); }}><ChevronUp size={13} /></button>\n <button type=\"button\" title={props.labels.moveDown} className=\"rounded p-1 hover:bg-muted\" onClick={(e) => { e.stopPropagation(); props.onBlockAction(block.id, 'down'); }}><ChevronDown size={13} /></button>\n <button type=\"button\" title={props.labels.duplicate} className=\"rounded p-1 hover:bg-muted\" onClick={(e) => { e.stopPropagation(); props.onBlockAction(block.id, 'duplicate'); }}><Copy size={13} /></button>\n <button type=\"button\" title={props.labels.remove} className=\"rounded p-1 text-destructive hover:bg-muted\" onClick={(e) => { e.stopPropagation(); props.onBlockAction(block.id, 'remove'); }}><Trash2 size={13} /></button>\n </div>\n\n <div style={{ padding: block.padding || undefined }}>\n {editable ? (\n <EditableText\n id={block.id}\n html={block.html}\n style={style}\n onFocus={() => props.onSelectBlock(block.id, rowId)}\n onCommit={(html) => props.onBlockChange({ ...block, html })}\n />\n ) : block.type === 'image' && !block.src ? (\n <ImageDrop labels={props.labels} uploadImage={props.uploadImage} onDone={(src) => props.onBlockChange({ ...block, src })} />\n ) : block.type === 'social' ? (\n <SocialPreview block={block} base={props.socialIconBase} />\n ) : block.type === 'html' && !block.html.trim() ? (\n <BlockPlaceholder label={props.labels.blockNames.html} />\n ) : (\n <div dangerouslySetInnerHTML={{ __html: previewFill(compileBlockInner(block, props.design.settings, { socialIconBase: props.socialIconBase })) }} />\n )}\n </div>\n </div>\n );\n}\n\nfunction DropZone({ colId, index, props }: { colId: string; index: number; props: CanvasProps }) {\n const ref = useRef<HTMLDivElement>(null);\n const setActive = (on: boolean) => { if (ref.current) ref.current.dataset.active = on ? '1' : ''; };\n return (\n <div\n ref={ref}\n onDragOver={(e) => { e.preventDefault(); e.dataTransfer.dropEffect = 'move'; setActive(true); }}\n onDragLeave={() => setActive(false)}\n onDrop={(e) => {\n e.preventDefault(); e.stopPropagation();\n setActive(false);\n props.onDragStateChange(false);\n const data = getDrag(e);\n if (data && (data.kind === 'new-block' || data.kind === 'move-block')) props.onDropInColumn(colId, index, data);\n }}\n className={`${props.dragging ? 'h-6' : 'h-2'} -my-1 rounded transition-[height] data-[active=1]:bg-primary/15 data-[active=1]:outline data-[active=1]:outline-2 data-[active=1]:outline-primary/50`}\n />\n );\n}\n\nfunction ColumnView({ col, rowId, gap, props }: { col: Column; rowId: string; gap: number; props: CanvasProps }) {\n const selected = props.selectedColumnId === col.id && !props.selectedBlockId;\n return (\n <div\n className={`relative min-w-0 ${selected ? 'outline outline-2 -outline-offset-2 outline-primary' : 'hover:outline hover:outline-1 hover:-outline-offset-1 hover:outline-primary/30'}`}\n style={{ background: col.background || undefined, padding: `${col.paddingY}px ${col.paddingX}px` }}\n onClick={(e) => { e.stopPropagation(); props.onSelectColumn(col.id, rowId); }}\n >\n {selected && <SelectionTag text={props.labels.columnSettings} />}\n <DropZone colId={col.id} index={0} props={props} />\n {col.blocks.length === 0 && (\n <div className=\"py-5 text-center text-xs text-muted-foreground\">{props.labels.empty}</div>\n )}\n {col.blocks.map((b, i) => (\n <div key={b.id} style={{ marginBottom: i < col.blocks.length - 1 ? gap : 0 }}>\n <BlockView block={b} rowId={rowId} props={props} />\n <DropZone colId={col.id} index={i + 1} props={props} />\n </div>\n ))}\n </div>\n );\n}\n\nfunction RowView({ row, props }: { row: Row; props: CanvasProps }) {\n const selected = props.selectedRowId === row.id && !props.selectedBlockId && !props.selectedColumnId;\n const cols = row.columns.map((c) => `${c.weight || 1}fr`).join(' ');\n return (\n <div\n className={`group/row relative ${selected ? 'outline outline-2 -outline-offset-2 outline-primary' : ''}`}\n style={{\n background: row.background,\n padding: `${row.paddingY}px 12px`,\n ...(row.backgroundImage ? { backgroundImage: `url('${row.backgroundImage}')`, backgroundSize: 'cover', backgroundPosition: 'center' } : {}),\n }}\n onClick={(e) => { e.stopPropagation(); props.onSelectRow(row.id); }}\n >\n {selected && <SelectionTag text={props.labels.rowSettings} />}\n {/* row drag handle + actions */}\n <div className={`absolute right-1 top-1 z-10 hidden items-center gap-0.5 rounded-md border border-border bg-popover p-0.5 shadow-sm group-hover/row:flex ${selected ? 'flex' : ''}`}>\n <div\n draggable\n onDragStart={(e) => { setDrag(e, { kind: 'move-row', rowId: row.id }); props.onDragStateChange(true); }}\n onDragEnd={() => props.onDragStateChange(false)}\n className=\"cursor-grab rounded p-1 hover:bg-muted\" title={props.labels.moveUp}\n ><GripVertical size={13} /></div>\n <button type=\"button\" title={props.labels.duplicate} className=\"rounded p-1 hover:bg-muted\" onClick={(e) => { e.stopPropagation(); props.onRowAction(row.id, 'duplicate'); }}><Copy size={13} /></button>\n <button type=\"button\" title={props.labels.remove} className=\"rounded p-1 text-destructive hover:bg-muted\" onClick={(e) => { e.stopPropagation(); props.onRowAction(row.id, 'remove'); }}><Trash2 size={13} /></button>\n </div>\n <div style={{ maxWidth: props.design.settings.contentWidth, margin: '0 auto', background: row.contentBackground || undefined }}>\n <div style={{ display: 'grid', gridTemplateColumns: cols, gap: 0 }}>\n {row.columns.map((c) => <ColumnView key={c.id} col={c} rowId={row.id} gap={row.gap} props={props} />)}\n </div>\n </div>\n </div>\n );\n}\n\nfunction RowDrop({ index, props }: { index: number; props: CanvasProps }) {\n const ref = useRef<HTMLDivElement>(null);\n const setActive = (on: boolean) => { if (ref.current) ref.current.dataset.active = on ? '1' : ''; };\n return (\n <div\n ref={ref}\n onDragOver={(e) => { e.preventDefault(); e.dataTransfer.dropEffect = 'move'; setActive(true); }}\n onDragLeave={() => setActive(false)}\n onDrop={(e) => {\n e.preventDefault();\n setActive(false);\n props.onDragStateChange(false);\n const data = getDrag(e);\n if (data && (data.kind === 'new-row' || data.kind === 'move-row')) props.onDropRow(index, data);\n }}\n className={`${props.dragging ? 'h-7' : 'h-2'} mx-auto rounded transition-[height] data-[active=1]:bg-primary/20 data-[active=1]:outline data-[active=1]:outline-2 data-[active=1]:outline-primary/60`}\n style={{ maxWidth: props.design.settings.contentWidth }}\n />\n );\n}\n\nexport function Canvas(props: CanvasProps) {\n return (\n <div className=\"flex-1 overflow-y-auto p-8\" style={{ background: '#e9e9ec' }} onClick={() => props.onSelectNone()}>\n <div className=\"mx-auto shadow-sm\" style={{ maxWidth: props.design.settings.contentWidth + 48, background: props.design.settings.backgroundColor }}>\n <RowDrop index={0} props={props} />\n {props.design.rows.map((r, i) => (\n <div key={r.id}>\n <RowView row={r} props={props} />\n <RowDrop index={i + 1} props={props} />\n </div>\n ))}\n {props.design.rows.length === 0 && (\n <div className=\"py-16 text-center text-sm text-muted-foreground\">{props.labels.dropRowHere}</div>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\n// IDE-style code field: a transparent textarea over a highlight.js-colored\n// <pre>, plus a scroll-synced line-number gutter and tab-to-indent. The GitHub\n// hljs theme is already loaded app-wide (layout.tsx), so tokens get colors for\n// free. Deliberately light — no CodeMirror in the bundle.\n\nimport { useMemo, useRef, type KeyboardEvent, type UIEvent } from 'react';\nimport hljs from 'highlight.js/lib/core';\nimport xml from 'highlight.js/lib/languages/xml';\n\nif (!hljs.getLanguage('xml')) hljs.registerLanguage('xml', xml);\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nexport function CodeArea({ value, onChange, placeholder, height = 200 }: {\n value: string; onChange: (v: string) => void; placeholder?: string; height?: number;\n}) {\n const taRef = useRef<HTMLTextAreaElement>(null);\n const gutRef = useRef<HTMLDivElement>(null);\n const preRef = useRef<HTMLPreElement>(null);\n const lineCount = Math.max(1, value.split('\\n').length);\n\n const highlighted = useMemo(() => {\n try { return hljs.highlight(value || '', { language: 'xml' }).value; } catch { return escapeHtml(value); }\n }, [value]);\n\n const onScroll = (e: UIEvent<HTMLTextAreaElement>) => {\n const { scrollTop, scrollLeft } = e.currentTarget;\n if (gutRef.current) gutRef.current.scrollTop = scrollTop;\n if (preRef.current) { preRef.current.scrollTop = scrollTop; preRef.current.scrollLeft = scrollLeft; }\n };\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key !== 'Tab') return;\n e.preventDefault();\n const ta = e.currentTarget;\n const start = ta.selectionStart;\n onChange(`${value.slice(0, start)} ${value.slice(ta.selectionEnd)}`);\n requestAnimationFrame(() => { ta.selectionStart = ta.selectionEnd = start + 2; });\n };\n\n const boxStyle = { fontSize: 12, lineHeight: '18px', fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace' } as const;\n\n return (\n <div className=\"flex overflow-hidden rounded-md border border-input bg-background\" style={{ height, ...boxStyle }}>\n <div ref={gutRef} className=\"select-none overflow-hidden border-r border-border bg-muted/40 py-2 pl-2 pr-1.5 text-right text-muted-foreground\" style={{ minWidth: 34 }}>\n {Array.from({ length: lineCount }, (_, i) => <div key={i}>{i + 1}</div>)}\n </div>\n <div className=\"relative flex-1 overflow-hidden\">\n <pre ref={preRef} aria-hidden className=\"pointer-events-none absolute inset-0 m-0 overflow-hidden whitespace-pre px-2 py-2\" style={boxStyle}>\n <code className=\"hljs language-xml\" style={{ background: 'transparent', padding: 0 }} dangerouslySetInnerHTML={{ __html: `${highlighted}\\n` }} />\n </pre>\n <textarea\n ref={taRef}\n value={value}\n placeholder={placeholder}\n spellCheck={false}\n wrap=\"off\"\n onChange={(e) => onChange(e.target.value)}\n onScroll={onScroll}\n onKeyDown={onKeyDown}\n className=\"absolute inset-0 resize-none whitespace-pre bg-transparent px-2 py-2 text-transparent caret-foreground outline-none\"\n style={boxStyle}\n />\n </div>\n </div>\n );\n}\n","'use client';\n\n// Unlayer-style right rail. When nothing is selected it shows tabs — Content\n// (draggable tools), Rows (draggable column layouts), Settings (global) — and\n// when a block/row/column is selected it swaps to that element's properties\n// with a Back button. Portable tailwind + lucide only (no @/components/ui) so\n// the folder stays liftable into a standalone package.\n\nimport { useRef, useState, type ChangeEvent, type ReactNode } from 'react';\nimport {\n ChevronLeft, Code2, Heading, Image as ImageIcon, Menu as MenuIcon, Minus, MousePointerClick,\n MoveVertical, Plus, Share2, Trash2, Type,\n} from 'lucide-react';\n\nimport {\n type Block, type BlockAlign, type BlockType, type ButtonBlock, type Column, type DividerBlock,\n type EmailDesign, type EmailSettings, type HeadingBlock, type HtmlBlock, type ImageBlock,\n type LinkAction, type MenuBlock, type Row, type SocialBlock, type SpacerBlock, type TextBlock,\n EMAIL_FONT_STACKS, ROW_LAYOUTS,\n} from './types';\nimport { SOCIAL_NETWORKS, SOCIAL_SLUGS } from './compile';\nimport { CodeArea } from './CodeArea';\nimport { setDrag } from './dnd';\nimport type { BuilderLabels } from './labels';\n\nconst field = 'mb-3';\nconst lbl = 'mb-1 block text-xs font-medium text-muted-foreground';\nconst input = 'w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-sm outline-none focus:ring-2 focus:ring-ring';\n\nfunction Text({ label, value, onChange, placeholder }: { label: string; value: string; onChange: (v: string) => void; placeholder?: string }) {\n return (\n <div className={field}>\n <label className={lbl}>{label}</label>\n <input className={input} value={value} placeholder={placeholder} onChange={(e) => onChange(e.target.value)} />\n </div>\n );\n}\n\nfunction Num({ label, value, onChange, min = 0, max = 999 }: { label: string; value: number; onChange: (v: number) => void; min?: number; max?: number }) {\n return (\n <div className={field}>\n <label className={lbl}>{label}</label>\n <input type=\"number\" className={input} value={value} min={min} max={max} onChange={(e) => onChange(Math.max(min, Math.min(max, Number(e.target.value) || 0)))} />\n </div>\n );\n}\n\nfunction Color({ label, value, onChange }: { label: string; value: string; onChange: (v: string) => void }) {\n return (\n <div className={field}>\n <label className={lbl}>{label}</label>\n <div className=\"flex items-center gap-2\">\n <input type=\"color\" className=\"h-8 w-9 shrink-0 cursor-pointer rounded border border-input bg-background p-0.5\" value={value || '#ffffff'} onChange={(e) => onChange(e.target.value)} />\n <input className={input} value={value} placeholder=\"—\" onChange={(e) => onChange(e.target.value)} />\n </div>\n </div>\n );\n}\n\nfunction Select({ label, value, options, onChange }: { label: string; value: string; options: { label: string; value: string }[]; onChange: (v: string) => void }) {\n return (\n <div className={field}>\n <label className={lbl}>{label}</label>\n <select className={input} value={value} onChange={(e: ChangeEvent<HTMLSelectElement>) => onChange(e.target.value)}>\n {options.map((o) => <option key={o.value} value={o.value}>{o.label}</option>)}\n </select>\n </div>\n );\n}\n\nfunction Toggle({ label, value, onChange }: { label: string; value: boolean; onChange: (v: boolean) => void }) {\n return (\n <label className={`${field} flex cursor-pointer items-center justify-between`}>\n <span className={lbl.replace('mb-1 block', '')}>{label}</span>\n <input type=\"checkbox\" checked={value} onChange={(e) => onChange(e.target.checked)} className=\"h-4 w-4 accent-[var(--primary)]\" />\n </label>\n );\n}\n\nfunction AlignPicker({ label, value, onChange }: { label: string; value: BlockAlign; onChange: (v: BlockAlign) => void }) {\n const opts: BlockAlign[] = ['left', 'center', 'right'];\n return (\n <div className={field}>\n <label className={lbl}>{label}</label>\n <div className=\"inline-flex rounded-md border border-input p-0.5\">\n {opts.map((o) => (\n <button key={o} type=\"button\" onClick={() => onChange(o)} className={`rounded px-3 py-1 text-xs ${value === o ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:bg-muted'}`}>\n {o === 'left' ? '⬅' : o === 'center' ? '⬌' : '➡'}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nfunction ImageUpload({ labels, uploadImage, onDone }: { labels: BuilderLabels; uploadImage: (f: File) => Promise<string>; onDone: (url: string) => void }) {\n const ref = useRef<HTMLInputElement>(null);\n const [busy, setBusy] = useState(false);\n return (\n <div className={field}>\n <input ref={ref} type=\"file\" accept=\"image/*\" className=\"hidden\" onChange={async (e) => { const f = e.target.files?.[0]; if (!f) return; setBusy(true); try { onDone(await uploadImage(f)); } finally { setBusy(false); if (ref.current) ref.current.value = ''; } }} />\n <button type=\"button\" disabled={busy} onClick={() => ref.current?.click()} className=\"w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-sm hover:bg-muted disabled:opacity-60\">{busy ? labels.uploading : labels.uploadImage}</button>\n </div>\n );\n}\n\n// ── block editor ──────────────────────────────────────────────────────\n\n// Stacked item card — network/label select on top, full-width URL below. The\n// panel is only ~272px, so side-by-side left the URL unusably narrow.\nfunction ItemCard({ children, onRemove }: { children: ReactNode; onRemove: () => void }) {\n return (\n <div className=\"mb-2 rounded-md border border-border p-2\">\n <div className=\"flex items-start gap-1\">\n <div className=\"flex-1 space-y-1.5\">{children}</div>\n <button type=\"button\" className=\"shrink-0 rounded p-1 text-destructive hover:bg-muted\" onClick={onRemove}><Trash2 size={14} /></button>\n </div>\n </div>\n );\n}\n\nfunction SocialEditor({ block, labels, onChange }: { block: SocialBlock; labels: BuilderLabels; onChange: (b: Block) => void }) {\n const networks = Object.keys(SOCIAL_NETWORKS);\n const set = (items: SocialBlock['items']) => onChange({ ...block, items });\n return (\n <>\n <label className={lbl}>{labels.socialAdd}</label>\n <div className=\"mb-4 grid grid-cols-6 gap-1.5\">\n {SOCIAL_SLUGS.map((slug) => {\n const m = SOCIAL_NETWORKS[slug];\n return (\n <button\n key={slug} type=\"button\" title={m.label}\n onClick={() => set([...block.items, { network: slug, url: 'https://' }])}\n className=\"flex h-8 w-8 items-center justify-center rounded-full text-[9px] font-bold text-white transition-opacity hover:opacity-80\"\n style={{ background: m.bg }}\n >{m.mark}</button>\n );\n })}\n </div>\n <Select label={labels.iconStyle} value={block.iconStyle} options={[{ label: labels.styleCircle, value: 'circle' }, { label: labels.styleRounded, value: 'rounded' }, { label: labels.styleSquare, value: 'square' }]} onChange={(v) => onChange({ ...block, iconStyle: v as SocialBlock['iconStyle'] })} />\n <AlignPicker label={labels.align} value={block.align} onChange={(align) => onChange({ ...block, align })} />\n <Num label={labels.size} value={block.size} min={16} max={64} onChange={(size) => onChange({ ...block, size })} />\n <Num label={labels.iconSpacing} value={block.spacing} min={0} max={40} onChange={(spacing) => onChange({ ...block, spacing })} />\n <label className={lbl}>{labels.socialLinks}</label>\n {block.items.map((it, i) => (\n <ItemCard key={i} onRemove={() => set(block.items.filter((_, j) => j !== i))}>\n <select className={input} value={it.network} onChange={(e) => set(block.items.map((x, j) => (j === i ? { ...x, network: e.target.value } : x)))}>\n {networks.map((n) => <option key={n} value={n}>{SOCIAL_NETWORKS[n].label}</option>)}\n </select>\n <input className={input} value={it.url} placeholder=\"https://\" onChange={(e) => set(block.items.map((x, j) => (j === i ? { ...x, url: e.target.value } : x)))} />\n </ItemCard>\n ))}\n </>\n );\n}\n\nfunction MenuEditor({ block, labels, onChange }: { block: MenuBlock; labels: BuilderLabels; onChange: (b: Block) => void }) {\n const set = (items: MenuBlock['items']) => onChange({ ...block, items });\n return (\n <>\n <label className={lbl}>{labels.menuItems}</label>\n {block.items.map((it, i) => (\n <ItemCard key={i} onRemove={() => set(block.items.filter((_, j) => j !== i))}>\n <input className={input} value={it.label} placeholder={labels.buttonLabel} onChange={(e) => set(block.items.map((x, j) => (j === i ? { ...x, label: e.target.value } : x)))} />\n <input className={input} value={it.url} placeholder=\"https://\" onChange={(e) => set(block.items.map((x, j) => (j === i ? { ...x, url: e.target.value } : x)))} />\n </ItemCard>\n ))}\n <button type=\"button\" className=\"mb-3 flex items-center gap-1 text-xs text-primary hover:underline\" onClick={() => set([...block.items, { label: 'Enlace', url: 'https://' }])}><Plus size={13} />{labels.menuAdd}</button>\n <Select label={labels.layout} value={block.layout} options={[{ label: labels.horizontal, value: 'horizontal' }, { label: labels.vertical, value: 'vertical' }]} onChange={(v) => onChange({ ...block, layout: v as 'horizontal' | 'vertical' })} />\n <AlignPicker label={labels.align} value={block.align} onChange={(align) => onChange({ ...block, align })} />\n <Num label={labels.fontSize} value={block.fontSize} min={10} max={28} onChange={(fontSize) => onChange({ ...block, fontSize })} />\n <Color label={labels.textColor} value={block.color} onChange={(color) => onChange({ ...block, color })} />\n <Num label={labels.itemGap} value={block.gap} min={0} max={60} onChange={(gap) => onChange({ ...block, gap })} />\n </>\n );\n}\n\nfunction BlockEditor({ block, labels, uploadImage, onChange }: { block: Block; labels: BuilderLabels; uploadImage?: (f: File) => Promise<string>; onChange: (b: Block) => void }) {\n const patch = <B extends Block>(p: Partial<B>) => onChange({ ...block, ...p } as Block);\n switch (block.type) {\n case 'text': {\n const b = block as TextBlock;\n return (<>\n <p className=\"mb-3 text-xs text-muted-foreground\">{labels.textEditHint}</p>\n <AlignPicker label={labels.align} value={b.align} onChange={(align) => patch<TextBlock>({ align })} />\n <Num label={labels.fontSize} value={b.fontSize} min={10} max={48} onChange={(fontSize) => patch<TextBlock>({ fontSize })} />\n <Color label={labels.textColor} value={b.color} onChange={(color) => patch<TextBlock>({ color })} />\n <Num label={labels.lineHeight} value={b.lineHeight} min={1} max={3} onChange={(lineHeight) => patch<TextBlock>({ lineHeight })} />\n </>);\n }\n case 'heading': {\n const b = block as HeadingBlock;\n return (<>\n <p className=\"mb-3 text-xs text-muted-foreground\">{labels.textEditHint}</p>\n <Select label={labels.level} value={String(b.level)} options={[{ label: 'H1', value: '1' }, { label: 'H2', value: '2' }, { label: 'H3', value: '3' }]} onChange={(v) => patch<HeadingBlock>({ level: Number(v) as 1 | 2 | 3 })} />\n <AlignPicker label={labels.align} value={b.align} onChange={(align) => patch<HeadingBlock>({ align })} />\n <Color label={labels.textColor} value={b.color} onChange={(color) => patch<HeadingBlock>({ color })} />\n </>);\n }\n case 'button': {\n const b = block as ButtonBlock;\n return (<>\n <Text label={labels.buttonLabel} value={b.label} onChange={(label) => patch<ButtonBlock>({ label })} />\n <Text label={labels.buttonHref} value={b.href} placeholder=\"https://\" onChange={(href) => patch<ButtonBlock>({ href })} />\n <AlignPicker label={labels.align} value={b.align} onChange={(align) => patch<ButtonBlock>({ align })} />\n <Toggle label={labels.fullWidth} value={b.fullWidth} onChange={(fullWidth) => patch<ButtonBlock>({ fullWidth })} />\n <Color label={labels.buttonBg} value={b.background} onChange={(background) => patch<ButtonBlock>({ background })} />\n <Color label={labels.textColor} value={b.color} onChange={(color) => patch<ButtonBlock>({ color })} />\n <Num label={labels.radius} value={b.radius} min={0} max={40} onChange={(radius) => patch<ButtonBlock>({ radius })} />\n </>);\n }\n case 'image': {\n const b = block as ImageBlock;\n return (<>\n {uploadImage && <ImageUpload labels={labels} uploadImage={uploadImage} onDone={(src) => patch<ImageBlock>({ src })} />}\n <Text label={labels.imageUrl} value={b.src} placeholder=\"https://…\" onChange={(src) => patch<ImageBlock>({ src })} />\n <Text label={labels.imageAlt} value={b.alt} onChange={(alt) => patch<ImageBlock>({ alt })} />\n <AlignPicker label={labels.align} value={b.align} onChange={(align) => patch<ImageBlock>({ align })} />\n <Num label={labels.imageWidth} value={b.width} min={0} max={600} onChange={(width) => patch<ImageBlock>({ width })} />\n <p className=\"mb-3 text-xs text-muted-foreground\">{labels.imageWidthHint}</p>\n <div className=\"mb-2 border-t border-border pt-3 text-xs font-semibold text-muted-foreground\">{labels.action}</div>\n <Select\n label={labels.linkType} value={b.linkAction}\n options={[{ label: labels.openWebsite, value: 'url' }, { label: labels.sendEmail, value: 'email' }, { label: labels.callPhone, value: 'phone' }]}\n onChange={(v) => patch<ImageBlock>({ linkAction: v as LinkAction })}\n />\n <Text label={labels.linkValue} value={b.href} placeholder={b.linkAction === 'email' ? 'correo@dominio.cl' : b.linkAction === 'phone' ? '+56 9 …' : 'https://'} onChange={(href) => patch<ImageBlock>({ href })} />\n </>);\n }\n case 'divider': {\n const b = block as DividerBlock;\n return (<>\n <Color label={labels.color} value={b.color} onChange={(color) => patch<DividerBlock>({ color })} />\n <Num label={labels.thickness} value={b.thickness} min={1} max={12} onChange={(thickness) => patch<DividerBlock>({ thickness })} />\n </>);\n }\n case 'spacer': {\n const b = block as SpacerBlock;\n return <Num label={labels.height} value={b.height} min={4} max={160} onChange={(height) => patch<SpacerBlock>({ height })} />;\n }\n case 'social':\n return <SocialEditor block={block as SocialBlock} labels={labels} onChange={onChange} />;\n case 'menu':\n return <MenuEditor block={block as MenuBlock} labels={labels} onChange={onChange} />;\n case 'html': {\n const b = block as HtmlBlock;\n return (<>\n <label className={lbl}>{labels.htmlContent}</label>\n <CodeArea value={b.html} onChange={(html) => patch<HtmlBlock>({ html })} placeholder=\"<div>…</div>\" height={220} />\n <p className=\"mt-1 text-xs text-muted-foreground\">{labels.htmlHint}</p>\n </>);\n }\n default:\n return null;\n }\n}\n\n// ── palettes ──────────────────────────────────────────────────────────\n\nconst TOOLS: { type: BlockType; Icon: typeof Type }[] = [\n { type: 'heading', Icon: Heading },\n { type: 'text', Icon: Type },\n { type: 'button', Icon: MousePointerClick },\n { type: 'image', Icon: ImageIcon },\n { type: 'divider', Icon: Minus },\n { type: 'spacer', Icon: MoveVertical },\n { type: 'menu', Icon: MenuIcon },\n { type: 'social', Icon: Share2 },\n { type: 'html', Icon: Code2 },\n];\n\nfunction ContentPalette({ labels, onAppend, onDragState }: { labels: BuilderLabels; onAppend: (t: BlockType) => void; onDragState: (b: boolean) => void }) {\n return (\n <div className=\"grid grid-cols-2 gap-2\">\n {TOOLS.map(({ type, Icon }) => (\n <button\n key={type} type=\"button\" draggable\n onDragStart={(e) => { setDrag(e, { kind: 'new-block', blockType: type }); onDragState(true); }}\n onDragEnd={() => onDragState(false)}\n onClick={() => onAppend(type)}\n className=\"flex cursor-grab flex-col items-center gap-1.5 rounded-md border border-border bg-background px-2 py-3 text-[11px] text-muted-foreground transition-colors hover:border-primary/40 hover:bg-muted hover:text-foreground\"\n >\n <Icon size={17} />{labels.blockNames[type]}\n </button>\n ))}\n </div>\n );\n}\n\n// Column-layout thumbnails. Draggable (→ new row) in the Rows tab; click-only\n// (→ re-split the selected row) in the Row inspector.\nfunction LayoutGrid({ onPick, onDragState }: { onPick: (w: number[]) => void; onDragState?: (b: boolean) => void }) {\n return (\n <div className=\"grid grid-cols-3 gap-1.5\">\n {ROW_LAYOUTS.map((layout) => (\n <button\n key={layout.key} type=\"button\"\n draggable={Boolean(onDragState)}\n onDragStart={onDragState ? (e) => { setDrag(e, { kind: 'new-row', weights: layout.weights }); onDragState(true); } : undefined}\n onDragEnd={onDragState ? () => onDragState(false) : undefined}\n onClick={() => onPick(layout.weights)}\n className={`flex items-stretch gap-0.5 rounded-md border border-border bg-background p-1.5 transition-colors hover:border-primary/40 hover:bg-muted ${onDragState ? 'cursor-grab' : 'cursor-pointer'}`}\n style={{ height: 34 }}\n >\n {layout.weights.map((w, i) => <span key={i} className=\"rounded-sm bg-muted-foreground/30\" style={{ flex: w }} />)}\n </button>\n ))}\n </div>\n );\n}\n\nfunction RowsPalette({ onAppend, onDragState }: { onAppend: (w: number[]) => void; onDragState: (b: boolean) => void }) {\n return <LayoutGrid onPick={onAppend} onDragState={onDragState} />;\n}\n\nfunction RowEditor({ row, labels, uploadImage, onRowChange, onColumnChange, onRowLayout }: {\n row: Row; labels: BuilderLabels; uploadImage?: (f: File) => Promise<string>;\n onRowChange: (r: Row) => void; onColumnChange: (c: Column) => void; onRowLayout: (rowId: string, w: number[]) => void;\n}) {\n const [colIdx, setColIdx] = useState(0);\n const active = row.columns[Math.min(colIdx, row.columns.length - 1)];\n return (\n <>\n <label className={lbl}>{labels.columns}</label>\n <div className=\"mb-4\"><LayoutGrid onPick={(w) => onRowLayout(row.id, w)} /></div>\n <Color label={labels.rowBg} value={row.background} onChange={(background) => onRowChange({ ...row, background })} />\n <Color label={labels.contentBg} value={row.contentBackground} onChange={(contentBackground) => onRowChange({ ...row, contentBackground })} />\n <Num label={labels.paddingY} value={row.paddingY} min={0} max={80} onChange={(paddingY) => onRowChange({ ...row, paddingY })} />\n <Num label={labels.blockGap} value={row.gap} min={0} max={48} onChange={(gap) => onRowChange({ ...row, gap })} />\n\n <div className=\"mb-2 mt-1 border-t border-border pt-3 text-xs font-semibold text-muted-foreground\">{labels.backgroundImage}</div>\n {uploadImage && <ImageUpload labels={labels} uploadImage={uploadImage} onDone={(url) => onRowChange({ ...row, backgroundImage: url })} />}\n <Text label={labels.imageUrl} value={row.backgroundImage} placeholder=\"https://…\" onChange={(backgroundImage) => onRowChange({ ...row, backgroundImage })} />\n\n {row.columns.length > 1 && (\n <>\n <div className=\"mb-2 mt-1 border-t border-border pt-3 text-xs font-semibold text-muted-foreground\">{labels.columnSettings}</div>\n <div className=\"mb-3 flex gap-1\">\n {row.columns.map((c, i) => (\n <button key={c.id} type=\"button\" onClick={() => setColIdx(i)} className={`rounded px-2.5 py-1 text-xs ${i === colIdx ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground hover:text-foreground'}`}>{i + 1}</button>\n ))}\n </div>\n <Color label={labels.columnBg} value={active.background} onChange={(background) => onColumnChange({ ...active, background })} />\n <Num label={labels.paddingX} value={active.paddingX} min={0} max={48} onChange={(paddingX) => onColumnChange({ ...active, paddingX })} />\n <Num label={labels.paddingY} value={active.paddingY} min={0} max={48} onChange={(paddingY) => onColumnChange({ ...active, paddingY })} />\n </>\n )}\n </>\n );\n}\n\nfunction SettingsPanel({ settings, labels, onChange }: { settings: EmailSettings; labels: BuilderLabels; onChange: (s: EmailSettings) => void }) {\n return (<>\n <Color label={labels.pageBg} value={settings.backgroundColor} onChange={(backgroundColor) => onChange({ ...settings, backgroundColor })} />\n <Num label={labels.contentWidth} value={settings.contentWidth} min={480} max={800} onChange={(contentWidth) => onChange({ ...settings, contentWidth })} />\n <Select label={labels.font} value={settings.fontFamily} options={EMAIL_FONT_STACKS} onChange={(fontFamily) => onChange({ ...settings, fontFamily })} />\n <Color label={labels.textColor} value={settings.textColor} onChange={(textColor) => onChange({ ...settings, textColor })} />\n <Color label={labels.linkColor} value={settings.linkColor} onChange={(linkColor) => onChange({ ...settings, linkColor })} />\n <div className={field}>\n <label className={lbl}>{labels.preheader}</label>\n <input className={input} value={settings.preheader} onChange={(e) => onChange({ ...settings, preheader: e.target.value })} />\n <p className=\"mt-1 text-xs text-muted-foreground\">{labels.preheaderHint}</p>\n </div>\n </>);\n}\n\n// ── panel ─────────────────────────────────────────────────────────────\n\nexport interface RightPanelProps {\n design: EmailDesign;\n labels: BuilderLabels;\n uploadImage?: (f: File) => Promise<string>;\n selectedBlockId: string | null;\n selectedRowId: string | null;\n selectedColumnId: string | null;\n onBlockChange: (b: Block) => void;\n onRowChange: (r: Row) => void;\n onColumnChange: (c: Column) => void;\n onRowLayout: (rowId: string, weights: number[]) => void;\n onSettingsChange: (s: EmailSettings) => void;\n onAppendBlock: (t: BlockType) => void;\n onAppendRow: (w: number[]) => void;\n onClearSelection: () => void;\n onDragStateChange: (b: boolean) => void;\n}\n\nexport function RightPanel(props: RightPanelProps) {\n const { design, labels } = props;\n const [tab, setTab] = useState<'content' | 'rows' | 'settings'>('content');\n\n const block = props.selectedBlockId ? design.rows.flatMap((r) => r.columns.flatMap((c) => c.blocks)).find((b) => b.id === props.selectedBlockId) ?? null : null;\n const column = !block && props.selectedColumnId ? design.rows.flatMap((r) => r.columns).find((c) => c.id === props.selectedColumnId) ?? null : null;\n const row = !block && !column && props.selectedRowId ? design.rows.find((r) => r.id === props.selectedRowId) ?? null : null;\n const selection = block ?? column ?? row;\n\n let title = '';\n let body: ReactNode = null;\n if (block) {\n title = labels.blockNames[block.type];\n body = (<>\n <BlockEditor block={block} labels={labels} uploadImage={props.uploadImage} onChange={props.onBlockChange} />\n <div className=\"mt-3 border-t border-border pt-3\">\n <Num label={labels.containerPadding} value={block.padding ?? 0} min={0} max={60} onChange={(padding) => props.onBlockChange({ ...block, padding })} />\n </div>\n </>);\n }\n else if (column) {\n title = labels.columnSettings;\n body = (<>\n <Color label={labels.columnBg} value={column.background} onChange={(background) => props.onColumnChange({ ...column, background })} />\n <Num label={labels.paddingX} value={column.paddingX} min={0} max={48} onChange={(paddingX) => props.onColumnChange({ ...column, paddingX })} />\n <Num label={labels.paddingY} value={column.paddingY} min={0} max={48} onChange={(paddingY) => props.onColumnChange({ ...column, paddingY })} />\n </>);\n } else if (row) {\n title = labels.rowSettings;\n body = <RowEditor row={row} labels={labels} uploadImage={props.uploadImage} onRowChange={props.onRowChange} onColumnChange={props.onColumnChange} onRowLayout={props.onRowLayout} />;\n }\n\n return (\n <div className=\"flex w-72 shrink-0 flex-col overflow-hidden border-l border-border bg-card\">\n {selection ? (\n <>\n <button type=\"button\" onClick={props.onClearSelection} className=\"flex items-center gap-1 border-b border-border px-3 py-2.5 text-sm font-medium hover:bg-muted\">\n <ChevronLeft size={15} /> {title}\n </button>\n <div className=\"flex-1 overflow-y-auto p-4\">{body}</div>\n </>\n ) : (\n <>\n <div className=\"flex border-b border-border\">\n {(['content', 'rows', 'settings'] as const).map((t) => (\n <button key={t} type=\"button\" onClick={() => setTab(t)} className={`flex-1 border-b-2 py-2.5 text-xs font-medium ${tab === t ? 'border-primary text-foreground' : 'border-transparent text-muted-foreground hover:text-foreground'}`}>\n {t === 'content' ? labels.tabContent : t === 'rows' ? labels.tabRows : labels.tabSettings}\n </button>\n ))}\n </div>\n <div className=\"flex-1 overflow-y-auto p-4\">\n {tab === 'content' && <ContentPalette labels={labels} onAppend={props.onAppendBlock} onDragState={props.onDragStateChange} />}\n {tab === 'rows' && <RowsPalette onAppend={props.onAppendRow} onDragState={props.onDragStateChange} />}\n {tab === 'settings' && <SettingsPanel settings={design.settings} labels={labels} onChange={props.onSettingsChange} />}\n </div>\n </>\n )}\n </div>\n );\n}\n","// All human-facing strings the builder shows, injected by the consumer. The\n// builder never imports vitrina's i18n — a future @vitrina/email-builder\n// package ships these English defaults and any host overrides them via the\n// `labels` prop (vitrina passes Spanish from its own locale files).\n\nimport type { BlockType } from './types';\n\nexport interface BuilderLabels {\n // panel tabs + structure\n tabContent: string;\n tabRows: string;\n tabSettings: string;\n blockNames: Record<BlockType, string>;\n emailSettings: string;\n rowSettings: string;\n columnSettings: string;\n columns: string;\n back: string;\n // actions\n duplicate: string;\n remove: string;\n moveUp: string;\n moveDown: string;\n addRow: string;\n empty: string;\n dropRowHere: string;\n // top bar\n undo: string;\n redo: string;\n preview: string;\n desktop: string;\n mobile: string;\n edit: string;\n // rich text toolbar\n bold: string;\n italic: string;\n underline: string;\n strike: string;\n link: string;\n linkUrl: string;\n bulletList: string;\n numberList: string;\n clearFormat: string;\n insertField: string;\n // block props\n align: string;\n fontSize: string;\n textColor: string;\n lineHeight: string;\n level: string;\n buttonLabel: string;\n buttonHref: string;\n buttonBg: string;\n radius: string;\n fullWidth: string;\n imageUrl: string;\n imageAlt: string;\n imageHref: string;\n imageWidth: string;\n imageWidthHint: string;\n uploadImage: string;\n uploading: string;\n dropImage: string;\n color: string;\n thickness: string;\n height: string;\n size: string;\n textEditHint: string;\n socialLinks: string;\n socialAdd: string;\n socialNetwork: string;\n socialUrl: string;\n iconSpacing: string;\n htmlContent: string;\n htmlHint: string;\n menuItems: string;\n menuAdd: string;\n layout: string;\n horizontal: string;\n vertical: string;\n itemGap: string;\n action: string;\n linkType: string;\n openWebsite: string;\n sendEmail: string;\n callPhone: string;\n linkValue: string;\n // row + column props\n rowBg: string;\n contentBg: string;\n backgroundImage: string;\n paddingY: string;\n paddingX: string;\n blockGap: string;\n columnBg: string;\n containerPadding: string;\n iconStyle: string;\n styleCircle: string;\n styleRounded: string;\n styleSquare: string;\n // global props\n pageBg: string;\n contentWidth: string;\n font: string;\n linkColor: string;\n preheader: string;\n preheaderHint: string;\n}\n\nexport const DEFAULT_LABELS: BuilderLabels = {\n tabContent: 'Content',\n tabRows: 'Rows',\n tabSettings: 'Settings',\n blockNames: { text: 'Text', heading: 'Heading', button: 'Button', image: 'Image', divider: 'Divider', spacer: 'Spacer', social: 'Social', html: 'HTML', menu: 'Menu' },\n emailSettings: 'Email settings',\n rowSettings: 'Row',\n columnSettings: 'Column',\n columns: 'Columns',\n back: 'Back',\n duplicate: 'Duplicate',\n remove: 'Remove',\n moveUp: 'Move up',\n moveDown: 'Move down',\n addRow: 'Add row',\n empty: 'Drag a block here',\n dropRowHere: 'Drop a row here',\n undo: 'Undo',\n redo: 'Redo',\n preview: 'Preview',\n desktop: 'Desktop',\n mobile: 'Mobile',\n edit: 'Edit',\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strike: 'Strikethrough',\n link: 'Link',\n linkUrl: 'Paste a URL',\n bulletList: 'Bulleted list',\n numberList: 'Numbered list',\n clearFormat: 'Clear formatting',\n insertField: 'Field',\n align: 'Alignment',\n fontSize: 'Font size',\n textColor: 'Text color',\n lineHeight: 'Line height',\n level: 'Level',\n buttonLabel: 'Label',\n buttonHref: 'Link',\n buttonBg: 'Background',\n radius: 'Corner radius',\n fullWidth: 'Full width',\n imageUrl: 'Image URL',\n imageAlt: 'Alt text',\n imageHref: 'Link (optional)',\n imageWidth: 'Width (px)',\n imageWidthHint: '0 = full column width',\n uploadImage: 'Upload image',\n uploading: 'Uploading…',\n dropImage: 'Drop an image or click to upload',\n color: 'Color',\n thickness: 'Thickness',\n height: 'Height',\n size: 'Size',\n textEditHint: 'Click the text on the canvas to edit it.',\n socialLinks: 'Networks',\n socialAdd: 'Add icons',\n socialNetwork: 'Network',\n socialUrl: 'URL',\n iconSpacing: 'Icon spacing',\n htmlContent: 'HTML',\n htmlHint: 'Raw HTML — scripts are stripped.',\n menuItems: 'Menu items',\n menuAdd: 'Add item',\n layout: 'Layout',\n horizontal: 'Horizontal',\n vertical: 'Vertical',\n itemGap: 'Space between items',\n action: 'Action',\n linkType: 'Link type',\n openWebsite: 'Open website',\n sendEmail: 'Send email',\n callPhone: 'Call phone',\n linkValue: 'Value',\n rowBg: 'Background',\n contentBg: 'Content background',\n backgroundImage: 'Background image',\n paddingY: 'Vertical padding',\n paddingX: 'Horizontal padding',\n blockGap: 'Space between blocks',\n columnBg: 'Background',\n containerPadding: 'Container padding',\n iconStyle: 'Icon shape',\n styleCircle: 'Circle',\n styleRounded: 'Rounded',\n styleSquare: 'Square',\n pageBg: 'Page background',\n contentWidth: 'Content width',\n font: 'Font',\n linkColor: 'Link color',\n preheader: 'Preheader',\n preheaderHint: 'Preview line shown after the subject in the inbox.',\n};\n","'use client';\n\n// Public entry point: <EmailBuilder value onChange />. Fully controlled — the\n// host owns the EmailDesign; every edit calls onChange with the next design.\n// Selection, drag, history and preview are internal. Layout: top bar\n// (undo/redo/preview) over canvas + tabbed right panel. No vitrina imports\n// beyond lucide (portable) + tailwind, so the folder lifts into a package\n// cleanly; strings arrive via `labels`.\n\nimport { useState, type KeyboardEvent } from 'react';\nimport { Eye, Monitor, Redo2, Smartphone, Undo2, X } from 'lucide-react';\n\nimport {\n type Block, type BlockType, type Column, type EmailDesign, type EmailSettings, type Row,\n makeBlock, makeRow, relayoutRow, uid,\n} from './types';\nimport { Canvas, type BlockAction, type RowAction } from './Canvas';\nimport { RightPanel } from './RightPanel';\nimport { compileDesign, previewFill } from './compile';\nimport { DEFAULT_LABELS, type BuilderLabels } from './labels';\nimport type { DragData } from './dnd';\n\n// ── pure design transforms ────────────────────────────────────────────\n\nfunction mapColumns(design: EmailDesign, colId: string, fn: (blocks: Block[]) => Block[]): EmailDesign {\n return { ...design, rows: design.rows.map((r) => ({ ...r, columns: r.columns.map((c) => (c.id === colId ? { ...c, blocks: fn(c.blocks) } : c)) })) };\n}\n\nfunction locateBlock(design: EmailDesign, blockId: string): { colId: string; index: number; block: Block } | null {\n for (const r of design.rows) {\n for (const c of r.columns) {\n const index = c.blocks.findIndex((b) => b.id === blockId);\n if (index >= 0) return { colId: c.id, index, block: c.blocks[index] };\n }\n }\n return null;\n}\n\nconst cloneBlock = (b: Block): Block => ({ ...b, id: uid() });\nconst cloneColumn = (c: Column): Column => ({ ...c, id: uid(), blocks: c.blocks.map(cloneBlock) });\nconst cloneRow = (r: Row): Row => ({ ...r, id: uid(), columns: r.columns.map(cloneColumn) });\n\n// ── component ─────────────────────────────────────────────────────────\n\nexport interface EmailBuilderProps {\n value: EmailDesign;\n onChange: (design: EmailDesign) => void;\n labels?: Partial<BuilderLabels>;\n /** Host-provided uploader; without it the image block is URL-only. */\n uploadImage?: (file: File) => Promise<string>;\n /** Absolute base URL for hosted social icons (<base>/<slug>.png). Omit to\n * use the built-in colored-chip fallback. */\n socialIconBase?: string;\n height?: number | string;\n}\n\nexport function EmailBuilder({ value, onChange, labels: labelOverrides, uploadImage, socialIconBase, height = 640 }: EmailBuilderProps) {\n const labels: BuilderLabels = { ...DEFAULT_LABELS, ...labelOverrides, blockNames: { ...DEFAULT_LABELS.blockNames, ...labelOverrides?.blockNames } };\n const [selectedBlockId, setSelectedBlockId] = useState<string | null>(null);\n const [selectedRowId, setSelectedRowId] = useState<string | null>(null);\n const [selectedColumnId, setSelectedColumnId] = useState<string | null>(null);\n const [dragging, setDragging] = useState(false);\n const [preview, setPreview] = useState<null | 'desktop' | 'mobile'>(null);\n const [past, setPast] = useState<EmailDesign[]>([]);\n const [future, setFuture] = useState<EmailDesign[]>([]);\n\n // Every mutation flows through commit() so undo/redo has a history. Cap at 50.\n const commit = (next: EmailDesign) => { setPast((p) => [...p, value].slice(-50)); setFuture([]); onChange(next); };\n const undo = () => { if (!past.length) return; const prev = past[past.length - 1]; setPast((p) => p.slice(0, -1)); setFuture((f) => [value, ...f]); onChange(prev); };\n const redo = () => { if (!future.length) return; const nxt = future[0]; setFuture((f) => f.slice(1)); setPast((p) => [...p, value]); onChange(nxt); };\n\n const selectBlock = (blockId: string, rowId: string) => { setSelectedBlockId(blockId); setSelectedRowId(rowId); setSelectedColumnId(null); };\n const selectRow = (rowId: string) => { setSelectedBlockId(null); setSelectedColumnId(null); setSelectedRowId(rowId); };\n const selectColumn = (colId: string, rowId: string) => { setSelectedBlockId(null); setSelectedColumnId(colId); setSelectedRowId(rowId); };\n const selectNone = () => { setSelectedBlockId(null); setSelectedRowId(null); setSelectedColumnId(null); };\n\n const dropInColumn = (colId: string, index: number, data: DragData) => {\n if (data.kind === 'new-block') {\n const block = makeBlock(data.blockType);\n commit(mapColumns(value, colId, (bs) => [...bs.slice(0, index), block, ...bs.slice(index)]));\n const row = value.rows.find((r) => r.columns.some((c) => c.id === colId));\n selectBlock(block.id, row?.id ?? '');\n return;\n }\n if (data.kind !== 'move-block') return;\n const found = locateBlock(value, data.blockId);\n if (!found) return;\n let idx = index;\n if (found.colId === colId && found.index < index) idx -= 1;\n const removed = mapColumns(value, found.colId, (bs) => bs.filter((b) => b.id !== data.blockId));\n commit(mapColumns(removed, colId, (bs) => [...bs.slice(0, idx), found.block, ...bs.slice(idx)]));\n };\n\n const dropRow = (index: number, data: DragData) => {\n if (data.kind === 'new-row') {\n const row = makeRow(data.weights);\n const rows = [...value.rows.slice(0, index), row, ...value.rows.slice(index)];\n commit({ ...value, rows });\n selectRow(row.id);\n return;\n }\n if (data.kind !== 'move-row') return;\n const from = value.rows.findIndex((r) => r.id === data.rowId);\n if (from < 0) return;\n let to = index;\n if (from < index) to -= 1;\n const rows = [...value.rows];\n const [moved] = rows.splice(from, 1);\n rows.splice(to, 0, moved);\n commit({ ...value, rows });\n };\n\n const blockAction = (blockId: string, action: BlockAction) => {\n const found = locateBlock(value, blockId);\n if (!found) return;\n if (action === 'remove') {\n commit(mapColumns(value, found.colId, (bs) => bs.filter((b) => b.id !== blockId)));\n if (selectedBlockId === blockId) setSelectedBlockId(null);\n return;\n }\n commit(mapColumns(value, found.colId, (bs) => {\n const i = bs.findIndex((b) => b.id === blockId);\n const next = [...bs];\n if (action === 'duplicate') next.splice(i + 1, 0, cloneBlock(bs[i]));\n else if (action === 'up' && i > 0) { [next[i - 1], next[i]] = [next[i], next[i - 1]]; }\n else if (action === 'down' && i < bs.length - 1) { [next[i + 1], next[i]] = [next[i], next[i + 1]]; }\n return next;\n }));\n };\n\n const changeBlock = (block: Block) => {\n const found = locateBlock(value, block.id);\n if (found) commit(mapColumns(value, found.colId, (bs) => bs.map((b) => (b.id === block.id ? block : b))));\n };\n\n const changeRow = (row: Row) => commit({ ...value, rows: value.rows.map((r) => (r.id === row.id ? row : r)) });\n const changeColumn = (col: Column) => commit({ ...value, rows: value.rows.map((r) => ({ ...r, columns: r.columns.map((c) => (c.id === col.id ? col : c)) })) });\n const changeRowLayout = (rowId: string, weights: number[]) => commit({ ...value, rows: value.rows.map((r) => (r.id === rowId ? relayoutRow(r, weights) : r)) });\n const changeSettings = (settings: EmailSettings) => commit({ ...value, settings });\n\n const rowAction = (rowId: string, action: RowAction) => {\n const i = value.rows.findIndex((r) => r.id === rowId);\n if (i < 0) return;\n const next = [...value.rows];\n if (action === 'remove') { next.splice(i, 1); if (selectedRowId === rowId) selectNone(); }\n else if (action === 'duplicate') next.splice(i + 1, 0, cloneRow(value.rows[i]));\n commit({ ...value, rows: next });\n };\n\n const appendBlock = (type: BlockType) => {\n const block = makeBlock(type);\n const colId = selectedColumnId\n ?? value.rows.find((r) => r.id === selectedRowId)?.columns[0].id\n ?? value.rows[value.rows.length - 1]?.columns[0].id;\n if (!colId) { // empty design → seed a row\n const row = makeRow([1]);\n row.columns[0].blocks = [block];\n commit({ ...value, rows: [row] });\n selectBlock(block.id, row.id);\n return;\n }\n commit(mapColumns(value, colId, (bs) => [...bs, block]));\n const row = value.rows.find((r) => r.columns.some((c) => c.id === colId));\n selectBlock(block.id, row?.id ?? '');\n };\n\n const appendRow = (weights: number[]) => {\n const row = makeRow(weights);\n commit({ ...value, rows: [...value.rows, row] });\n selectRow(row.id);\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n const el = document.activeElement as HTMLElement | null;\n if (el?.isContentEditable || el?.tagName === 'INPUT' || el?.tagName === 'TEXTAREA') return; // let inputs own their undo\n const mod = e.metaKey || e.ctrlKey;\n if (mod && e.key.toLowerCase() === 'z') { e.preventDefault(); if (e.shiftKey) redo(); else undo(); }\n };\n\n const previewHtml = `<!doctype html><html><body style=\"margin:0;background:${value.settings.backgroundColor};\">${previewFill(compileDesign(value, { socialIconBase }))}</body></html>`;\n const iconBtn = 'rounded-md p-1.5 text-muted-foreground enabled:hover:bg-muted enabled:hover:text-foreground disabled:opacity-40';\n\n return (\n <div className=\"relative flex flex-col overflow-hidden rounded-lg border border-border bg-background\" style={{ height }} onKeyDown={onKeyDown} tabIndex={-1}>\n <div className=\"flex items-center justify-between border-b border-border bg-card px-3 py-1.5\">\n <div className=\"flex items-center gap-0.5\">\n <button type=\"button\" title={labels.undo} className={iconBtn} disabled={!past.length} onClick={undo}><Undo2 size={16} /></button>\n <button type=\"button\" title={labels.redo} className={iconBtn} disabled={!future.length} onClick={redo}><Redo2 size={16} /></button>\n </div>\n <button type=\"button\" onClick={() => setPreview('desktop')} className=\"flex items-center gap-1.5 rounded-md border border-border px-2.5 py-1 text-xs font-medium hover:bg-muted\">\n <Eye size={14} /> {labels.preview}\n </button>\n </div>\n\n <div className=\"flex flex-1 overflow-hidden\">\n <Canvas\n design={value}\n labels={labels}\n selectedBlockId={selectedBlockId}\n selectedRowId={selectedRowId}\n selectedColumnId={selectedColumnId}\n dragging={dragging}\n socialIconBase={socialIconBase}\n uploadImage={uploadImage}\n onSelectBlock={selectBlock}\n onSelectRow={selectRow}\n onSelectColumn={selectColumn}\n onSelectNone={selectNone}\n onBlockChange={changeBlock}\n onBlockAction={blockAction}\n onRowAction={rowAction}\n onDragStateChange={setDragging}\n onDropInColumn={dropInColumn}\n onDropRow={dropRow}\n />\n <RightPanel\n design={value}\n labels={labels}\n uploadImage={uploadImage}\n selectedBlockId={selectedBlockId}\n selectedRowId={selectedRowId}\n selectedColumnId={selectedColumnId}\n onBlockChange={changeBlock}\n onRowChange={changeRow}\n onColumnChange={changeColumn}\n onRowLayout={changeRowLayout}\n onSettingsChange={changeSettings}\n onAppendBlock={appendBlock}\n onAppendRow={appendRow}\n onClearSelection={selectNone}\n onDragStateChange={setDragging}\n />\n </div>\n\n {preview && (\n <div className=\"absolute inset-0 z-50 flex flex-col bg-black/60\" onClick={() => setPreview(null)}>\n <div className=\"flex items-center justify-center gap-2 py-3\" onClick={(e) => e.stopPropagation()}>\n <div className=\"inline-flex rounded-md bg-card p-0.5\">\n <button type=\"button\" onClick={() => setPreview('desktop')} className={`flex items-center gap-1 rounded px-3 py-1 text-xs ${preview === 'desktop' ? 'bg-primary text-primary-foreground' : 'text-muted-foreground'}`}><Monitor size={13} /> {labels.desktop}</button>\n <button type=\"button\" onClick={() => setPreview('mobile')} className={`flex items-center gap-1 rounded px-3 py-1 text-xs ${preview === 'mobile' ? 'bg-primary text-primary-foreground' : 'text-muted-foreground'}`}><Smartphone size={13} /> {labels.mobile}</button>\n </div>\n <button type=\"button\" onClick={() => setPreview(null)} className=\"rounded-md bg-card p-1.5 text-muted-foreground hover:text-foreground\"><X size={16} /></button>\n </div>\n <div className=\"flex flex-1 justify-center overflow-y-auto p-4\" onClick={(e) => e.stopPropagation()}>\n <iframe\n title={labels.preview}\n sandbox=\"\"\n srcDoc={previewHtml}\n className=\"h-full rounded-lg border-0 bg-white shadow-xl\"\n style={{ width: preview === 'mobile' ? 375 : value.settings.contentWidth + 40 }}\n />\n </div>\n </div>\n )}\n </div>\n );\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vitrina/email-builder",
|
|
3
|
+
"version": "0.1.4",
|
|
4
|
+
"description": "Unlayer-style drag-and-drop email builder for React. Rows/columns/blocks (text, heading, button, image, divider, spacer, social, menu, HTML), inline rich-text, undo/redo, desktop/mobile preview. Emits email-safe, dark-mode-proof table HTML. Framework-agnostic, Tailwind + shadcn friendly, i18n via injected labels.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "VitrinaDev",
|
|
7
|
+
"homepage": "https://github.com/VitrinaDev/email-builder#readme",
|
|
8
|
+
"bugs": "https://github.com/VitrinaDev/email-builder/issues",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/VitrinaDev/email-builder.git"
|
|
12
|
+
},
|
|
13
|
+
"keywords": [
|
|
14
|
+
"email",
|
|
15
|
+
"email-builder",
|
|
16
|
+
"email-editor",
|
|
17
|
+
"email-template",
|
|
18
|
+
"drag-and-drop",
|
|
19
|
+
"react",
|
|
20
|
+
"react-email",
|
|
21
|
+
"unlayer",
|
|
22
|
+
"mjml",
|
|
23
|
+
"newsletter",
|
|
24
|
+
"html-email",
|
|
25
|
+
"tailwind",
|
|
26
|
+
"wysiwyg"
|
|
27
|
+
],
|
|
28
|
+
"type": "module",
|
|
29
|
+
"packageManager": "pnpm@10.24.0",
|
|
30
|
+
"main": "./dist/index.js",
|
|
31
|
+
"module": "./dist/index.js",
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
|
+
"exports": {
|
|
34
|
+
".": {
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"import": "./dist/index.js",
|
|
37
|
+
"default": "./dist/index.js"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist"
|
|
42
|
+
],
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsup && pnpm run build:use-client",
|
|
45
|
+
"build:use-client": "node scripts/add-use-client.mjs",
|
|
46
|
+
"dev": "tsup --watch",
|
|
47
|
+
"typecheck": "tsc --noEmit",
|
|
48
|
+
"lint": "eslint src",
|
|
49
|
+
"test": "vitest run",
|
|
50
|
+
"test:watch": "vitest",
|
|
51
|
+
"prepublishOnly": "pnpm run test && pnpm run build"
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"highlight.js": "^11.11.1",
|
|
55
|
+
"lucide-react": "^1.16.0"
|
|
56
|
+
},
|
|
57
|
+
"peerDependencies": {
|
|
58
|
+
"react": ">=19",
|
|
59
|
+
"react-dom": ">=19"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@eslint/js": "^9.39.4",
|
|
63
|
+
"@types/react": "^19",
|
|
64
|
+
"@types/react-dom": "^19",
|
|
65
|
+
"eslint": "^9.39.4",
|
|
66
|
+
"jsdom": "^25.0.0",
|
|
67
|
+
"react": "^19",
|
|
68
|
+
"react-dom": "^19",
|
|
69
|
+
"tsup": "^8.5.0",
|
|
70
|
+
"typescript": "^5.7.0",
|
|
71
|
+
"typescript-eslint": "^8.20.0",
|
|
72
|
+
"vitest": "^3.0.0"
|
|
73
|
+
},
|
|
74
|
+
"publishConfig": {
|
|
75
|
+
"access": "public"
|
|
76
|
+
},
|
|
77
|
+
"engines": {
|
|
78
|
+
"node": ">=20"
|
|
79
|
+
}
|
|
80
|
+
}
|