@mieweb/ui 0.11.0-dev.47 → 0.11.0-dev.48
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/agent/skills/mieweb-ui-tailwind4/SKILL.md +1 -0
- package/dist/{EncounterMdyEditor-XA7HLLVD.cjs → EncounterMdyEditor-KW52MD2Q.cjs} +6 -6
- package/dist/{EncounterMdyEditor-XA7HLLVD.cjs.map → EncounterMdyEditor-KW52MD2Q.cjs.map} +1 -1
- package/dist/{EncounterMdyEditor-ATNWXQ72.js → EncounterMdyEditor-OYO3H5GJ.js} +3 -3
- package/dist/{EncounterMdyEditor-ATNWXQ72.js.map → EncounterMdyEditor-OYO3H5GJ.js.map} +1 -1
- package/dist/{chunk-F6ZTKNAL.cjs → chunk-3XR7BPKD.cjs} +4 -4
- package/dist/{chunk-F6ZTKNAL.cjs.map → chunk-3XR7BPKD.cjs.map} +1 -1
- package/dist/{chunk-ULKDK6W6.js → chunk-3XVDSLDT.js} +4 -4
- package/dist/chunk-3XVDSLDT.js.map +1 -0
- package/dist/{chunk-WI35L5TR.js → chunk-DHCSY2JY.js} +3 -3
- package/dist/{chunk-WI35L5TR.js.map → chunk-DHCSY2JY.js.map} +1 -1
- package/dist/{chunk-IYXZ25E6.js → chunk-ETAYMSCW.js} +4 -4
- package/dist/{chunk-IYXZ25E6.js.map → chunk-ETAYMSCW.js.map} +1 -1
- package/dist/{chunk-LE3HZ7MM.cjs → chunk-LVUSCBG4.cjs} +11 -11
- package/dist/{chunk-LE3HZ7MM.cjs.map → chunk-LVUSCBG4.cjs.map} +1 -1
- package/dist/{chunk-BUM72SAI.cjs → chunk-LWAXTZGG.cjs} +7 -7
- package/dist/{chunk-BUM72SAI.cjs.map → chunk-LWAXTZGG.cjs.map} +1 -1
- package/dist/{chunk-QJ75ZMCG.js → chunk-R4DQRXZY.js} +3 -3
- package/dist/{chunk-QJ75ZMCG.js.map → chunk-R4DQRXZY.js.map} +1 -1
- package/dist/{chunk-5O54NWAL.cjs → chunk-TA5K5546.cjs} +4 -4
- package/dist/chunk-TA5K5546.cjs.map +1 -0
- package/dist/{chunk-2D6TFO2Y.js → chunk-XJ37SWVD.js} +3 -3
- package/dist/{chunk-2D6TFO2Y.js.map → chunk-XJ37SWVD.js.map} +1 -1
- package/dist/{chunk-6I2G26AX.cjs → chunk-YKL66TCM.cjs} +4 -4
- package/dist/{chunk-6I2G26AX.cjs.map → chunk-YKL66TCM.cjs.map} +1 -1
- package/dist/collabKit-652AGQW6.js +99 -0
- package/dist/collabKit-652AGQW6.js.map +1 -0
- package/dist/collabKit-DVSTUBN4.cjs +102 -0
- package/dist/collabKit-DVSTUBN4.cjs.map +1 -0
- package/dist/components/EmailEditor/index.cjs +13 -13
- package/dist/components/EmailEditor/index.js +4 -4
- package/dist/components/Textarea/index.cjs +6 -6
- package/dist/components/Textarea/index.js +3 -3
- package/dist/esheet.cjs +18 -18
- package/dist/esheet.js +5 -5
- package/dist/index.cjs +53 -53
- package/dist/index.js +7 -7
- package/dist/kerebron.cjs +5 -5
- package/dist/kerebron.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-5O54NWAL.cjs.map +0 -1
- package/dist/chunk-ULKDK6W6.js.map +0 -1
- package/dist/collabKit-GCRHP25F.cjs +0 -76
- package/dist/collabKit-GCRHP25F.cjs.map +0 -1
- package/dist/collabKit-SJPDPXU4.js +0 -52
- package/dist/collabKit-SJPDPXU4.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/EmailEditor/types.ts","../src/components/EmailEditor/renderEmailMjml.ts","../src/components/EmailEditor/EmailBlockPreview.tsx","../src/components/EmailEditor/EmailBlockSettings.tsx","../src/components/EmailEditor/labels.ts","../src/components/EmailEditor/tree.ts","../src/components/EmailEditor/EmailEditor.tsx"],"names":["HEADING_SIZES","React","ImageIcon","Button","jsx","jsxs","React2","Fragment","Trash2"],"mappings":"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","file":"chunk-IYXZ25E6.js","sourcesContent":["/**\n * Email document model. Field names match Waggleline's email builder, so\n * documents built from this shared block set move between the two without\n * migration. The union is closed: hosts with product-specific blocks must\n * convert them to these types (or drop them) before loading a document.\n * Unrecognised blocks are preserved in the document but render as an\n * \"unsupported block\" placeholder in the canvas and are omitted from the MJML.\n */\n\nexport type EmailAlignment = 'left' | 'center' | 'right';\n\nexport interface EmailBlockBase {\n id: string;\n}\n\nexport interface EmailHeadingBlock extends EmailBlockBase {\n type: 'heading';\n level: 1 | 2 | 3 | 4;\n text: string;\n alignment?: EmailAlignment;\n color?: string;\n}\n\nexport interface EmailTextBlock extends EmailBlockBase {\n type: 'text';\n /**\n * HTML. Existing values are stored as-is and sanitised on every output\n * (editing surface, canvas preview, `renderEmailMjml`); only HTML pasted or\n * dropped into the editor is sanitised before it is stored.\n */\n content: string;\n alignment?: EmailAlignment;\n color?: string;\n}\n\nexport interface EmailButtonBlock extends EmailBlockBase {\n type: 'button';\n text: string;\n url: string;\n alignment?: EmailAlignment;\n backgroundColor?: string;\n textColor?: string;\n borderRadius?: number;\n fullWidth?: boolean;\n}\n\nexport interface EmailImageBlock extends EmailBlockBase {\n type: 'image';\n src: string;\n alt: string;\n href?: string;\n width?: number | string;\n borderRadius?: number;\n alignment?: EmailAlignment;\n}\n\nexport interface EmailDividerBlock extends EmailBlockBase {\n type: 'divider';\n style?: 'solid' | 'dashed' | 'dotted';\n color?: string;\n width?: string;\n}\n\nexport interface EmailSpacerBlock extends EmailBlockBase {\n type: 'spacer';\n height: number;\n}\n\nexport interface EmailColumn {\n id: string;\n blocks: EmailContentBlock[];\n /** Percentage; a row's columns should sum to 100. */\n width?: number;\n backgroundColor?: string;\n}\n\nexport interface EmailColumnsBlock extends EmailBlockBase {\n type: 'columns';\n columnCount: 1 | 2 | 3;\n columns: EmailColumn[];\n backgroundColor?: string;\n}\n\nexport type EmailSocialPlatform =\n | 'facebook'\n | 'twitter'\n | 'linkedin'\n | 'instagram'\n | 'youtube'\n | 'github'\n | 'website';\n\nexport interface EmailSocialLink {\n platform: EmailSocialPlatform;\n url: string;\n}\n\nexport interface EmailSocialBlock extends EmailBlockBase {\n type: 'social';\n alignment?: EmailAlignment;\n iconSize?: 'sm' | 'md' | 'lg';\n links: EmailSocialLink[];\n}\n\nexport interface EmailHeroBlock extends EmailBlockBase {\n type: 'hero';\n headline: string;\n subtitle?: string;\n categoryText?: string;\n ctaText?: string;\n ctaUrl?: string;\n backgroundColor?: string;\n /** `linear-`/`radial-gradient(...)`; clients without CSS gradients fall back to `backgroundColor`. */\n backgroundGradient?: string;\n textColor?: string;\n ctaColor?: string;\n alignment?: EmailAlignment;\n padding?: number;\n}\n\nexport interface EmailHtmlBlock extends EmailBlockBase {\n type: 'html';\n html: string;\n}\n\nexport interface EmailFooterBlock extends EmailBlockBase {\n type: 'footer';\n companyName?: string;\n address?: string;\n phone?: string;\n showUnsubscribe: boolean;\n unsubscribeText?: string;\n managePreferencesUrl?: string;\n managePreferencesText?: string;\n alignment?: EmailAlignment;\n color?: string;\n}\n\nexport interface EmailQuoteBlock extends EmailBlockBase {\n type: 'quote';\n text: string;\n author?: string;\n role?: string;\n alignment?: EmailAlignment;\n backgroundColor?: string;\n textColor?: string;\n accentColor?: string;\n}\n\nexport interface EmailTableBlock extends EmailBlockBase {\n type: 'table';\n rows: string[][];\n headerRow?: boolean;\n borderColor?: string;\n headerBackgroundColor?: string;\n headerTextColor?: string;\n alignment?: EmailAlignment;\n}\n\n/** Blocks that can sit inside a column. */\nexport type EmailContentBlock =\n | EmailHeadingBlock\n | EmailTextBlock\n | EmailButtonBlock\n | EmailImageBlock\n | EmailDividerBlock\n | EmailSpacerBlock\n | EmailSocialBlock\n | EmailHtmlBlock\n | EmailFooterBlock\n | EmailQuoteBlock\n | EmailTableBlock;\n\nexport type EmailBlock = EmailContentBlock | EmailColumnsBlock | EmailHeroBlock;\n\nexport type EmailBlockType = EmailBlock['type'];\n\nexport interface EmailContentTree {\n version: string;\n blocks: EmailBlock[];\n}\n\nexport interface EmailDesignSettings {\n bodyBackgroundColor?: string;\n contentBackgroundColor?: string;\n /** Content width in px. */\n contentWidth?: number;\n textColor?: string;\n fontFamily?: string;\n headingColor?: string;\n linkColor?: string;\n buttonBackgroundColor?: string;\n buttonTextColor?: string;\n buttonBorderRadius?: number;\n}\n\n/** A merge field offered in the editor, e.g. `{{first_name}}`. */\nexport interface EmailMergeTag {\n token: string;\n label: string;\n group: string;\n}\n\n/** Blocks that only make sense at the top level of the email. */\nexport const FULL_WIDTH_BLOCK_TYPES: readonly EmailBlockType[] = [\n 'hero',\n 'columns',\n];\n\nexport function isContentBlock(block: EmailBlock): block is EmailContentBlock {\n return !FULL_WIDTH_BLOCK_TYPES.includes(block.type);\n}\n\nexport function generateEmailBlockId(): string {\n return (\n globalThis.crypto?.randomUUID?.() ??\n `b${Date.now().toString(36)}${Math.random().toString(36).slice(2, 10)}`\n );\n}\n\n// Email clients need literal colours, so these defaults are data, not theme tokens.\nexport function createDefaultDesignSettings(): Required<EmailDesignSettings> {\n return {\n bodyBackgroundColor: '#f4f4f5',\n contentBackgroundColor: '#ffffff',\n contentWidth: 600,\n textColor: '#374151',\n fontFamily: 'Arial, Helvetica, sans-serif',\n headingColor: '#111827',\n linkColor: '#2563eb',\n buttonBackgroundColor: '#2563eb',\n buttonTextColor: '#ffffff',\n buttonBorderRadius: 6,\n };\n}\n\n/** Defaults overlaid with the fields `design` actually sets; `undefined` inherits. */\nexport function resolveDesignSettings(\n design: EmailDesignSettings | undefined\n): Required<EmailDesignSettings> {\n const defined = Object.entries(design ?? {}).filter(\n ([, v]) => v !== undefined\n );\n return { ...createDefaultDesignSettings(), ...Object.fromEntries(defined) };\n}\n\nexport function createEmailBlock<T extends EmailBlockType>(\n type: T\n): Extract<EmailBlock, { type: T }> {\n return newBlock(type) as Extract<EmailBlock, { type: T }>;\n}\n\nfunction newBlock(type: EmailBlockType): EmailBlock {\n const id = generateEmailBlockId();\n switch (type) {\n case 'heading':\n return { id, type, level: 2, text: 'Heading', alignment: 'left' };\n case 'text':\n return { id, type, content: '<p>Write your message here.</p>' };\n case 'button':\n return {\n id,\n type,\n text: 'Learn more',\n url: 'https://',\n alignment: 'center',\n };\n case 'image':\n return { id, type, src: '', alt: '', alignment: 'center' };\n case 'divider':\n return { id, type, style: 'solid', color: '#e5e7eb' };\n case 'spacer':\n return { id, type, height: 24 };\n case 'social':\n return {\n id,\n type,\n alignment: 'center',\n iconSize: 'md',\n links: [\n { platform: 'linkedin', url: 'https://linkedin.com' },\n { platform: 'website', url: 'https://' },\n ],\n };\n case 'html':\n return { id, type, html: '<p>Custom HTML</p>' };\n case 'footer':\n return {\n id,\n type,\n showUnsubscribe: true,\n unsubscribeText: 'Unsubscribe from these emails',\n alignment: 'center',\n color: '#6b7280',\n };\n case 'quote':\n return {\n id,\n type,\n text: 'A short testimonial.',\n author: 'Name',\n role: 'Title',\n };\n case 'table':\n return {\n id,\n type,\n headerRow: true,\n rows: [\n ['Item', 'Detail'],\n ['', ''],\n ],\n };\n case 'hero':\n return {\n id,\n type,\n headline: 'Big announcement',\n subtitle: 'One line that says why it matters.',\n ctaText: 'Read more',\n ctaUrl: 'https://',\n backgroundColor: '#1e3a5f',\n textColor: '#ffffff',\n alignment: 'center',\n padding: 48,\n };\n case 'columns':\n return {\n id,\n type,\n columnCount: 2,\n columns: [\n { id: generateEmailBlockId(), width: 50, blocks: [] },\n { id: generateEmailBlockId(), width: 50, blocks: [] },\n ],\n };\n }\n}\n\nexport function createEmptyEmailContentTree(): EmailContentTree {\n return {\n version: '1.0',\n blocks: [\n {\n ...createEmailBlock('heading'),\n level: 1,\n text: 'Your email title',\n alignment: 'center',\n },\n createEmailBlock('text'),\n createEmailBlock('footer'),\n ],\n };\n}\n","import DOMPurify from 'dompurify';\n\nimport {\n createDefaultDesignSettings,\n resolveDesignSettings,\n type EmailAlignment,\n type EmailBlock,\n type EmailContentBlock,\n type EmailContentTree,\n type EmailDesignSettings,\n type EmailHeroBlock,\n type EmailSocialPlatform,\n} from './types';\n\nexport interface RenderEmailMjmlOptions {\n design?: EmailDesignSettings;\n /**\n * Sanitises the HTML of `text` and `html` blocks. Defaults to DOMPurify with\n * the email policy, which needs a DOM — on a server pass\n * `createEmailHtmlSanitizer(new JSDOM('').window)` so the same policy applies\n * (vanilla DOMPurify over jsdom would enforce far less).\n */\n sanitizeHtml?: (html: string) => string;\n /** `href` of the footer's unsubscribe link. Defaults to `{{unsubscribe_url}}`. */\n unsubscribeUrl?: string;\n}\n\ninterface Ctx {\n design: Required<EmailDesignSettings>;\n sanitize: (html: string) => string;\n unsubscribeUrl: string;\n}\n\nexport function escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Allows http(s), mailto, tel, anchors, root-relative paths and a single\n * complete `{{merge}}` token. A token with a suffix (`{{base}}/path`) is\n * rejected: its safety depends on the expansion, so hosts composing URLs from\n * tokens must revalidate after merge expansion.\n */\nexport function isSafeUrl(value: string | undefined): boolean {\n // After the leading slash, a second slash, backslash or whitespace would let\n // URL parsers (which strip tabs/newlines and treat `\\` as `/`) read the path\n // as a network-path URL on an attacker's origin. The merge-token branch is\n // anchored to the end so `{{empty}}javascript:...` cannot smuggle a scheme.\n return /^(https?:|mailto:|tel:|#|\\/(?![/\\\\\\s])|\\{\\{[^{}]*\\}\\}$)/i.test(\n (value ?? '').trim()\n );\n}\n\n/** `value` when `isSafeUrl` accepts it (HTML-escaped for interpolation), else `#`. */\nexport function safeUrl(value: string | undefined): string {\n const url = (value ?? '').trim();\n return isSafeUrl(url) ? escapeHtml(url) : '#';\n}\n\n// Hex colours only come in 3, 4, 6 or 8 digits; 5 or 7 would be invalid CSS.\nconst COLOR =\n /^(#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})|(rgb|rgba|hsl|hsla)\\([\\d\\s.,%]+\\)|[a-z]+)$/i;\n\nexport function safeColor(value: string | undefined, fallback: string): string {\n return value && COLOR.test(value.trim()) ? value.trim() : fallback;\n}\n\nexport function safeGradient(value: string | undefined): string | null {\n const gradient = value?.trim() ?? '';\n return /^(linear|radial)-gradient\\([^;{}<>\"()]*(\\([^;{}<>\"()]*\\)[^;{}<>\"()]*)*\\)$/i.test(\n gradient\n ) && !/url\\s*\\(/i.test(gradient)\n ? gradient\n : null;\n}\n\nfunction heroGradient(block: EmailHeroBlock): string | null {\n return /^[\\w-]+$/.test(block.id)\n ? safeGradient(block.backgroundGradient)\n : null;\n}\n\n/** The canvas preview and `renderHero` must agree on when the CTA exists. */\nexport function hasHeroCta(block: EmailHeroBlock): boolean {\n return Boolean(block.ctaText && block.ctaUrl);\n}\n\nfunction align(\n value: EmailAlignment | undefined,\n fallback: EmailAlignment\n): EmailAlignment {\n return value === 'left' || value === 'center' || value === 'right'\n ? value\n : fallback;\n}\n\nfunction px(value: unknown, fallback: number, max = 2000): number {\n const n = Number(value);\n return Number.isFinite(n)\n ? Math.min(Math.max(Math.round(n), 0), max)\n : fallback;\n}\n\nconst SANITIZE_CONFIG = {\n FORBID_TAGS: ['style', 'form', 'input', 'textarea', 'select', 'button'],\n // Host CSS classes (e.g. `fixed inset-0`) and ids would escape the style\n // allowlist; srcset/xlink:href would escape the URL policy below.\n FORBID_ATTR: ['class', 'id', 'srcset', 'xlink:href'],\n};\n\n// DOMPurify's default URI policy is looser than this component's (it permits\n// protocol-relative URLs, ftp:, cid:, ...), so URL attributes get `isSafeUrl`.\nconst URL_ATTRIBUTES = new Set(['href', 'src', 'background', 'poster']);\n\n// Formatting only: anything that can position, layer or load (url()) is dropped.\nconst SAFE_STYLE_PROPERTY =\n /^(color|background-color|font(-[a-z]+)?|text-(align|decoration|transform|indent)|line-height|letter-spacing|word-spacing|white-space|vertical-align|(margin|padding)(-(top|right|bottom|left))?|border(-(top|right|bottom|left))?(-(width|style|color))?|border-(collapse|spacing|radius)|(max-|min-)?(width|height)|display|list-style(-type)?)$/;\n\nexport function sanitizeInlineStyle(style: string): string {\n return style\n .split(';')\n .map((declaration) => {\n const colon = declaration.indexOf(':');\n if (colon === -1) return '';\n const property = declaration.slice(0, colon).trim().toLowerCase();\n const value = declaration.slice(colon + 1).trim();\n return SAFE_STYLE_PROPERTY.test(property) &&\n value &&\n !/url\\s*\\(|expression\\s*\\(|@import|[<>\\\\]/i.test(value) &&\n // Negative margins could pull content over the surrounding page.\n !(property.startsWith('margin') && value.includes('-'))\n ? `${property}: ${value}`\n : '';\n })\n .filter(Boolean)\n .join('; ');\n}\n\nlet purifier: ReturnType<typeof DOMPurify> | null | undefined;\n\nfunction installEmailPolicy(instance: ReturnType<typeof DOMPurify>) {\n instance.addHook('uponSanitizeAttribute', (_node, data) => {\n if (URL_ATTRIBUTES.has(data.attrName)) {\n // Validate only; DOMPurify escapes attribute values when serialising.\n if (!isSafeUrl(data.attrValue)) data.keepAttr = false;\n return;\n }\n if (data.attrName !== 'style') return;\n data.attrValue = sanitizeInlineStyle(data.attrValue);\n if (!data.attrValue) data.keepAttr = false;\n });\n return instance;\n}\n\n/**\n * The email sanitation policy on a caller-supplied window, for environments\n * without a global DOM: `createEmailHtmlSanitizer(new JSDOM('').window)`.\n * Vanilla DOMPurify is NOT equivalent — it would keep class/id attributes,\n * positioning styles and URL schemes this policy rejects.\n */\nexport function createEmailHtmlSanitizer(\n win: Parameters<typeof DOMPurify>[0]\n): (html: string) => string {\n const instance = DOMPurify(win);\n if (!instance.isSupported) {\n throw new Error(\n 'createEmailHtmlSanitizer: the supplied window cannot run DOMPurify.'\n );\n }\n installEmailPolicy(instance);\n return (html) => instance.sanitize(html, SANITIZE_CONFIG);\n}\n\n// A private instance, so the policy hook never leaks into other DOMPurify users.\nfunction getPurifier() {\n if (purifier !== undefined) return purifier;\n if (typeof window === 'undefined') return null;\n const instance = DOMPurify(window);\n if (!instance.isSupported) return (purifier = null);\n return (purifier = installEmailPolicy(instance));\n}\n\n/** DOMPurify with the email policy, or `null` where there is no DOM. */\nexport function sanitizeEmailHtml(html: string): string | null {\n return getPurifier()?.sanitize(html, SANITIZE_CONFIG) ?? null;\n}\n\nfunction defaultSanitize(html: string): string {\n const clean = sanitizeEmailHtml(html);\n if (clean === null) {\n throw new Error(\n 'renderEmailMjml: no DOM is available to sanitise HTML. Pass options.sanitizeHtml.'\n );\n }\n return clean;\n}\n\nconst HEADING_SIZES = { 1: 32, 2: 26, 3: 22, 4: 18 } as const;\n\nconst SOCIAL_NAMES: Record<EmailSocialPlatform, string> = {\n facebook: 'facebook-noshare',\n twitter: 'twitter-noshare',\n linkedin: 'linkedin-noshare',\n instagram: 'instagram',\n youtube: 'youtube',\n github: 'github',\n website: 'web',\n};\n\nconst ICON_SIZES = { sm: 20, md: 25, lg: 35 } as const;\n\n/** Renders one block as column content; `available` is the usable width in px. */\nfunction renderContent(\n block: EmailContentBlock,\n ctx: Ctx,\n pad: string,\n available: number\n): string {\n const { design } = ctx;\n switch (block.type) {\n case 'heading': {\n const level = HEADING_SIZES[block.level] ? block.level : 2;\n const color = safeColor(block.color, design.headingColor);\n const size = HEADING_SIZES[level];\n // Inline size: clients scale h1-h4 relative to the mj-text font size.\n return `<mj-text align=\"${align(block.alignment, 'left')}\" font-size=\"${size}px\" font-weight=\"bold\" color=\"${color}\" padding=\"${pad}\"><h${level} style=\"font-size: ${size}px; line-height: 1.25;\">${escapeHtml(block.text)}</h${level}></mj-text>`;\n }\n case 'text': {\n const color = block.color\n ? ` color=\"${safeColor(block.color, design.textColor)}\"`\n : '';\n return `<mj-text align=\"${align(block.alignment, 'left')}\"${color} padding=\"${pad}\">${ctx.sanitize(block.content)}</mj-text>`;\n }\n case 'button': {\n const bg = safeColor(block.backgroundColor, design.buttonBackgroundColor);\n const fg = safeColor(block.textColor, design.buttonTextColor);\n const radius = px(\n block.borderRadius ?? design.buttonBorderRadius,\n 6,\n 100\n );\n const width = block.fullWidth ? ' width=\"100%\"' : '';\n return `<mj-button align=\"${align(block.alignment, 'center')}\" background-color=\"${bg}\" color=\"${fg}\" border-radius=\"${radius}px\" href=\"${safeUrl(block.url)}\" font-size=\"16px\" padding=\"${pad}\"${width}>${escapeHtml(block.text)}</mj-button>`;\n }\n case 'image': {\n if (!block.src) return '';\n // mj-image only accepts px; a percentage becomes px of the usable width.\n // Unambiguous alternation: `\\d*\\.?\\d+` backtracks polynomially (CodeQL).\n const percent = /^(\\d+(?:\\.\\d+)?|\\.\\d+)%$/.exec(\n String(block.width ?? '').trim()\n );\n const share = percent ? Math.min(Number(percent[1]), 100) : 0;\n const widthPx = percent\n ? Math.round((available * share) / 100)\n : parseInt(String(block.width ?? ''), 10);\n const width =\n Number.isFinite(widthPx) && widthPx > 0 && share !== 100\n ? ` width=\"${px(widthPx, 600)}px\"`\n : '';\n const href = block.href ? ` href=\"${safeUrl(block.href)}\"` : '';\n const radius = block.borderRadius\n ? ` border-radius=\"${px(block.borderRadius, 0, 100)}px\"`\n : '';\n return `<mj-image src=\"${safeUrl(block.src)}\" alt=\"${escapeHtml(block.alt ?? '')}\" align=\"${align(block.alignment, 'center')}\"${width} padding=\"${pad}\"${href}${radius} />`;\n }\n case 'divider': {\n const style = ['solid', 'dashed', 'dotted'].includes(block.style ?? '')\n ? block.style\n : 'solid';\n const width = /^\\d+(px|%)$/.test(block.width ?? '')\n ? block.width\n : '100%';\n return `<mj-divider border-color=\"${safeColor(block.color, '#e5e7eb')}\" border-style=\"${style}\" border-width=\"1px\" width=\"${width}\" padding=\"${pad}\" />`;\n }\n case 'spacer':\n return `<mj-spacer height=\"${px(block.height, 24, 400)}px\" />`;\n case 'social': {\n const size = ICON_SIZES[block.iconSize ?? 'md'] ?? ICON_SIZES.md;\n const items = block.links\n .filter((link) => SOCIAL_NAMES[link.platform])\n .map(\n (link) =>\n `<mj-social-element name=\"${SOCIAL_NAMES[link.platform]}\" href=\"${safeUrl(link.url)}\" icon-size=\"${size}px\" />`\n )\n .join('');\n return `<mj-social align=\"${align(block.alignment, 'center')}\" icon-size=\"${size}px\" mode=\"horizontal\" padding=\"${pad}\">${items}</mj-social>`;\n }\n case 'html':\n return `<mj-raw>${ctx.sanitize(block.html)}</mj-raw>`;\n case 'footer': {\n const color = safeColor(block.color, '#6b7280');\n const lines = [block.companyName, block.address, block.phone]\n .filter((line): line is string => Boolean(line))\n .map(escapeHtml);\n const links: string[] = [];\n if (block.showUnsubscribe) {\n links.push(\n `<a href=\"${safeUrl(ctx.unsubscribeUrl)}\" style=\"color: ${color};\">${escapeHtml(block.unsubscribeText || 'Unsubscribe')}</a>`\n );\n }\n if (block.managePreferencesUrl) {\n links.push(\n `<a href=\"${safeUrl(block.managePreferencesUrl)}\" style=\"color: ${color};\">${escapeHtml(block.managePreferencesText || 'Manage preferences')}</a>`\n );\n }\n if (links.length) lines.push(links.join(' '));\n return `<mj-text align=\"${align(block.alignment, 'center')}\" color=\"${color}\" font-size=\"12px\" padding=\"${pad}\">${lines.join('<br />')}</mj-text>`;\n }\n case 'quote': {\n const fg = safeColor(block.textColor, '#1e293b');\n const accent = safeColor(block.accentColor, design.linkColor);\n const bg = safeColor(block.backgroundColor, '#f8fafc');\n let attribution = '';\n if (block.author) {\n attribution = `<p style=\"margin: 12px 0 0; font-weight: 600;\">${escapeHtml(block.author)}</p>`;\n if (block.role) {\n attribution += `<p style=\"margin: 2px 0 0; font-size: 13px; opacity: 0.75;\">${escapeHtml(block.role)}</p>`;\n }\n }\n return `<mj-text align=\"${align(block.alignment, 'left')}\" color=\"${fg}\" container-background-color=\"${bg}\" padding=\"${pad}\"><div style=\"border-left: 4px solid ${accent}; padding: 8px 0 8px 16px;\"><p style=\"font-size: 18px; font-style: italic; line-height: 1.6; margin: 0;\">“${escapeHtml(block.text)}”</p>${attribution}</div></mj-text>`;\n }\n case 'table': {\n if (!block.rows.length) return '';\n const border = safeColor(block.borderColor, '#e5e7eb');\n const headBg = safeColor(block.headerBackgroundColor, '#f3f4f6');\n const headFg = safeColor(block.headerTextColor, design.headingColor);\n const textAlign = align(block.alignment, 'left');\n const rows = block.rows\n .map((row, r) => {\n const head = block.headerRow && r === 0;\n const tag = head ? 'th' : 'td';\n const style = head\n ? `background-color: ${headBg}; color: ${headFg}; font-weight: 600; `\n : '';\n return `<tr>${row\n .map(\n (cell) =>\n `<${tag} style=\"${style}padding: 10px 12px; border: 1px solid ${border}; text-align: ${textAlign};\">${escapeHtml(cell)}</${tag}>`\n )\n .join('')}</tr>`;\n })\n .join('');\n return `<mj-table padding=\"${pad}\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" css-class=\"email-table\">${rows}</mj-table>`;\n }\n // Unsupported block types (host-owned blocks in a loaded document) are\n // omitted from the email; the canvas shows a placeholder for them.\n default:\n return '';\n }\n}\n\nfunction renderHero(block: EmailHeroBlock): string {\n const bg = safeColor(block.backgroundColor, '#1e3a5f');\n const fg = safeColor(block.textColor, '#ffffff');\n const a = align(block.alignment, 'center');\n const parts: string[] = [];\n if (block.categoryText) {\n parts.push(\n `<mj-text align=\"${a}\" color=\"${fg}\" font-size=\"12px\" font-weight=\"700\" letter-spacing=\"2px\" text-transform=\"uppercase\" padding=\"0 0 8px 0\">${escapeHtml(block.categoryText)}</mj-text>`\n );\n }\n parts.push(\n `<mj-text align=\"${a}\" color=\"${fg}\" font-size=\"32px\" font-weight=\"bold\" line-height=\"1.2\" padding=\"0 0 8px 0\"><h1 style=\"color: ${fg}; margin: 0; font-size: 32px; line-height: 1.2;\">${escapeHtml(block.headline)}</h1></mj-text>`\n );\n if (block.subtitle) {\n parts.push(\n `<mj-text align=\"${a}\" color=\"${fg}\" font-size=\"16px\" line-height=\"1.5\" padding=\"0 0 16px 0\">${escapeHtml(block.subtitle)}</mj-text>`\n );\n }\n if (hasHeroCta(block)) {\n parts.push(\n `<mj-button align=\"${a}\" background-color=\"${safeColor(block.ctaColor, '#ffffff')}\" color=\"${bg}\" font-size=\"16px\" font-weight=\"600\" border-radius=\"6px\" padding=\"8px 0\" href=\"${safeUrl(block.ctaUrl)}\">${escapeHtml(block.ctaText ?? '')}</mj-button>`\n );\n }\n const gradient = heroGradient(block)\n ? ` css-class=\"hero-gradient-${block.id}\"`\n : '';\n return `<mj-section full-width=\"full-width\" background-color=\"${bg}\" padding=\"${px(block.padding, 48, 200)}px 25px\"${gradient}><mj-column>${parts.join('')}</mj-column></mj-section>`;\n}\n\nfunction renderBlock(block: EmailBlock, ctx: Ctx): string {\n if (block.type === 'hero') return renderHero(block);\n if (block.type === 'columns') {\n const bg = block.backgroundColor\n ? ` background-color=\"${safeColor(block.backgroundColor, 'transparent')}\"`\n : '';\n const columns = block.columns\n .map((column) => {\n const width = column.width\n ? ` width=\"${px(column.width, 50, 100)}%\"`\n : '';\n const colBg = column.backgroundColor\n ? ` background-color=\"${safeColor(column.backgroundColor, 'transparent')}\"`\n : '';\n const share = px(column.width ?? 100 / block.columns.length, 50, 100);\n const available =\n Math.round((ctx.design.contentWidth * share) / 100) - 24;\n const inner = column.blocks\n .map((b) => renderContent(b, ctx, '8px 12px', available))\n .join('');\n return `<mj-column${width}${colBg}>${inner || '<mj-text> </mj-text>'}</mj-column>`;\n })\n .join('');\n return `<mj-section${bg}>${columns}</mj-section>`;\n }\n const content = renderContent(\n block,\n ctx,\n '10px 25px',\n ctx.design.contentWidth - 50\n );\n return content\n ? `<mj-section><mj-column>${content}</mj-column></mj-section>`\n : '';\n}\n\n/**\n * Serialises an email document to MJML. Compile the result with `mjml` (server)\n * or `mjml-browser` to get client-safe HTML.\n */\n/** Defaults plus `design`, with every colour, width and font validated. */\nexport function normalizeDesignSettings(\n design: EmailDesignSettings | undefined\n): Required<EmailDesignSettings> {\n const defaults = createDefaultDesignSettings();\n const d = resolveDesignSettings(design);\n const color = (key: keyof EmailDesignSettings) =>\n safeColor(d[key] as string, defaults[key] as string);\n return {\n bodyBackgroundColor: color('bodyBackgroundColor'),\n contentBackgroundColor: color('contentBackgroundColor'),\n textColor: color('textColor'),\n headingColor: color('headingColor'),\n linkColor: color('linkColor'),\n buttonBackgroundColor: color('buttonBackgroundColor'),\n buttonTextColor: color('buttonTextColor'),\n buttonBorderRadius: px(d.buttonBorderRadius, 6, 100),\n // The design UI's 320px floor also applies to documents set programmatically.\n contentWidth: Math.max(320, px(d.contentWidth, 600, 1200)),\n fontFamily:\n typeof d.fontFamily === 'string' && /^[\\w\\s,'-]+$/.test(d.fontFamily)\n ? d.fontFamily\n : defaults.fontFamily,\n };\n}\n\nexport function renderEmailMjml(\n tree: EmailContentTree,\n options: RenderEmailMjmlOptions = {}\n): string {\n const design = normalizeDesignSettings(options.design);\n const ctx: Ctx = {\n design,\n sanitize: options.sanitizeHtml ?? defaultSanitize,\n unsubscribeUrl: options.unsubscribeUrl ?? '{{unsubscribe_url}}',\n };\n const gradients = tree.blocks\n .filter((b): b is EmailHeroBlock => b.type === 'hero')\n .map((b) => {\n const gradient = heroGradient(b);\n return gradient\n ? `.hero-gradient-${b.id} { background: ${gradient} !important; }`\n : '';\n })\n .filter(Boolean)\n .join('\\n');\n\n return `<mjml>\n <mj-head>\n <mj-attributes>\n <mj-all font-family=\"${escapeHtml(design.fontFamily)}\" color=\"${design.textColor}\" />\n <mj-text font-size=\"16px\" line-height=\"1.6\" />\n <mj-section background-color=\"${design.contentBackgroundColor}\" />\n </mj-attributes>\n <mj-style>\n a { color: ${design.linkColor}; }\n h1, h2, h3, h4, h5, h6 { color: inherit; margin: 0; }\n ${gradients}\n </mj-style>\n <mj-style inline=\"inline\">\n .email-table table { border-collapse: collapse; }\n </mj-style>\n </mj-head>\n <mj-body background-color=\"${design.bodyBackgroundColor}\" width=\"${design.contentWidth}px\">\n ${tree.blocks.map((block) => renderBlock(block, ctx)).join('\\n ')}\n </mj-body>\n</mjml>`;\n}\n","import * as React from 'react';\nimport {\n Facebook,\n Github,\n Globe,\n Image as ImageIcon,\n Instagram,\n Linkedin,\n Twitter,\n Youtube,\n} from 'lucide-react';\n\nimport {\n hasHeroCta,\n safeColor,\n safeGradient,\n sanitizeEmailHtml,\n} from './renderEmailMjml';\nimport type {\n EmailBlock,\n EmailContentBlock,\n EmailDesignSettings,\n EmailSocialPlatform,\n} from './types';\n\nconst SOCIAL_ICONS: Record<EmailSocialPlatform, React.ElementType> = {\n facebook: Facebook,\n twitter: Twitter,\n linkedin: Linkedin,\n instagram: Instagram,\n youtube: Youtube,\n github: Github,\n website: Globe,\n};\n\nconst HEADING_SIZES = { 1: 32, 2: 26, 3: 22, 4: 18 } as const;\n\nfunction SafeHtml({\n html,\n style,\n}: {\n html: string;\n style?: React.CSSProperties;\n}) {\n // Sanitise after mount: there is no DOM during server rendering.\n const [clean, setClean] = React.useState('');\n React.useEffect(() => setClean(sanitizeEmailHtml(html) ?? ''), [html]);\n // Undo the CSS reset so the content looks as it will in a mail client:\n // paragraphs and lists space out, headings (the editor offers H1–H6) are\n // bold at UA sizes (the MJML styles zero their margins), blockquotes get\n // the UA indent.\n return (\n <div\n style={style}\n className=\"[&_a]:underline [&_blockquote]:mx-10 [&_blockquote]:my-4 [&_h1]:text-[2em] [&_h1]:font-bold [&_h2]:text-[1.5em] [&_h2]:font-bold [&_h3]:text-[1.17em] [&_h3]:font-bold [&_h4]:text-[1em] [&_h4]:font-bold [&_h5]:text-[0.83em] [&_h5]:font-bold [&_h6]:text-[0.67em] [&_h6]:font-bold [&_ol]:list-decimal [&_ol]:ps-6 [&_p]:my-3 [&_ul]:list-disc [&_ul]:ps-6\"\n dangerouslySetInnerHTML={{ __html: clean }}\n />\n );\n}\n\nexport interface EmailBlockPreviewProps {\n block: EmailBlock;\n design: Required<EmailDesignSettings>;\n /** Renders a column's child block (selection frame, toolbar). */\n renderChild: (block: EmailContentBlock) => React.ReactNode;\n /** Shown in an empty column. */\n emptyColumnLabel: string;\n /** Shown for a block type this editor does not support; `{type}` is replaced. */\n unsupportedBlockLabel: string;\n /** Accessible names for the social block's icons, usually `labels.platforms`. */\n platformLabels: Record<EmailSocialPlatform, string>;\n}\n\n/** WYSIWYG approximation of a block; the sent email comes from `renderEmailMjml`. */\nexport function EmailBlockPreview({\n block,\n design,\n renderChild,\n emptyColumnLabel,\n unsupportedBlockLabel,\n platformLabels,\n}: EmailBlockPreviewProps) {\n const pad = '10px 25px';\n switch (block.type) {\n case 'heading': {\n const Tag = `h${block.level}` as 'h1';\n return (\n <Tag\n style={{\n margin: 0,\n padding: pad,\n fontSize: HEADING_SIZES[block.level],\n fontWeight: 700,\n lineHeight: 1.25,\n textAlign: block.alignment ?? 'left',\n color: safeColor(block.color, design.headingColor),\n }}\n >\n {block.text}\n </Tag>\n );\n }\n case 'text':\n return (\n <SafeHtml\n html={block.content}\n style={{\n padding: pad,\n textAlign: block.alignment ?? 'left',\n color: safeColor(block.color, design.textColor),\n }}\n />\n );\n case 'button':\n return (\n <div style={{ padding: pad, textAlign: block.alignment ?? 'center' }}>\n <span\n style={{\n display: block.fullWidth ? 'block' : 'inline-block',\n padding: '10px 25px',\n background: safeColor(\n block.backgroundColor,\n design.buttonBackgroundColor\n ),\n color: safeColor(block.textColor, design.buttonTextColor),\n borderRadius: block.borderRadius ?? design.buttonBorderRadius,\n fontWeight: 600,\n }}\n >\n {block.text}\n </span>\n </div>\n );\n case 'image':\n return (\n <div style={{ padding: pad, textAlign: block.alignment ?? 'center' }}>\n {block.src ? (\n <img\n src={block.src}\n alt={block.alt}\n style={{\n display: 'inline-block',\n maxWidth: '100%',\n // Zero/invalid widths fall back to full width, matching the\n // omitted width in renderEmailMjml.\n width:\n parseFloat(String(block.width ?? '')) > 0\n ? block.width\n : '100%',\n borderRadius: block.borderRadius,\n }}\n />\n ) : (\n <div className=\"border-border text-muted-foreground flex h-32 items-center justify-center rounded-md border-2 border-dashed\">\n <ImageIcon className=\"h-8 w-8\" aria-hidden=\"true\" />\n </div>\n )}\n </div>\n );\n case 'divider':\n return (\n <div style={{ padding: pad }}>\n <hr\n style={{\n margin: '0 auto',\n border: 0,\n borderTop: `1px ${block.style ?? 'solid'} ${safeColor(block.color, '#e5e7eb')}`,\n width: block.width ?? '100%',\n }}\n />\n </div>\n );\n case 'spacer':\n return <div style={{ height: block.height }} />;\n case 'social': {\n const size = { sm: 20, md: 25, lg: 35 }[block.iconSize ?? 'md'];\n return (\n <div\n style={{\n padding: pad,\n display: 'flex',\n gap: 8,\n justifyContent:\n block.alignment === 'left'\n ? 'flex-start'\n : block.alignment === 'right'\n ? 'flex-end'\n : 'center',\n }}\n >\n {block.links.map((link, i) => {\n const Icon = SOCIAL_ICONS[link.platform] ?? Globe;\n return (\n <Icon\n key={i}\n width={size}\n height={size}\n role=\"img\"\n aria-label={platformLabels[link.platform] ?? link.platform}\n />\n );\n })}\n </div>\n );\n }\n case 'html':\n return <SafeHtml html={block.html} style={{ padding: pad }} />;\n case 'footer': {\n const color = safeColor(block.color, '#6b7280');\n return (\n <div\n style={{\n padding: pad,\n fontSize: 12,\n color,\n textAlign: block.alignment ?? 'center',\n }}\n >\n {[block.companyName, block.address, block.phone]\n .filter(Boolean)\n .map((line, i) => (\n <div key={i}>{line}</div>\n ))}\n <div>\n {block.showUnsubscribe && (\n <span style={{ textDecoration: 'underline' }}>\n {block.unsubscribeText || 'Unsubscribe'}\n </span>\n )}\n {block.managePreferencesUrl && (\n <span\n style={{ textDecoration: 'underline', marginInlineStart: 12 }}\n >\n {block.managePreferencesText || 'Manage preferences'}\n </span>\n )}\n </div>\n </div>\n );\n }\n case 'quote':\n return (\n <div\n style={{\n margin: pad,\n padding: '8px 16px',\n background: safeColor(block.backgroundColor, '#f8fafc'),\n color: safeColor(block.textColor, '#1e293b'),\n borderInlineStart: `4px solid ${safeColor(block.accentColor, design.linkColor)}`,\n textAlign: block.alignment ?? 'left',\n }}\n >\n <p style={{ margin: 0, fontSize: 18, fontStyle: 'italic' }}>\n “{block.text}”\n </p>\n {block.author && (\n <p style={{ margin: '12px 0 0', fontWeight: 600 }}>\n {block.author}\n </p>\n )}\n {block.author && block.role && (\n <p style={{ margin: '2px 0 0', fontSize: 13, opacity: 0.75 }}>\n {block.role}\n </p>\n )}\n </div>\n );\n case 'table': {\n const border = `1px solid ${safeColor(block.borderColor, '#e5e7eb')}`;\n return (\n <div style={{ padding: pad }}>\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <tbody>\n {block.rows.map((row, r) => {\n const head = block.headerRow && r === 0;\n return (\n <tr key={r}>\n {row.map((cell, c) => {\n const Cell = head ? 'th' : 'td';\n return (\n <Cell\n key={c}\n style={{\n border,\n padding: '10px 12px',\n textAlign: block.alignment ?? 'left',\n ...(head && {\n background: safeColor(\n block.headerBackgroundColor,\n '#f3f4f6'\n ),\n color: safeColor(\n block.headerTextColor,\n design.headingColor\n ),\n }),\n }}\n >\n {cell}\n </Cell>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n }\n case 'hero': {\n const color = safeColor(block.textColor, '#ffffff');\n const bg = safeColor(block.backgroundColor, '#1e3a5f');\n return (\n <div\n style={{\n padding: `${block.padding ?? 48}px 25px`,\n background: safeGradient(block.backgroundGradient) ?? bg,\n color,\n textAlign: block.alignment ?? 'center',\n }}\n >\n {block.categoryText && (\n <div\n style={{\n fontSize: 12,\n fontWeight: 700,\n letterSpacing: 2,\n textTransform: 'uppercase',\n marginBottom: 8,\n }}\n >\n {block.categoryText}\n </div>\n )}\n <h1\n style={{ margin: '0 0 8px', fontSize: 32, lineHeight: 1.2, color }}\n >\n {block.headline}\n </h1>\n {block.subtitle && (\n <p style={{ margin: '0 0 16px' }}>{block.subtitle}</p>\n )}\n {hasHeroCta(block) && (\n <span\n style={{\n display: 'inline-block',\n padding: '10px 25px',\n borderRadius: 6,\n fontWeight: 600,\n background: safeColor(block.ctaColor, '#ffffff'),\n color: bg,\n }}\n >\n {block.ctaText}\n </span>\n )}\n </div>\n );\n }\n case 'columns':\n return (\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n background: block.backgroundColor\n ? safeColor(block.backgroundColor, 'transparent')\n : undefined,\n }}\n >\n {block.columns.map((column) => (\n <div\n key={column.id}\n style={{\n flex: `1 1 ${column.width ?? 100 / block.columns.length}%`,\n minWidth: 160,\n padding: 4,\n background: column.backgroundColor\n ? safeColor(column.backgroundColor, 'transparent')\n : undefined,\n }}\n >\n {column.blocks.length ? (\n column.blocks.map((child) => (\n <React.Fragment key={child.id}>\n {renderChild(child)}\n </React.Fragment>\n ))\n ) : (\n <div className=\"border-border text-muted-foreground rounded-md border border-dashed p-4 text-center text-xs\">\n {emptyColumnLabel}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n // Host-owned block types (e.g. Waggleline-only blocks) are kept in the\n // document but rendered as a visible placeholder; `renderEmailMjml` omits them.\n default:\n return (\n <div\n role=\"note\"\n className=\"border-border text-muted-foreground m-2 rounded-md border border-dashed p-4 text-center text-xs\"\n >\n {unsupportedBlockLabel.replace(\n '{type}',\n (block as { type: string }).type\n )}\n </div>\n );\n }\n}\n","import * as React from 'react';\nimport { Plus, Trash2, Upload } from 'lucide-react';\n\nimport { Button as BaseButton, type ButtonProps } from '../Button';\nimport { Input } from '../Input';\nimport type { RichTextVariableGroup } from '../RichTextEditor/RichTextEditor';\nimport { Select } from '../Select';\nimport { Switch } from '../Switch';\nimport { Textarea } from '../Textarea';\n// Text blocks ride the Kerebron (ProseMirror) engine (mieweb/ui#695) — the\n// same surface behind the main bundle's Textarea, so this adds no new peers.\nimport { TextAreaRichKerebron } from '../TextAreaRich/TextAreaRichKerebron';\nimport type { EmailEditorLabels } from './labels';\nimport { sanitizeEmailHtml } from './renderEmailMjml';\nimport {\n createEmailBlock,\n generateEmailBlockId,\n type EmailAlignment,\n type EmailBlock,\n type EmailColumn,\n type EmailContentBlock,\n type EmailDesignSettings,\n type EmailSocialPlatform,\n} from './types';\n\ntype Patch<B> = (patch: Partial<B>) => void;\n\n// Task lists have no place in an email: their checkbox <input>s are forbidden\n// by the sanitiser and inert in every mail client. Module-level so the editor\n// sees one stable identity.\nconst EMAIL_OMITTED_EXTENSIONS = ['task_list', 'task_item'] as const;\n\n/** Editor actions must never submit a host form. */\nexport function Button(props: ButtonProps) {\n return <BaseButton type=\"button\" {...props} />;\n}\n\ninterface FieldProps<T> {\n label: string;\n value: T | undefined;\n onChange: (value: T) => void;\n}\n\nfunction TextField({\n multiline,\n ...props\n}: FieldProps<string> & { multiline?: boolean; placeholder?: string }) {\n const Control = multiline ? Textarea : Input;\n return (\n <Control\n label={props.label}\n value={props.value ?? ''}\n placeholder={props.placeholder}\n onChange={(\n e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n ) => props.onChange(e.target.value)}\n />\n );\n}\n\nfunction NumberField({\n label,\n value,\n onChange,\n min = 0,\n max,\n}: FieldProps<number> & { min?: number; max?: number }) {\n return (\n <Input\n type=\"number\"\n label={label}\n min={min}\n max={max}\n value={value ?? ''}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (e.target.value !== '' && Number.isFinite(n)) onChange(n);\n }}\n />\n );\n}\n\nconst HEX6 = /^#[0-9a-f]{6}$/i;\n\nfunction ColorField({\n label,\n value,\n onChange,\n fallback = '#000000',\n}: FieldProps<string> & { fallback?: string }) {\n const swatch = value && HEX6.test(value) ? value : fallback;\n return (\n <div className=\"flex items-end gap-2\">\n <div className=\"min-w-0 flex-1\">\n <Input\n label={label}\n value={value ?? ''}\n placeholder={fallback}\n onChange={(e) => onChange(e.target.value)}\n />\n </div>\n <input\n type=\"color\"\n aria-label={label}\n value={HEX6.test(swatch) ? swatch : '#000000'}\n onChange={(e) => onChange(e.target.value)}\n className=\"border-border bg-background h-10 w-10 shrink-0 cursor-pointer rounded-md border p-1\"\n />\n </div>\n );\n}\n\nfunction SelectField<T extends string>({\n label,\n value,\n onChange,\n options,\n}: FieldProps<T> & { options: { value: T; label: string }[] }) {\n return (\n <Select\n label={label}\n value={value}\n options={options}\n onValueChange={(v) => onChange(v as T)}\n />\n );\n}\n\nfunction SwitchField({ label, value, onChange }: FieldProps<boolean>) {\n return (\n <Switch label={label} checked={Boolean(value)} onCheckedChange={onChange} />\n );\n}\n\nconst SOCIAL_PLATFORMS: EmailSocialPlatform[] = [\n 'facebook',\n 'twitter',\n 'linkedin',\n 'instagram',\n 'youtube',\n 'github',\n 'website',\n];\n\nexport const CONTENT_BLOCK_TYPES = [\n 'heading',\n 'text',\n 'button',\n 'image',\n 'divider',\n 'spacer',\n 'social',\n 'quote',\n 'table',\n 'html',\n 'footer',\n] as const satisfies readonly EmailContentBlock['type'][];\n\nexport function resizeColumns(\n columns: EmailColumn[],\n count: 1 | 2 | 3\n): EmailColumn[] {\n const width = Math.floor(100 / count);\n const next = Array.from({ length: count }, (_, i) => ({\n ...(columns[i] ?? { id: generateEmailBlockId(), blocks: [] }),\n // The last column absorbs the rounding remainder so widths sum to 100.\n width: i === count - 1 ? 100 - width * (count - 1) : width,\n }));\n // Keep content from dropped columns by moving it into the last remaining one.\n const dropped = columns.slice(count).flatMap((c) => c.blocks);\n next[count - 1] = {\n ...next[count - 1],\n blocks: [...next[count - 1].blocks, ...dropped],\n };\n return next;\n}\n\nexport interface EmailBlockSettingsProps {\n block: EmailBlock;\n design: Required<EmailDesignSettings>;\n onChange: (patch: Partial<EmailBlock>) => void;\n onAddToColumn: (columnIndex: number, block: EmailContentBlock) => void;\n labels: EmailEditorLabels;\n variableGroups?: RichTextVariableGroup[];\n onUploadImage?: (file: File) => Promise<string>;\n}\n\nexport function EmailBlockSettings({\n block,\n design,\n onChange,\n onAddToColumn,\n labels,\n variableGroups,\n onUploadImage,\n}: EmailBlockSettingsProps) {\n const f = labels.fields;\n const o = labels.options;\n const set = onChange as Patch<typeof block>;\n const alignOptions: { value: EmailAlignment; label: string }[] = [\n { value: 'left', label: o.left },\n { value: 'center', label: o.center },\n { value: 'right', label: o.right },\n ];\n const alignment = (\n value: EmailAlignment | undefined,\n fallback: EmailAlignment\n ) => (\n <SelectField\n label={f.alignment}\n value={value ?? fallback}\n options={alignOptions}\n onChange={(v) => onChange({ alignment: v } as Partial<EmailBlock>)}\n />\n );\n const uploadRef = React.useRef<HTMLInputElement>(null);\n const [uploading, setUploading] = React.useState(false);\n const [uploadFailed, setUploadFailed] = React.useState(false);\n // HTML the editor just emitted is already live in its document; sanitising it\n // again would normalise it, and the strictly controlled editor would rewrite\n // its content to match (losing the caret).\n const emitted = React.useRef<string | null>(null);\n // The editor captures `mediaUpload` once, when it mounts; reading the latest\n // `onUploadImage` through a ref keeps paste uploads in sync with the host's\n // current callback (added, swapped, or removed after mount) without\n // rebuilding the editor and losing the user's editing state.\n const onUploadImageRef = React.useRef(onUploadImage);\n onUploadImageRef.current = onUploadImage;\n const uploadPastedImage = React.useCallback(async (file: File) => {\n const upload = onUploadImageRef.current;\n if (!upload) {\n // The media extension catches rejections and inserts nothing — parity\n // with the legacy editor, where pasted image files never survived the\n // sanitiser — but leaves a console trace for debuggability.\n throw new Error(\n 'EmailEditor: pasted file skipped — no onUploadImage handler'\n );\n }\n return upload(file);\n }, []);\n\n switch (block.type) {\n case 'heading':\n return (\n <>\n <TextField\n label={f.text}\n value={block.text}\n onChange={(text) => set({ text })}\n />\n <SelectField\n label={f.level}\n value={String(block.level) as '1'}\n options={['1', '2', '3', '4'].map((v) => ({\n value: v as '1',\n label: `H${v}`,\n }))}\n onChange={(v) => set({ level: Number(v) as 1 })}\n />\n {alignment(block.alignment, 'left')}\n <ColorField\n label={f.color}\n value={block.color}\n fallback={design.headingColor}\n onChange={(color) => set({ color })}\n />\n </>\n );\n case 'text':\n return (\n <>\n <TextAreaRichKerebron\n aria-label={f.content}\n value={\n block.content === emitted.current\n ? block.content\n : (sanitizeEmailHtml(block.content) ?? '')\n }\n onChange={(content) => {\n emitted.current = content;\n set({ content });\n }}\n // Declares the policy pasted markup must pass. The Kerebron\n // surface filters pastes through the ProseMirror schema (a\n // stricter subset); stored content is still sanitised on every\n // exit (canvas preview and MJML render).\n sanitizeHtml={(html) => sanitizeEmailHtml(html) ?? ''}\n // A pasted image file must not become a base64 `data:` URL — the\n // email URL policy (`isSafeUrl`) strips those on render, leaving a\n // broken image. The always-present stable handler routes files\n // through the host's current uploader, or rejects (= skips the\n // file) without one. No videos in email text blocks.\n mediaUpload={{\n uploadHandler: uploadPastedImage,\n allowedVideoTypes: [],\n }}\n // Task lists serialize checkbox <input>s, which the sanitiser\n // forbids and no mail client would honour — dropping the nodes\n // removes the menu item, input rule and paste handling together.\n omitExtensions={EMAIL_OMITTED_EXTENSIONS}\n variableGroups={variableGroups}\n enableDictation={false}\n defaultToolbar=\"visible\"\n />\n {alignment(block.alignment, 'left')}\n <ColorField\n label={f.color}\n value={block.color}\n fallback={design.textColor}\n onChange={(color) => set({ color })}\n />\n </>\n );\n case 'button':\n return (\n <>\n <TextField\n label={f.text}\n value={block.text}\n onChange={(text) => set({ text })}\n />\n <TextField\n label={f.url}\n value={block.url}\n onChange={(url) => set({ url })}\n />\n {alignment(block.alignment, 'center')}\n <ColorField\n label={f.backgroundColor}\n value={block.backgroundColor}\n fallback={design.buttonBackgroundColor}\n onChange={(backgroundColor) => set({ backgroundColor })}\n />\n <ColorField\n label={f.textColor}\n value={block.textColor}\n fallback={design.buttonTextColor}\n onChange={(textColor) => set({ textColor })}\n />\n <NumberField\n label={f.borderRadius}\n value={block.borderRadius ?? design.buttonBorderRadius}\n max={100}\n onChange={(borderRadius) => set({ borderRadius })}\n />\n <SwitchField\n label={f.fullWidth}\n value={block.fullWidth}\n onChange={(fullWidth) => set({ fullWidth })}\n />\n </>\n );\n case 'image':\n return (\n <>\n <TextField\n label={f.imageUrl}\n value={block.src}\n onChange={(src) => set({ src })}\n />\n {onUploadImage && (\n <>\n <input\n ref={uploadRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"sr-only\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onChange={async (e) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (!file) return;\n setUploading(true);\n setUploadFailed(false);\n try {\n set({ src: await onUploadImage(file) });\n } catch {\n setUploadFailed(true);\n } finally {\n setUploading(false);\n }\n }}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n isLoading={uploading}\n leftIcon={<Upload className=\"h-4 w-4\" aria-hidden=\"true\" />}\n onClick={() => uploadRef.current?.click()}\n >\n {f.uploadImage}\n </Button>\n {uploadFailed && (\n <p role=\"alert\" className=\"text-destructive text-sm\">\n {f.uploadFailed}\n </p>\n )}\n </>\n )}\n <TextField\n label={f.altText}\n value={block.alt}\n onChange={(alt) => set({ alt })}\n />\n <TextField\n label={f.url}\n value={block.href}\n onChange={(href) => set({ href })}\n />\n <TextField\n label={f.width}\n value={block.width === undefined ? '' : String(block.width)}\n placeholder=\"100%\"\n onChange={(width) =>\n set({ width: /^\\d+$/.test(width) ? Number(width) : width })\n }\n />\n <NumberField\n label={f.borderRadius}\n value={block.borderRadius}\n max={100}\n onChange={(borderRadius) => set({ borderRadius })}\n />\n {alignment(block.alignment, 'center')}\n </>\n );\n case 'divider':\n return (\n <>\n <SelectField\n label={f.style}\n value={block.style ?? 'solid'}\n options={(['solid', 'dashed', 'dotted'] as const).map((v) => ({\n value: v,\n label: o[v],\n }))}\n onChange={(style) => set({ style })}\n />\n <ColorField\n label={f.color}\n value={block.color}\n onChange={(color) => set({ color })}\n />\n <TextField\n label={f.width}\n value={block.width}\n placeholder=\"100%\"\n onChange={(width) => set({ width })}\n />\n </>\n );\n case 'spacer':\n return (\n <NumberField\n label={f.height}\n value={block.height}\n max={400}\n onChange={(height) => set({ height })}\n />\n );\n case 'social':\n return (\n <>\n {alignment(block.alignment, 'center')}\n <SelectField\n label={f.iconSize}\n value={block.iconSize ?? 'md'}\n options={(['sm', 'md', 'lg'] as const).map((v) => ({\n value: v,\n label: o[v],\n }))}\n onChange={(iconSize) => set({ iconSize })}\n />\n {block.links.map((link, i) => {\n const update = (patch: Partial<typeof link>) =>\n set({\n links: block.links.map((l, j) =>\n j === i ? { ...l, ...patch } : l\n ),\n });\n return (\n <fieldset\n key={i}\n className=\"border-border space-y-2 rounded-md border p-3\"\n >\n <legend className=\"sr-only\">\n {f.socialLink.replace('{number}', String(i + 1))}\n </legend>\n <SelectField\n label={f.platform}\n value={link.platform}\n options={SOCIAL_PLATFORMS.map((p) => ({\n value: p,\n label: labels.platforms[p],\n }))}\n onChange={(platform) => update({ platform })}\n />\n <TextField\n label={f.url}\n value={link.url}\n onChange={(url) => update({ url })}\n />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n leftIcon={<Trash2 className=\"h-4 w-4\" aria-hidden=\"true\" />}\n onClick={() =>\n set({ links: block.links.filter((_, j) => j !== i) })\n }\n >\n {f.removeLink}\n </Button>\n </fieldset>\n );\n })}\n <Button\n variant=\"outline\"\n size=\"sm\"\n leftIcon={<Plus className=\"h-4 w-4\" aria-hidden=\"true\" />}\n onClick={() =>\n set({\n links: [\n ...block.links,\n { platform: 'website', url: 'https://' },\n ],\n })\n }\n >\n {f.addLink}\n </Button>\n </>\n );\n case 'html':\n return (\n <Textarea\n label={f.html}\n value={block.html}\n rows={10}\n className=\"font-mono text-xs\"\n onChange={(e) => set({ html: e.target.value })}\n />\n );\n case 'footer':\n return (\n <>\n <TextField\n label={f.companyName}\n value={block.companyName}\n onChange={(companyName) => set({ companyName })}\n />\n <TextField\n label={f.address}\n value={block.address}\n onChange={(address) => set({ address })}\n />\n <TextField\n label={f.phone}\n value={block.phone}\n onChange={(phone) => set({ phone })}\n />\n <SwitchField\n label={f.showUnsubscribe}\n value={block.showUnsubscribe}\n onChange={(showUnsubscribe) => set({ showUnsubscribe })}\n />\n {block.showUnsubscribe && (\n <TextField\n label={f.unsubscribeText}\n value={block.unsubscribeText}\n onChange={(unsubscribeText) => set({ unsubscribeText })}\n />\n )}\n <TextField\n label={f.managePreferencesUrl}\n value={block.managePreferencesUrl}\n onChange={(managePreferencesUrl) => set({ managePreferencesUrl })}\n />\n <TextField\n label={f.managePreferencesText}\n value={block.managePreferencesText}\n onChange={(managePreferencesText) => set({ managePreferencesText })}\n />\n {alignment(block.alignment, 'center')}\n <ColorField\n label={f.color}\n value={block.color}\n onChange={(color) => set({ color })}\n />\n </>\n );\n case 'quote':\n return (\n <>\n <TextField\n multiline\n label={f.text}\n value={block.text}\n onChange={(text) => set({ text })}\n />\n <TextField\n label={f.author}\n value={block.author}\n onChange={(author) => set({ author })}\n />\n <TextField\n label={f.role}\n value={block.role}\n onChange={(role) => set({ role })}\n />\n {alignment(block.alignment, 'left')}\n <ColorField\n label={f.backgroundColor}\n value={block.backgroundColor}\n onChange={(backgroundColor) => set({ backgroundColor })}\n />\n <ColorField\n label={f.textColor}\n value={block.textColor}\n onChange={(textColor) => set({ textColor })}\n />\n <ColorField\n label={f.accentColor}\n value={block.accentColor}\n fallback={design.linkColor}\n onChange={(accentColor) => set({ accentColor })}\n />\n </>\n );\n case 'table': {\n const cols = Math.max(1, ...block.rows.map((r) => r.length));\n const setCell = (r: number, c: number, value: string) =>\n set({\n rows: block.rows.map((row, i) =>\n i === r ? row.map((cell, j) => (j === c ? value : cell)) : row\n ),\n });\n return (\n <>\n <SwitchField\n label={f.headerRow}\n value={block.headerRow}\n onChange={(headerRow) => set({ headerRow })}\n />\n <div\n className=\"grid gap-1\"\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {block.rows.map((row, r) =>\n row.map((cell, c) => (\n <input\n key={`${r}-${c}`}\n aria-label={f.cell\n .replace('{row}', String(r + 1))\n .replace('{column}', String(c + 1))}\n value={cell}\n onChange={(e) => setCell(r, c, e.target.value)}\n className=\"border-input bg-background text-foreground focus-visible:ring-ring h-8 min-w-0 rounded-md border px-2 text-sm focus-visible:ring-2 focus-visible:outline-none\"\n />\n ))\n )}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() =>\n set({ rows: [...block.rows, Array(cols).fill('')] })\n }\n >\n {f.addRow}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => set({ rows: block.rows.map((r) => [...r, '']) })}\n >\n {f.addColumn}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={block.rows.length <= 1}\n onClick={() => set({ rows: block.rows.slice(0, -1) })}\n >\n {f.removeRow}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={cols <= 1}\n onClick={() =>\n set({ rows: block.rows.map((r) => r.slice(0, -1)) })\n }\n >\n {f.removeColumn}\n </Button>\n </div>\n {alignment(block.alignment, 'left')}\n <ColorField\n label={f.borderColor}\n value={block.borderColor}\n onChange={(borderColor) => set({ borderColor })}\n />\n <ColorField\n label={f.headerBackgroundColor}\n value={block.headerBackgroundColor}\n onChange={(headerBackgroundColor) => set({ headerBackgroundColor })}\n />\n <ColorField\n label={f.headerTextColor}\n value={block.headerTextColor}\n onChange={(headerTextColor) => set({ headerTextColor })}\n />\n </>\n );\n }\n case 'hero':\n return (\n <>\n <TextField\n label={f.categoryText}\n value={block.categoryText}\n onChange={(categoryText) => set({ categoryText })}\n />\n <TextField\n label={f.headline}\n value={block.headline}\n onChange={(headline) => set({ headline })}\n />\n <TextField\n multiline\n label={f.subtitle}\n value={block.subtitle}\n onChange={(subtitle) => set({ subtitle })}\n />\n <TextField\n label={f.ctaText}\n value={block.ctaText}\n onChange={(ctaText) => set({ ctaText })}\n />\n <TextField\n label={f.ctaUrl}\n value={block.ctaUrl}\n onChange={(ctaUrl) => set({ ctaUrl })}\n />\n {alignment(block.alignment, 'center')}\n <ColorField\n label={f.backgroundColor}\n value={block.backgroundColor}\n onChange={(backgroundColor) => set({ backgroundColor })}\n />\n <TextField\n label={f.backgroundGradient}\n value={block.backgroundGradient}\n placeholder=\"linear-gradient(135deg, #1e3a5f, #2563eb)\"\n onChange={(backgroundGradient) => set({ backgroundGradient })}\n />\n <ColorField\n label={f.textColor}\n value={block.textColor}\n onChange={(textColor) => set({ textColor })}\n />\n <ColorField\n label={f.ctaColor}\n value={block.ctaColor}\n onChange={(ctaColor) => set({ ctaColor })}\n />\n <NumberField\n label={f.padding}\n value={block.padding}\n max={200}\n onChange={(padding) => set({ padding })}\n />\n </>\n );\n case 'columns':\n return (\n <>\n <SelectField\n label={f.columnCount}\n value={String(block.columnCount) as '1'}\n options={['1', '2', '3'].map((v) => ({\n value: v as '1',\n label: v,\n }))}\n onChange={(v) => {\n const columnCount = Number(v) as 1 | 2 | 3;\n set({\n columnCount,\n columns: resizeColumns(block.columns, columnCount),\n });\n }}\n />\n <ColorField\n label={f.backgroundColor}\n value={block.backgroundColor}\n onChange={(backgroundColor) => set({ backgroundColor })}\n />\n {block.columns.map((column, i) => (\n <Select\n key={column.id}\n label={`${labels.addBlock} — ${labels.column} ${i + 1}`}\n placeholder={labels.addBlock}\n value=\"\"\n options={CONTENT_BLOCK_TYPES.map((type) => ({\n value: type,\n label: labels.blockTypes[type],\n }))}\n onValueChange={(type) =>\n onAddToColumn(\n i,\n createEmailBlock(\n type as EmailContentBlock['type']\n ) as EmailContentBlock\n )\n }\n />\n ))}\n </>\n );\n }\n}\n\nconst FONT_OPTIONS = [\n 'Arial, Helvetica, sans-serif',\n 'Helvetica, Arial, sans-serif',\n 'Verdana, Geneva, sans-serif',\n 'Tahoma, Geneva, sans-serif',\n \"'Trebuchet MS', Helvetica, sans-serif\",\n 'Georgia, serif',\n \"'Times New Roman', Times, serif\",\n \"'Courier New', Courier, monospace\",\n];\n\nexport interface EmailDesignPanelProps {\n design: Required<EmailDesignSettings>;\n onChange: (patch: Partial<EmailDesignSettings>) => void;\n labels: EmailEditorLabels;\n}\n\nexport function EmailDesignPanel({\n design,\n onChange,\n labels,\n}: EmailDesignPanelProps) {\n const f = labels.fields;\n const fonts = FONT_OPTIONS.includes(design.fontFamily)\n ? FONT_OPTIONS\n : [design.fontFamily, ...FONT_OPTIONS];\n return (\n <>\n <SelectField\n label={f.fontFamily}\n value={design.fontFamily}\n options={fonts.map((font) => ({\n value: font,\n label: font.split(',')[0].replace(/'/g, ''),\n }))}\n onChange={(fontFamily) => onChange({ fontFamily })}\n />\n <NumberField\n label={f.contentWidth}\n value={design.contentWidth}\n min={320}\n max={1200}\n onChange={(contentWidth) => onChange({ contentWidth })}\n />\n {(\n [\n 'bodyBackgroundColor',\n 'contentBackgroundColor',\n 'textColor',\n 'headingColor',\n 'linkColor',\n 'buttonBackgroundColor',\n 'buttonTextColor',\n ] as const\n ).map((key) => (\n <ColorField\n key={key}\n label={f[key]}\n value={design[key]}\n onChange={(v) => onChange({ [key]: v })}\n />\n ))}\n <NumberField\n label={f.buttonBorderRadius}\n value={design.buttonBorderRadius}\n max={100}\n onChange={(buttonBorderRadius) => onChange({ buttonBorderRadius })}\n />\n </>\n );\n}\n","import type { EmailBlockType, EmailSocialPlatform } from './types';\n\nexport const defaultEmailEditorLabels = {\n blocks: 'Blocks',\n design: 'Design',\n blockSettings: 'Block settings',\n undo: 'Undo',\n redo: 'Redo',\n viewport: 'Preview width',\n desktop: 'Desktop',\n mobile: 'Mobile',\n canvas: 'Email canvas',\n moveUp: 'Move up',\n moveDown: 'Move down',\n duplicate: 'Duplicate',\n remove: 'Delete',\n dragHandle: 'Drag to reorder',\n addBlock: 'Add block',\n emptyCanvas: 'Drag a block here, or click one in the palette.',\n emptyColumn: 'Empty column',\n unsupportedBlock:\n 'Unsupported block ({type}). It will not be included in the sent email.',\n noSelection: 'Select a block in the canvas to edit it.',\n column: 'Column',\n selectBlock: 'Select {item}',\n announceAdded: '{item} added.',\n announceMoved: '{item} moved to position {position}.',\n announceDuplicated: '{item} duplicated.',\n announceRemoved: '{item} deleted.',\n blockTypes: {\n heading: 'Heading',\n text: 'Text',\n button: 'Button',\n image: 'Image',\n divider: 'Divider',\n spacer: 'Spacer',\n columns: 'Columns',\n social: 'Social links',\n hero: 'Hero banner',\n html: 'Custom HTML',\n footer: 'Footer',\n quote: 'Quote',\n table: 'Table',\n } satisfies Record<EmailBlockType, string>,\n platforms: {\n facebook: 'Facebook',\n twitter: 'Twitter',\n linkedin: 'LinkedIn',\n instagram: 'Instagram',\n youtube: 'YouTube',\n github: 'GitHub',\n website: 'Website',\n } satisfies Record<EmailSocialPlatform, string>,\n fields: {\n text: 'Text',\n content: 'Content',\n level: 'Level',\n alignment: 'Alignment',\n color: 'Color',\n textColor: 'Text color',\n backgroundColor: 'Background color',\n backgroundGradient: 'Background gradient (CSS)',\n accentColor: 'Accent color',\n url: 'Link URL',\n borderRadius: 'Corner radius (px)',\n fullWidth: 'Full width',\n imageUrl: 'Image URL',\n uploadImage: 'Upload image',\n uploadFailed: 'The image could not be uploaded. Try again.',\n altText: 'Alt text',\n width: 'Width (px or %)',\n style: 'Style',\n height: 'Height (px)',\n iconSize: 'Icon size',\n platform: 'Platform',\n socialLink: 'Link {number}',\n addLink: 'Add link',\n removeLink: 'Remove link',\n html: 'HTML',\n companyName: 'Company name',\n address: 'Address',\n phone: 'Phone',\n showUnsubscribe: 'Show unsubscribe link',\n unsubscribeText: 'Unsubscribe text',\n managePreferencesUrl: 'Preferences URL',\n managePreferencesText: 'Preferences text',\n author: 'Author',\n role: 'Role',\n headerRow: 'First row is a header',\n headerBackgroundColor: 'Header background',\n headerTextColor: 'Header text color',\n borderColor: 'Border color',\n addRow: 'Add row',\n addColumn: 'Add column',\n removeRow: 'Remove last row',\n removeColumn: 'Remove last column',\n cell: 'Row {row}, column {column}',\n categoryText: 'Eyebrow',\n headline: 'Headline',\n subtitle: 'Subtitle',\n ctaText: 'Button text',\n ctaUrl: 'Button URL',\n ctaColor: 'Button color',\n padding: 'Vertical padding (px)',\n columnCount: 'Columns',\n bodyBackgroundColor: 'Page background',\n contentBackgroundColor: 'Content background',\n contentWidth: 'Content width (px)',\n fontFamily: 'Font',\n headingColor: 'Heading color',\n linkColor: 'Link color',\n buttonBackgroundColor: 'Button color',\n buttonTextColor: 'Button text color',\n buttonBorderRadius: 'Button corner radius (px)',\n },\n options: {\n left: 'Left',\n center: 'Center',\n right: 'Right',\n solid: 'Solid',\n dashed: 'Dashed',\n dotted: 'Dotted',\n sm: 'Small',\n md: 'Medium',\n lg: 'Large',\n },\n};\n\nexport type EmailEditorLabels = typeof defaultEmailEditorLabels;\n\nexport type EmailEditorLabelOverrides = {\n [K in keyof EmailEditorLabels]?: EmailEditorLabels[K] extends string\n ? string\n : Partial<EmailEditorLabels[K]>;\n};\n\nexport function mergeEmailEditorLabels(\n overrides: EmailEditorLabelOverrides | undefined\n): EmailEditorLabels {\n if (!overrides) return defaultEmailEditorLabels;\n const d = defaultEmailEditorLabels;\n return {\n ...d,\n ...overrides,\n blockTypes: { ...d.blockTypes, ...overrides.blockTypes },\n platforms: { ...d.platforms, ...overrides.platforms },\n fields: { ...d.fields, ...overrides.fields },\n options: { ...d.options, ...overrides.options },\n } as EmailEditorLabels;\n}\n","import {\n generateEmailBlockId,\n type EmailBlock,\n type EmailContentBlock,\n} from './types';\n\ntype Edit = <B extends EmailBlock>(list: B[], index: number) => B[];\n\n/** Apply `edit` to whichever list (top level or a column) contains `id`. */\nfunction editContaining<B extends EmailBlock>(\n blocks: B[],\n id: string,\n edit: Edit\n): B[] {\n const index = blocks.findIndex((b) => b.id === id);\n if (index !== -1) return edit(blocks, index);\n let changed = false;\n const next = blocks.map((block) => {\n if (block.type !== 'columns') return block;\n let hit = false;\n const columns = block.columns.map((column) => {\n const inner = editContaining(column.blocks, id, edit);\n if (inner === column.blocks) return column;\n hit = changed = true;\n return { ...column, blocks: inner };\n });\n return hit ? { ...block, columns } : block;\n });\n return changed ? next : blocks;\n}\n\nexport function findEmailBlock(\n blocks: EmailBlock[],\n id: string | null\n): EmailBlock | undefined {\n if (!id) return undefined;\n for (const block of blocks) {\n if (block.id === id) return block;\n if (block.type === 'columns') {\n for (const column of block.columns) {\n const found = findEmailBlock(column.blocks, id);\n if (found) return found;\n }\n }\n }\n return undefined;\n}\n\nexport function updateEmailBlock(\n blocks: EmailBlock[],\n id: string,\n patch: Partial<EmailBlock>\n): EmailBlock[] {\n return editContaining(blocks, id, (list, i) =>\n list.map((b, j) => (j === i ? ({ ...b, ...patch } as typeof b) : b))\n );\n}\n\nexport function removeEmailBlock(\n blocks: EmailBlock[],\n id: string\n): EmailBlock[] {\n return editContaining(blocks, id, (list, i) =>\n list.filter((_, j) => j !== i)\n );\n}\n\nexport function moveEmailBlock(\n blocks: EmailBlock[],\n id: string,\n delta: number\n): EmailBlock[] {\n return editContaining(blocks, id, (list, i) => {\n const target = i + delta;\n if (target < 0 || target >= list.length) return list;\n const next = [...list];\n const [moved] = next.splice(i, 1);\n next.splice(target, 0, moved);\n return next;\n });\n}\n\nfunction cloneWithNewIds<B extends EmailBlock>(block: B): B {\n const copy = { ...block, id: generateEmailBlockId() };\n if (copy.type === 'columns') {\n copy.columns = copy.columns.map((column) => ({\n ...column,\n id: generateEmailBlockId(),\n blocks: column.blocks.map(cloneWithNewIds),\n }));\n }\n return copy;\n}\n\n/** Returns the new list and the copy's id. */\nexport function duplicateEmailBlock(\n blocks: EmailBlock[],\n id: string\n): { blocks: EmailBlock[]; newId: string | null } {\n let newId: string | null = null;\n const next = editContaining(blocks, id, (list, i) => {\n const copy = cloneWithNewIds(list[i]);\n newId = copy.id;\n return [...list.slice(0, i + 1), copy, ...list.slice(i + 1)];\n });\n return { blocks: next, newId };\n}\n\nexport function addBlockToColumn(\n blocks: EmailBlock[],\n columnsId: string,\n columnIndex: number,\n block: EmailContentBlock\n): EmailBlock[] {\n return blocks.map((b) =>\n b.id === columnsId && b.type === 'columns'\n ? {\n ...b,\n columns: b.columns.map((column, i) =>\n i === columnIndex\n ? { ...column, blocks: [...column.blocks, block] }\n : column\n ),\n }\n : b\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport {\n DndContext,\n DragOverlay,\n PointerSensor,\n closestCenter,\n useDraggable,\n useDroppable,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n} from '@dnd-kit/core';\nimport {\n SortableContext,\n arrayMove,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport {\n ChevronDown,\n ChevronUp,\n Code,\n Columns2,\n Copy,\n GripVertical,\n Heading,\n Image as ImageIcon,\n Megaphone,\n Minus,\n Monitor,\n MousePointerClick,\n MoveVertical,\n PanelBottom,\n Quote,\n Redo2,\n Share2,\n Smartphone,\n Table,\n Trash2,\n Type,\n Undo2,\n} from 'lucide-react';\n\nimport { useLiveAnnouncement } from '../../hooks/useLiveAnnouncement';\nimport { cn } from '../../utils/cn';\nimport type { RichTextVariableGroup } from '../RichTextEditor';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '../Tabs';\nimport { EmailBlockPreview } from './EmailBlockPreview';\nimport {\n Button,\n EmailBlockSettings,\n EmailDesignPanel,\n} from './EmailBlockSettings';\nimport {\n mergeEmailEditorLabels,\n type EmailEditorLabelOverrides,\n type EmailEditorLabels,\n} from './labels';\nimport { normalizeDesignSettings } from './renderEmailMjml';\nimport {\n addBlockToColumn,\n duplicateEmailBlock,\n findEmailBlock,\n moveEmailBlock,\n removeEmailBlock,\n updateEmailBlock,\n} from './tree';\nimport {\n createEmailBlock,\n resolveDesignSettings,\n type EmailBlock,\n type EmailBlockType,\n type EmailContentBlock,\n type EmailContentTree,\n type EmailDesignSettings,\n type EmailMergeTag,\n} from './types';\n\nconst BLOCK_ICONS: Record<EmailBlockType, React.ElementType> = {\n hero: Megaphone,\n columns: Columns2,\n heading: Heading,\n text: Type,\n button: MousePointerClick,\n image: ImageIcon,\n divider: Minus,\n spacer: MoveVertical,\n social: Share2,\n quote: Quote,\n table: Table,\n html: Code,\n footer: PanelBottom,\n};\n\nexport const EMAIL_BLOCK_TYPES = Object.keys(BLOCK_ICONS) as EmailBlockType[];\n\nconst PALETTE = 'palette:';\nconst CANVAS_END = 'canvas:end';\nconst MOBILE_WIDTH = 375;\n\nfunction fill(\n template: string,\n values: Record<string, string | number>\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) =>\n String(values[key] ?? '')\n );\n}\n\ninterface Snapshot {\n tree: EmailContentTree;\n design: EmailDesignSettings | undefined;\n /** Which controlled channels the commit that created this entry changed. */\n changed: { tree: boolean; design: boolean };\n}\n\nexport interface EmailEditorProps {\n /** The email document. Controlled. */\n value: EmailContentTree;\n /** Called with the next document after every edit. */\n onChange: (value: EmailContentTree) => void;\n /** Global colours, font and width. Merged over `createDefaultDesignSettings()`. */\n design?: EmailDesignSettings;\n /** Enables the Design tab. Omit to make design settings read-only. */\n onDesignChange?: (design: EmailDesignSettings) => void;\n /** Merge fields offered in the text block's Variables menu. */\n mergeTags?: EmailMergeTag[];\n /** Palette order and availability. Defaults to every block type. */\n blockTypes?: EmailBlockType[];\n /** Upload handler for image blocks; resolve with the hosted URL. */\n onUploadImage?: (file: File) => Promise<string>;\n /** Override any user-facing string. */\n labels?: EmailEditorLabelOverrides;\n className?: string;\n}\n\ninterface BlockFrameProps {\n block: EmailBlock;\n selected: boolean;\n labels: EmailEditorLabels;\n onSelect: () => void;\n onMove: (delta: number) => void;\n onDuplicate: () => void;\n onRemove: () => void;\n isFirst: boolean;\n isLast: boolean;\n dragHandle?: React.ReactNode;\n children: React.ReactNode;\n}\n\nfunction BlockFrame({\n block,\n selected,\n labels,\n onSelect,\n onMove,\n onDuplicate,\n onRemove,\n isFirst,\n isLast,\n dragHandle,\n children,\n}: BlockFrameProps) {\n // `?? type` names unsupported block types from host documents at runtime.\n const name = labels.blockTypes[block.type] ?? block.type;\n const tool = 'text-muted-foreground hover:text-foreground h-7 w-7';\n // Frames nest inside columns, so a child's click must not also select its parent.\n const own = (action: () => void) => (e: React.MouseEvent) => {\n e.stopPropagation();\n action();\n };\n return (\n <div\n data-slot=\"email-editor-block\"\n data-selected={selected || undefined}\n className={cn(\n 'relative outline-offset-[-2px]',\n selected\n ? 'outline-primary-500 outline outline-2'\n : 'hover:outline-primary-300 focus-within:outline-primary-300 focus-within:outline-1 focus-within:outline-dashed hover:outline-1 hover:outline-dashed'\n )}\n >\n <div\n data-slot=\"email-editor-block-toolbar\"\n className={cn(\n 'bg-background border-border absolute end-2 -top-3.5 z-10 flex items-center rounded-md border shadow-sm',\n // Reveal on hover of this frame only, not of a frame nested inside it.\n !selected &&\n 'opacity-0 focus-within:opacity-100 [[data-slot=email-editor-block]:hover:not(:has([data-slot=email-editor-block]:hover))>&]:opacity-100'\n )}\n >\n {dragHandle}\n <button\n type=\"button\"\n aria-pressed={selected}\n aria-label={fill(labels.selectBlock, { item: name })}\n onClick={own(onSelect)}\n className=\"text-foreground focus-visible:ring-ring rounded px-2 text-xs font-medium focus-visible:ring-2 focus-visible:outline-none\"\n >\n {name}\n </button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={tool}\n aria-label={labels.moveUp}\n disabled={isFirst}\n onClick={own(() => onMove(-1))}\n >\n <ChevronUp className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={tool}\n aria-label={labels.moveDown}\n disabled={isLast}\n onClick={own(() => onMove(1))}\n >\n <ChevronDown className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={tool}\n aria-label={labels.duplicate}\n onClick={own(onDuplicate)}\n >\n <Copy className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(tool, 'hover:text-destructive')}\n aria-label={labels.remove}\n onClick={own(onRemove)}\n >\n <Trash2 className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n </div>\n {/* Mouse shortcut for the Select button in the toolbar above. */}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n <div\n onClick={(e) => {\n e.stopPropagation();\n // A preview link reached by keyboard must select, not navigate away.\n if ((e.target as HTMLElement).closest('a')) e.preventDefault();\n onSelect();\n }}\n className=\"cursor-pointer [&_a]:pointer-events-none\"\n >\n {children}\n </div>\n </div>\n );\n}\n\nfunction SortableBlock({\n id,\n children,\n}: {\n id: string;\n children: (handle: React.ReactNode) => React.ReactNode;\n}) {\n const {\n setNodeRef,\n setActivatorNodeRef,\n listeners,\n transform,\n transition,\n isDragging,\n } = useSortable({ id });\n // Pointer-only: keyboard users reorder with the Move up/down buttons.\n const handle = (\n <span\n ref={setActivatorNodeRef}\n {...listeners}\n aria-hidden=\"true\"\n className=\"text-muted-foreground flex h-7 w-6 cursor-grab touch-none items-center justify-center\"\n >\n <GripVertical className=\"h-4 w-4\" />\n </span>\n );\n return (\n <div\n ref={setNodeRef}\n style={{ transform: CSS.Transform.toString(transform), transition }}\n className={cn(isDragging && 'relative z-20 opacity-60')}\n >\n {children(handle)}\n </div>\n );\n}\n\nfunction PaletteItem({\n type,\n label,\n onAdd,\n}: {\n type: EmailBlockType;\n label: string;\n onAdd: () => void;\n}) {\n const { setNodeRef, listeners } = useDraggable({ id: PALETTE + type });\n const Icon = BLOCK_ICONS[type];\n return (\n <button\n ref={setNodeRef}\n type=\"button\"\n onPointerDown={\n listeners?.onPointerDown as React.PointerEventHandler | undefined\n }\n onClick={onAdd}\n className=\"border-border bg-background hover:bg-muted hover:border-primary-300 text-foreground focus-visible:ring-ring flex w-24 shrink-0 flex-col items-center gap-1 rounded-md border p-2 text-xs focus-visible:ring-2 focus-visible:outline-none lg:w-auto\"\n >\n <Icon className=\"text-muted-foreground h-5 w-5\" aria-hidden=\"true\" />\n {label}\n </button>\n );\n}\n\nfunction CanvasEnd({ empty, label }: { empty: boolean; label: string }) {\n const { setNodeRef, isOver } = useDroppable({ id: CANVAS_END });\n return (\n <div\n ref={setNodeRef}\n className={cn(\n 'text-muted-foreground flex items-center justify-center text-center text-sm',\n empty\n ? 'border-border m-4 min-h-32 rounded-md border-2 border-dashed p-6'\n : 'min-h-8',\n isOver && 'bg-primary-500/10'\n )}\n >\n {empty && label}\n </div>\n );\n}\n\n/**\n * Block-based email builder: palette, sortable canvas, per-block settings and\n * global design. Serialise the document with `renderEmailMjml`.\n */\nexport const EmailEditor = React.forwardRef<HTMLDivElement, EmailEditorProps>(\n (\n {\n value,\n onChange,\n design: designProp,\n onDesignChange,\n mergeTags,\n blockTypes = EMAIL_BLOCK_TYPES,\n onUploadImage,\n labels: labelOverrides,\n className,\n },\n ref\n ) => {\n const labels = React.useMemo(\n () => mergeEmailEditorLabels(labelOverrides),\n [labelOverrides]\n );\n const design = React.useMemo(\n () => normalizeDesignSettings(designProp),\n [designProp]\n );\n const [selectedId, setSelectedId] = React.useState<string | null>(null);\n const [viewport, setViewport] = React.useState<'desktop' | 'mobile'>(\n 'desktop'\n );\n const [dragging, setDragging] = React.useState<string | null>(null);\n const [past, setPast] = React.useState<Snapshot[]>([]);\n const [future, setFuture] = React.useState<Snapshot[]>([]);\n const [announcement, announce] = useLiveAnnouncement();\n\n const variableGroups = React.useMemo<\n RichTextVariableGroup[] | undefined\n >(() => {\n if (!mergeTags?.length) return undefined;\n const groups = new Map<string, RichTextVariableGroup>();\n for (const tag of mergeTags) {\n const group = groups.get(tag.group) ?? {\n label: tag.group,\n variables: [],\n };\n group.variables.push({ label: tag.label, value: tag.token });\n groups.set(tag.group, group);\n }\n return [...groups.values()];\n }, [mergeTags]);\n\n // Async edits (image uploads) must land on the document as it is when they finish.\n const latest = React.useRef({ value, designProp, onChange });\n React.useEffect(() => {\n latest.current = { value, designProp, onChange };\n });\n\n const present = (changed: Snapshot['changed']): Snapshot => ({\n tree: value,\n design: designProp,\n changed,\n });\n const commit = (\n tree: EmailContentTree,\n nextDesign?: EmailDesignSettings\n ) => {\n const current = latest.current;\n const changed = {\n tree: tree !== current.value,\n design: Boolean(nextDesign),\n };\n if (!changed.tree && !changed.design) return;\n setPast((p) => [\n ...p.slice(-49),\n { tree: current.value, design: current.designProp, changed },\n ]);\n setFuture([]);\n if (changed.tree) current.onChange(tree);\n if (nextDesign) onDesignChange?.(nextDesign);\n };\n const setBlocks = (blocks: EmailBlock[]) => commit({ ...value, blocks });\n const patchBlock = (id: string, patch: Partial<EmailBlock>) => {\n const doc = latest.current.value;\n if (!findEmailBlock(doc.blocks, id)) return;\n commit({ ...doc, blocks: updateEmailBlock(doc.blocks, id, patch) });\n };\n // Only replay the channels the entry's commit changed: a design-only undo\n // must not overwrite a document the host may have updated since (and vice\n // versa), nor fire a spurious onChange.\n const restore = (snapshot: Snapshot) => {\n if (snapshot.changed.tree) onChange(snapshot.tree);\n if (snapshot.changed.design) onDesignChange?.(snapshot.design ?? {});\n };\n const undo = () => {\n const previous = past[past.length - 1];\n if (!previous) return;\n setPast((p) => p.slice(0, -1));\n setFuture((f) => [present(previous.changed), ...f]);\n restore(previous);\n };\n const redo = () => {\n const next = future[0];\n if (!next) return;\n setFuture((f) => f.slice(1));\n setPast((p) => [...p, present(next.changed)]);\n restore(next);\n };\n\n // `?? type` covers unsupported block types from host documents at runtime.\n const nameOf = (type: EmailBlockType) => labels.blockTypes[type] ?? type;\n\n const insertBlock = (type: EmailBlockType, index?: number) => {\n const block = createEmailBlock(type);\n const blocks = [...value.blocks];\n // The selection may sit inside columns; insert after its top-level container.\n const selectedIndex = blocks.findIndex((b) =>\n Boolean(findEmailBlock([b], selectedId))\n );\n const at =\n index ?? (selectedIndex === -1 ? blocks.length : selectedIndex + 1);\n blocks.splice(at, 0, block);\n setBlocks(blocks);\n setSelectedId(block.id);\n announce(fill(labels.announceAdded, { item: nameOf(type) }));\n };\n\n const selected = findEmailBlock(value.blocks, selectedId);\n\n const frameProps = (\n block: EmailBlock,\n siblings: EmailBlock[],\n index: number\n ) => ({\n block,\n labels,\n selected: block.id === selectedId,\n isFirst: index === 0,\n isLast: index === siblings.length - 1,\n onSelect: () => setSelectedId(block.id),\n onMove: (delta: number) => {\n setBlocks(moveEmailBlock(value.blocks, block.id, delta));\n announce(\n fill(labels.announceMoved, {\n item: nameOf(block.type),\n position: index + 1 + delta,\n })\n );\n },\n onDuplicate: () => {\n const { blocks, newId } = duplicateEmailBlock(value.blocks, block.id);\n setBlocks(blocks);\n setSelectedId(newId);\n announce(fill(labels.announceDuplicated, { item: nameOf(block.type) }));\n },\n onRemove: () => {\n setBlocks(removeEmailBlock(value.blocks, block.id));\n if (findEmailBlock([block], selectedId)) setSelectedId(null);\n announce(fill(labels.announceRemoved, { item: nameOf(block.type) }));\n },\n });\n\n const renderPreview = (block: EmailBlock) => (\n <EmailBlockPreview\n block={block}\n design={design}\n emptyColumnLabel={labels.emptyColumn}\n unsupportedBlockLabel={labels.unsupportedBlock}\n platformLabels={labels.platforms}\n renderChild={(child) => {\n const column =\n block.type === 'columns'\n ? block.columns.find((c) =>\n c.blocks.some((b) => b.id === child.id)\n )\n : undefined;\n const siblings = column?.blocks ?? [];\n return (\n <BlockFrame\n {...frameProps(child, siblings, siblings.indexOf(child))}\n >\n {renderPreview(child)}\n </BlockFrame>\n );\n }}\n />\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } })\n );\n\n const onDragStart = (event: DragStartEvent) =>\n setDragging(String(event.active.id));\n const onDragEnd = ({ active, over }: DragEndEvent) => {\n setDragging(null);\n if (!over) return;\n const activeId = String(active.id);\n const overId = String(over.id);\n const overIndex = value.blocks.findIndex((b) => b.id === overId);\n if (activeId.startsWith(PALETTE)) {\n insertBlock(\n activeId.slice(PALETTE.length) as EmailBlockType,\n overIndex === -1 ? value.blocks.length : overIndex\n );\n return;\n }\n const from = value.blocks.findIndex((b) => b.id === activeId);\n const to = overId === CANVAS_END ? value.blocks.length - 1 : overIndex;\n if (from === -1 || to === -1 || from === to) return;\n setBlocks(arrayMove(value.blocks, from, to));\n announce(\n fill(labels.announceMoved, {\n item: nameOf(value.blocks[from].type),\n position: to + 1,\n })\n );\n };\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n const target = event.target as HTMLElement;\n if (target.closest('input, textarea, select, [contenteditable=\"true\"]'))\n return;\n if (!(event.metaKey || event.ctrlKey) || event.key.toLowerCase() !== 'z')\n return;\n event.preventDefault();\n if (event.shiftKey) redo();\n else undo();\n };\n\n const draggingType = dragging?.startsWith(PALETTE)\n ? (dragging.slice(PALETTE.length) as EmailBlockType)\n : (value.blocks.find((b) => b.id === dragging)?.type ?? null);\n\n const panel = 'border-border bg-background flex min-h-0 flex-col';\n const panelBody = 'flex flex-col gap-3 overflow-y-auto p-4';\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragCancel={() => setDragging(null)}\n >\n {/* Undo/redo shortcuts for the whole editor; text fields keep their native undo. */}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div\n ref={ref}\n data-slot=\"email-editor\"\n onKeyDown={onKeyDown}\n className={cn(\n 'border-border bg-muted/30 text-foreground flex min-h-[640px] flex-col overflow-hidden rounded-lg border lg:flex-row',\n className\n )}\n >\n <aside\n data-slot=\"email-editor-palette\"\n className={cn(panel, 'border-b lg:w-64 lg:border-e lg:border-b-0')}\n >\n <Tabs\n defaultValue=\"blocks\"\n className=\"flex min-h-0 flex-1 flex-col\"\n >\n <TabsList className=\"px-2\">\n <TabsTrigger value=\"blocks\">{labels.blocks}</TabsTrigger>\n {onDesignChange && (\n <TabsTrigger value=\"design\">{labels.design}</TabsTrigger>\n )}\n </TabsList>\n <TabsContent value=\"blocks\" className=\"overflow-y-auto p-3\">\n <div\n className=\"flex gap-2 overflow-x-auto pb-1 lg:grid lg:grid-cols-2 lg:overflow-visible lg:pb-0\"\n aria-label={labels.addBlock}\n role=\"group\"\n >\n {blockTypes.map((type) => (\n <PaletteItem\n key={type}\n type={type}\n label={nameOf(type)}\n onAdd={() => insertBlock(type)}\n />\n ))}\n </div>\n </TabsContent>\n {onDesignChange && (\n <TabsContent value=\"design\" className={panelBody}>\n {/* Raw values, so an in-progress colour (`#12…`) is not snapped\n back to a fallback; only the canvas and MJML normalise. */}\n <EmailDesignPanel\n design={resolveDesignSettings(designProp)}\n labels={labels}\n onChange={(patch) =>\n commit(value, { ...designProp, ...patch })\n }\n />\n </TabsContent>\n )}\n </Tabs>\n </aside>\n\n <section\n data-slot=\"email-editor-canvas\"\n aria-label={labels.canvas}\n className=\"flex min-w-0 flex-1 flex-col\"\n >\n <div className=\"border-border bg-background flex items-center gap-1 border-b px-3 py-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.undo}\n title={labels.undo}\n disabled={!past.length}\n onClick={undo}\n >\n <Undo2 className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.redo}\n title={labels.redo}\n disabled={!future.length}\n onClick={redo}\n >\n <Redo2 className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n <div\n role=\"group\"\n aria-label={labels.viewport}\n className=\"ms-auto flex gap-1\"\n >\n {(\n [\n ['desktop', Monitor, labels.desktop],\n ['mobile', Smartphone, labels.mobile],\n ] as const\n ).map(([mode, Icon, label]) => (\n <Button\n key={mode}\n variant={viewport === mode ? 'secondary' : 'ghost'}\n size=\"icon\"\n aria-label={label}\n title={label}\n aria-pressed={viewport === mode}\n onClick={() => setViewport(mode)}\n >\n <Icon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n ))}\n </div>\n </div>\n {/* Clicking the bare backdrop clears the selection. */}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n <div\n className=\"flex-1 overflow-auto px-2 py-8 sm:px-6\"\n style={{ background: design.bodyBackgroundColor }}\n onClick={(e) =>\n e.target === e.currentTarget && setSelectedId(null)\n }\n >\n <div\n dir=\"ltr\"\n className=\"mx-auto shadow-sm transition-[width]\"\n style={{\n width:\n viewport === 'mobile' ? MOBILE_WIDTH : design.contentWidth,\n maxWidth: '100%',\n background: design.contentBackgroundColor,\n color: design.textColor,\n fontFamily: design.fontFamily,\n fontSize: 16,\n lineHeight: 1.6,\n }}\n >\n <SortableContext\n items={value.blocks.map((b) => b.id)}\n strategy={verticalListSortingStrategy}\n >\n {value.blocks.map((block, index) => (\n <SortableBlock key={block.id} id={block.id}>\n {(handle) => (\n <BlockFrame\n {...frameProps(block, value.blocks, index)}\n dragHandle={handle}\n >\n {renderPreview(block)}\n </BlockFrame>\n )}\n </SortableBlock>\n ))}\n </SortableContext>\n <CanvasEnd\n empty={!value.blocks.length}\n label={labels.emptyCanvas}\n />\n </div>\n </div>\n </section>\n\n <aside\n data-slot=\"email-editor-settings\"\n aria-label={labels.blockSettings}\n className={cn(panel, 'border-t lg:w-80 lg:border-s lg:border-t-0')}\n >\n <h2 className=\"border-border border-b px-4 py-3 text-sm font-semibold\">\n {selected ? nameOf(selected.type) : labels.blockSettings}\n </h2>\n <div className={panelBody}>\n {selected ? (\n <EmailBlockSettings\n key={selected.id}\n block={selected}\n design={design}\n labels={labels}\n variableGroups={variableGroups}\n onUploadImage={onUploadImage}\n onChange={(patch) => patchBlock(selected.id, patch)}\n onAddToColumn={(columnIndex, block: EmailContentBlock) => {\n setBlocks(\n addBlockToColumn(\n value.blocks,\n selected.id,\n columnIndex,\n block\n )\n );\n setSelectedId(block.id);\n announce(\n fill(labels.announceAdded, { item: nameOf(block.type) })\n );\n }}\n />\n ) : (\n <p className=\"text-muted-foreground text-sm\">\n {labels.noSelection}\n </p>\n )}\n </div>\n </aside>\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n </div>\n <DragOverlay dropAnimation={null}>\n {draggingType && dragging?.startsWith(PALETTE) ? (\n <div className=\"bg-background border-primary-500 text-foreground rounded-md border px-3 py-2 text-xs font-medium shadow-lg\">\n {nameOf(draggingType)}\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n );\n }\n);\n\nEmailEditor.displayName = 'EmailEditor';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/EmailEditor/types.ts","../src/components/EmailEditor/renderEmailMjml.ts","../src/components/EmailEditor/EmailBlockPreview.tsx","../src/components/EmailEditor/EmailBlockSettings.tsx","../src/components/EmailEditor/labels.ts","../src/components/EmailEditor/tree.ts","../src/components/EmailEditor/EmailEditor.tsx"],"names":["HEADING_SIZES","React","ImageIcon","Button","jsx","jsxs","React2","Fragment","Trash2"],"mappings":"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","file":"chunk-ETAYMSCW.js","sourcesContent":["/**\n * Email document model. Field names match Waggleline's email builder, so\n * documents built from this shared block set move between the two without\n * migration. The union is closed: hosts with product-specific blocks must\n * convert them to these types (or drop them) before loading a document.\n * Unrecognised blocks are preserved in the document but render as an\n * \"unsupported block\" placeholder in the canvas and are omitted from the MJML.\n */\n\nexport type EmailAlignment = 'left' | 'center' | 'right';\n\nexport interface EmailBlockBase {\n id: string;\n}\n\nexport interface EmailHeadingBlock extends EmailBlockBase {\n type: 'heading';\n level: 1 | 2 | 3 | 4;\n text: string;\n alignment?: EmailAlignment;\n color?: string;\n}\n\nexport interface EmailTextBlock extends EmailBlockBase {\n type: 'text';\n /**\n * HTML. Existing values are stored as-is and sanitised on every output\n * (editing surface, canvas preview, `renderEmailMjml`); only HTML pasted or\n * dropped into the editor is sanitised before it is stored.\n */\n content: string;\n alignment?: EmailAlignment;\n color?: string;\n}\n\nexport interface EmailButtonBlock extends EmailBlockBase {\n type: 'button';\n text: string;\n url: string;\n alignment?: EmailAlignment;\n backgroundColor?: string;\n textColor?: string;\n borderRadius?: number;\n fullWidth?: boolean;\n}\n\nexport interface EmailImageBlock extends EmailBlockBase {\n type: 'image';\n src: string;\n alt: string;\n href?: string;\n width?: number | string;\n borderRadius?: number;\n alignment?: EmailAlignment;\n}\n\nexport interface EmailDividerBlock extends EmailBlockBase {\n type: 'divider';\n style?: 'solid' | 'dashed' | 'dotted';\n color?: string;\n width?: string;\n}\n\nexport interface EmailSpacerBlock extends EmailBlockBase {\n type: 'spacer';\n height: number;\n}\n\nexport interface EmailColumn {\n id: string;\n blocks: EmailContentBlock[];\n /** Percentage; a row's columns should sum to 100. */\n width?: number;\n backgroundColor?: string;\n}\n\nexport interface EmailColumnsBlock extends EmailBlockBase {\n type: 'columns';\n columnCount: 1 | 2 | 3;\n columns: EmailColumn[];\n backgroundColor?: string;\n}\n\nexport type EmailSocialPlatform =\n | 'facebook'\n | 'twitter'\n | 'linkedin'\n | 'instagram'\n | 'youtube'\n | 'github'\n | 'website';\n\nexport interface EmailSocialLink {\n platform: EmailSocialPlatform;\n url: string;\n}\n\nexport interface EmailSocialBlock extends EmailBlockBase {\n type: 'social';\n alignment?: EmailAlignment;\n iconSize?: 'sm' | 'md' | 'lg';\n links: EmailSocialLink[];\n}\n\nexport interface EmailHeroBlock extends EmailBlockBase {\n type: 'hero';\n headline: string;\n subtitle?: string;\n categoryText?: string;\n ctaText?: string;\n ctaUrl?: string;\n backgroundColor?: string;\n /** `linear-`/`radial-gradient(...)`; clients without CSS gradients fall back to `backgroundColor`. */\n backgroundGradient?: string;\n textColor?: string;\n ctaColor?: string;\n alignment?: EmailAlignment;\n padding?: number;\n}\n\nexport interface EmailHtmlBlock extends EmailBlockBase {\n type: 'html';\n html: string;\n}\n\nexport interface EmailFooterBlock extends EmailBlockBase {\n type: 'footer';\n companyName?: string;\n address?: string;\n phone?: string;\n showUnsubscribe: boolean;\n unsubscribeText?: string;\n managePreferencesUrl?: string;\n managePreferencesText?: string;\n alignment?: EmailAlignment;\n color?: string;\n}\n\nexport interface EmailQuoteBlock extends EmailBlockBase {\n type: 'quote';\n text: string;\n author?: string;\n role?: string;\n alignment?: EmailAlignment;\n backgroundColor?: string;\n textColor?: string;\n accentColor?: string;\n}\n\nexport interface EmailTableBlock extends EmailBlockBase {\n type: 'table';\n rows: string[][];\n headerRow?: boolean;\n borderColor?: string;\n headerBackgroundColor?: string;\n headerTextColor?: string;\n alignment?: EmailAlignment;\n}\n\n/** Blocks that can sit inside a column. */\nexport type EmailContentBlock =\n | EmailHeadingBlock\n | EmailTextBlock\n | EmailButtonBlock\n | EmailImageBlock\n | EmailDividerBlock\n | EmailSpacerBlock\n | EmailSocialBlock\n | EmailHtmlBlock\n | EmailFooterBlock\n | EmailQuoteBlock\n | EmailTableBlock;\n\nexport type EmailBlock = EmailContentBlock | EmailColumnsBlock | EmailHeroBlock;\n\nexport type EmailBlockType = EmailBlock['type'];\n\nexport interface EmailContentTree {\n version: string;\n blocks: EmailBlock[];\n}\n\nexport interface EmailDesignSettings {\n bodyBackgroundColor?: string;\n contentBackgroundColor?: string;\n /** Content width in px. */\n contentWidth?: number;\n textColor?: string;\n fontFamily?: string;\n headingColor?: string;\n linkColor?: string;\n buttonBackgroundColor?: string;\n buttonTextColor?: string;\n buttonBorderRadius?: number;\n}\n\n/** A merge field offered in the editor, e.g. `{{first_name}}`. */\nexport interface EmailMergeTag {\n token: string;\n label: string;\n group: string;\n}\n\n/** Blocks that only make sense at the top level of the email. */\nexport const FULL_WIDTH_BLOCK_TYPES: readonly EmailBlockType[] = [\n 'hero',\n 'columns',\n];\n\nexport function isContentBlock(block: EmailBlock): block is EmailContentBlock {\n return !FULL_WIDTH_BLOCK_TYPES.includes(block.type);\n}\n\nexport function generateEmailBlockId(): string {\n return (\n globalThis.crypto?.randomUUID?.() ??\n `b${Date.now().toString(36)}${Math.random().toString(36).slice(2, 10)}`\n );\n}\n\n// Email clients need literal colours, so these defaults are data, not theme tokens.\nexport function createDefaultDesignSettings(): Required<EmailDesignSettings> {\n return {\n bodyBackgroundColor: '#f4f4f5',\n contentBackgroundColor: '#ffffff',\n contentWidth: 600,\n textColor: '#374151',\n fontFamily: 'Arial, Helvetica, sans-serif',\n headingColor: '#111827',\n linkColor: '#2563eb',\n buttonBackgroundColor: '#2563eb',\n buttonTextColor: '#ffffff',\n buttonBorderRadius: 6,\n };\n}\n\n/** Defaults overlaid with the fields `design` actually sets; `undefined` inherits. */\nexport function resolveDesignSettings(\n design: EmailDesignSettings | undefined\n): Required<EmailDesignSettings> {\n const defined = Object.entries(design ?? {}).filter(\n ([, v]) => v !== undefined\n );\n return { ...createDefaultDesignSettings(), ...Object.fromEntries(defined) };\n}\n\nexport function createEmailBlock<T extends EmailBlockType>(\n type: T\n): Extract<EmailBlock, { type: T }> {\n return newBlock(type) as Extract<EmailBlock, { type: T }>;\n}\n\nfunction newBlock(type: EmailBlockType): EmailBlock {\n const id = generateEmailBlockId();\n switch (type) {\n case 'heading':\n return { id, type, level: 2, text: 'Heading', alignment: 'left' };\n case 'text':\n return { id, type, content: '<p>Write your message here.</p>' };\n case 'button':\n return {\n id,\n type,\n text: 'Learn more',\n url: 'https://',\n alignment: 'center',\n };\n case 'image':\n return { id, type, src: '', alt: '', alignment: 'center' };\n case 'divider':\n return { id, type, style: 'solid', color: '#e5e7eb' };\n case 'spacer':\n return { id, type, height: 24 };\n case 'social':\n return {\n id,\n type,\n alignment: 'center',\n iconSize: 'md',\n links: [\n { platform: 'linkedin', url: 'https://linkedin.com' },\n { platform: 'website', url: 'https://' },\n ],\n };\n case 'html':\n return { id, type, html: '<p>Custom HTML</p>' };\n case 'footer':\n return {\n id,\n type,\n showUnsubscribe: true,\n unsubscribeText: 'Unsubscribe from these emails',\n alignment: 'center',\n color: '#6b7280',\n };\n case 'quote':\n return {\n id,\n type,\n text: 'A short testimonial.',\n author: 'Name',\n role: 'Title',\n };\n case 'table':\n return {\n id,\n type,\n headerRow: true,\n rows: [\n ['Item', 'Detail'],\n ['', ''],\n ],\n };\n case 'hero':\n return {\n id,\n type,\n headline: 'Big announcement',\n subtitle: 'One line that says why it matters.',\n ctaText: 'Read more',\n ctaUrl: 'https://',\n backgroundColor: '#1e3a5f',\n textColor: '#ffffff',\n alignment: 'center',\n padding: 48,\n };\n case 'columns':\n return {\n id,\n type,\n columnCount: 2,\n columns: [\n { id: generateEmailBlockId(), width: 50, blocks: [] },\n { id: generateEmailBlockId(), width: 50, blocks: [] },\n ],\n };\n }\n}\n\nexport function createEmptyEmailContentTree(): EmailContentTree {\n return {\n version: '1.0',\n blocks: [\n {\n ...createEmailBlock('heading'),\n level: 1,\n text: 'Your email title',\n alignment: 'center',\n },\n createEmailBlock('text'),\n createEmailBlock('footer'),\n ],\n };\n}\n","import DOMPurify from 'dompurify';\n\nimport {\n createDefaultDesignSettings,\n resolveDesignSettings,\n type EmailAlignment,\n type EmailBlock,\n type EmailContentBlock,\n type EmailContentTree,\n type EmailDesignSettings,\n type EmailHeroBlock,\n type EmailSocialPlatform,\n} from './types';\n\nexport interface RenderEmailMjmlOptions {\n design?: EmailDesignSettings;\n /**\n * Sanitises the HTML of `text` and `html` blocks. Defaults to DOMPurify with\n * the email policy, which needs a DOM — on a server pass\n * `createEmailHtmlSanitizer(new JSDOM('').window)` so the same policy applies\n * (vanilla DOMPurify over jsdom would enforce far less).\n */\n sanitizeHtml?: (html: string) => string;\n /** `href` of the footer's unsubscribe link. Defaults to `{{unsubscribe_url}}`. */\n unsubscribeUrl?: string;\n}\n\ninterface Ctx {\n design: Required<EmailDesignSettings>;\n sanitize: (html: string) => string;\n unsubscribeUrl: string;\n}\n\nexport function escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Allows http(s), mailto, tel, anchors, root-relative paths and a single\n * complete `{{merge}}` token. A token with a suffix (`{{base}}/path`) is\n * rejected: its safety depends on the expansion, so hosts composing URLs from\n * tokens must revalidate after merge expansion.\n */\nexport function isSafeUrl(value: string | undefined): boolean {\n // After the leading slash, a second slash, backslash or whitespace would let\n // URL parsers (which strip tabs/newlines and treat `\\` as `/`) read the path\n // as a network-path URL on an attacker's origin. The merge-token branch is\n // anchored to the end so `{{empty}}javascript:...` cannot smuggle a scheme.\n return /^(https?:|mailto:|tel:|#|\\/(?![/\\\\\\s])|\\{\\{[^{}]*\\}\\}$)/i.test(\n (value ?? '').trim()\n );\n}\n\n/** `value` when `isSafeUrl` accepts it (HTML-escaped for interpolation), else `#`. */\nexport function safeUrl(value: string | undefined): string {\n const url = (value ?? '').trim();\n return isSafeUrl(url) ? escapeHtml(url) : '#';\n}\n\n// Hex colours only come in 3, 4, 6 or 8 digits; 5 or 7 would be invalid CSS.\nconst COLOR =\n /^(#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})|(rgb|rgba|hsl|hsla)\\([\\d\\s.,%]+\\)|[a-z]+)$/i;\n\nexport function safeColor(value: string | undefined, fallback: string): string {\n return value && COLOR.test(value.trim()) ? value.trim() : fallback;\n}\n\nexport function safeGradient(value: string | undefined): string | null {\n const gradient = value?.trim() ?? '';\n return /^(linear|radial)-gradient\\([^;{}<>\"()]*(\\([^;{}<>\"()]*\\)[^;{}<>\"()]*)*\\)$/i.test(\n gradient\n ) && !/url\\s*\\(/i.test(gradient)\n ? gradient\n : null;\n}\n\nfunction heroGradient(block: EmailHeroBlock): string | null {\n return /^[\\w-]+$/.test(block.id)\n ? safeGradient(block.backgroundGradient)\n : null;\n}\n\n/** The canvas preview and `renderHero` must agree on when the CTA exists. */\nexport function hasHeroCta(block: EmailHeroBlock): boolean {\n return Boolean(block.ctaText && block.ctaUrl);\n}\n\nfunction align(\n value: EmailAlignment | undefined,\n fallback: EmailAlignment\n): EmailAlignment {\n return value === 'left' || value === 'center' || value === 'right'\n ? value\n : fallback;\n}\n\nfunction px(value: unknown, fallback: number, max = 2000): number {\n const n = Number(value);\n return Number.isFinite(n)\n ? Math.min(Math.max(Math.round(n), 0), max)\n : fallback;\n}\n\nconst SANITIZE_CONFIG = {\n FORBID_TAGS: ['style', 'form', 'input', 'textarea', 'select', 'button'],\n // Host CSS classes (e.g. `fixed inset-0`) and ids would escape the style\n // allowlist; srcset/xlink:href would escape the URL policy below.\n FORBID_ATTR: ['class', 'id', 'srcset', 'xlink:href'],\n};\n\n// DOMPurify's default URI policy is looser than this component's (it permits\n// protocol-relative URLs, ftp:, cid:, ...), so URL attributes get `isSafeUrl`.\nconst URL_ATTRIBUTES = new Set(['href', 'src', 'background', 'poster']);\n\n// Formatting only: anything that can position, layer or load (url()) is dropped.\nconst SAFE_STYLE_PROPERTY =\n /^(color|background-color|font(-[a-z]+)?|text-(align|decoration|transform|indent)|line-height|letter-spacing|word-spacing|white-space|vertical-align|(margin|padding)(-(top|right|bottom|left))?|border(-(top|right|bottom|left))?(-(width|style|color))?|border-(collapse|spacing|radius)|(max-|min-)?(width|height)|display|list-style(-type)?)$/;\n\nexport function sanitizeInlineStyle(style: string): string {\n return style\n .split(';')\n .map((declaration) => {\n const colon = declaration.indexOf(':');\n if (colon === -1) return '';\n const property = declaration.slice(0, colon).trim().toLowerCase();\n const value = declaration.slice(colon + 1).trim();\n return SAFE_STYLE_PROPERTY.test(property) &&\n value &&\n !/url\\s*\\(|expression\\s*\\(|@import|[<>\\\\]/i.test(value) &&\n // Negative margins could pull content over the surrounding page.\n !(property.startsWith('margin') && value.includes('-'))\n ? `${property}: ${value}`\n : '';\n })\n .filter(Boolean)\n .join('; ');\n}\n\nlet purifier: ReturnType<typeof DOMPurify> | null | undefined;\n\nfunction installEmailPolicy(instance: ReturnType<typeof DOMPurify>) {\n instance.addHook('uponSanitizeAttribute', (_node, data) => {\n if (URL_ATTRIBUTES.has(data.attrName)) {\n // Validate only; DOMPurify escapes attribute values when serialising.\n if (!isSafeUrl(data.attrValue)) data.keepAttr = false;\n return;\n }\n if (data.attrName !== 'style') return;\n data.attrValue = sanitizeInlineStyle(data.attrValue);\n if (!data.attrValue) data.keepAttr = false;\n });\n return instance;\n}\n\n/**\n * The email sanitation policy on a caller-supplied window, for environments\n * without a global DOM: `createEmailHtmlSanitizer(new JSDOM('').window)`.\n * Vanilla DOMPurify is NOT equivalent — it would keep class/id attributes,\n * positioning styles and URL schemes this policy rejects.\n */\nexport function createEmailHtmlSanitizer(\n win: Parameters<typeof DOMPurify>[0]\n): (html: string) => string {\n const instance = DOMPurify(win);\n if (!instance.isSupported) {\n throw new Error(\n 'createEmailHtmlSanitizer: the supplied window cannot run DOMPurify.'\n );\n }\n installEmailPolicy(instance);\n return (html) => instance.sanitize(html, SANITIZE_CONFIG);\n}\n\n// A private instance, so the policy hook never leaks into other DOMPurify users.\nfunction getPurifier() {\n if (purifier !== undefined) return purifier;\n if (typeof window === 'undefined') return null;\n const instance = DOMPurify(window);\n if (!instance.isSupported) return (purifier = null);\n return (purifier = installEmailPolicy(instance));\n}\n\n/** DOMPurify with the email policy, or `null` where there is no DOM. */\nexport function sanitizeEmailHtml(html: string): string | null {\n return getPurifier()?.sanitize(html, SANITIZE_CONFIG) ?? null;\n}\n\nfunction defaultSanitize(html: string): string {\n const clean = sanitizeEmailHtml(html);\n if (clean === null) {\n throw new Error(\n 'renderEmailMjml: no DOM is available to sanitise HTML. Pass options.sanitizeHtml.'\n );\n }\n return clean;\n}\n\nconst HEADING_SIZES = { 1: 32, 2: 26, 3: 22, 4: 18 } as const;\n\nconst SOCIAL_NAMES: Record<EmailSocialPlatform, string> = {\n facebook: 'facebook-noshare',\n twitter: 'twitter-noshare',\n linkedin: 'linkedin-noshare',\n instagram: 'instagram',\n youtube: 'youtube',\n github: 'github',\n website: 'web',\n};\n\nconst ICON_SIZES = { sm: 20, md: 25, lg: 35 } as const;\n\n/** Renders one block as column content; `available` is the usable width in px. */\nfunction renderContent(\n block: EmailContentBlock,\n ctx: Ctx,\n pad: string,\n available: number\n): string {\n const { design } = ctx;\n switch (block.type) {\n case 'heading': {\n const level = HEADING_SIZES[block.level] ? block.level : 2;\n const color = safeColor(block.color, design.headingColor);\n const size = HEADING_SIZES[level];\n // Inline size: clients scale h1-h4 relative to the mj-text font size.\n return `<mj-text align=\"${align(block.alignment, 'left')}\" font-size=\"${size}px\" font-weight=\"bold\" color=\"${color}\" padding=\"${pad}\"><h${level} style=\"font-size: ${size}px; line-height: 1.25;\">${escapeHtml(block.text)}</h${level}></mj-text>`;\n }\n case 'text': {\n const color = block.color\n ? ` color=\"${safeColor(block.color, design.textColor)}\"`\n : '';\n return `<mj-text align=\"${align(block.alignment, 'left')}\"${color} padding=\"${pad}\">${ctx.sanitize(block.content)}</mj-text>`;\n }\n case 'button': {\n const bg = safeColor(block.backgroundColor, design.buttonBackgroundColor);\n const fg = safeColor(block.textColor, design.buttonTextColor);\n const radius = px(\n block.borderRadius ?? design.buttonBorderRadius,\n 6,\n 100\n );\n const width = block.fullWidth ? ' width=\"100%\"' : '';\n return `<mj-button align=\"${align(block.alignment, 'center')}\" background-color=\"${bg}\" color=\"${fg}\" border-radius=\"${radius}px\" href=\"${safeUrl(block.url)}\" font-size=\"16px\" padding=\"${pad}\"${width}>${escapeHtml(block.text)}</mj-button>`;\n }\n case 'image': {\n if (!block.src) return '';\n // mj-image only accepts px; a percentage becomes px of the usable width.\n // Unambiguous alternation: `\\d*\\.?\\d+` backtracks polynomially (CodeQL).\n const percent = /^(\\d+(?:\\.\\d+)?|\\.\\d+)%$/.exec(\n String(block.width ?? '').trim()\n );\n const share = percent ? Math.min(Number(percent[1]), 100) : 0;\n const widthPx = percent\n ? Math.round((available * share) / 100)\n : parseInt(String(block.width ?? ''), 10);\n const width =\n Number.isFinite(widthPx) && widthPx > 0 && share !== 100\n ? ` width=\"${px(widthPx, 600)}px\"`\n : '';\n const href = block.href ? ` href=\"${safeUrl(block.href)}\"` : '';\n const radius = block.borderRadius\n ? ` border-radius=\"${px(block.borderRadius, 0, 100)}px\"`\n : '';\n return `<mj-image src=\"${safeUrl(block.src)}\" alt=\"${escapeHtml(block.alt ?? '')}\" align=\"${align(block.alignment, 'center')}\"${width} padding=\"${pad}\"${href}${radius} />`;\n }\n case 'divider': {\n const style = ['solid', 'dashed', 'dotted'].includes(block.style ?? '')\n ? block.style\n : 'solid';\n const width = /^\\d+(px|%)$/.test(block.width ?? '')\n ? block.width\n : '100%';\n return `<mj-divider border-color=\"${safeColor(block.color, '#e5e7eb')}\" border-style=\"${style}\" border-width=\"1px\" width=\"${width}\" padding=\"${pad}\" />`;\n }\n case 'spacer':\n return `<mj-spacer height=\"${px(block.height, 24, 400)}px\" />`;\n case 'social': {\n const size = ICON_SIZES[block.iconSize ?? 'md'] ?? ICON_SIZES.md;\n const items = block.links\n .filter((link) => SOCIAL_NAMES[link.platform])\n .map(\n (link) =>\n `<mj-social-element name=\"${SOCIAL_NAMES[link.platform]}\" href=\"${safeUrl(link.url)}\" icon-size=\"${size}px\" />`\n )\n .join('');\n return `<mj-social align=\"${align(block.alignment, 'center')}\" icon-size=\"${size}px\" mode=\"horizontal\" padding=\"${pad}\">${items}</mj-social>`;\n }\n case 'html':\n return `<mj-raw>${ctx.sanitize(block.html)}</mj-raw>`;\n case 'footer': {\n const color = safeColor(block.color, '#6b7280');\n const lines = [block.companyName, block.address, block.phone]\n .filter((line): line is string => Boolean(line))\n .map(escapeHtml);\n const links: string[] = [];\n if (block.showUnsubscribe) {\n links.push(\n `<a href=\"${safeUrl(ctx.unsubscribeUrl)}\" style=\"color: ${color};\">${escapeHtml(block.unsubscribeText || 'Unsubscribe')}</a>`\n );\n }\n if (block.managePreferencesUrl) {\n links.push(\n `<a href=\"${safeUrl(block.managePreferencesUrl)}\" style=\"color: ${color};\">${escapeHtml(block.managePreferencesText || 'Manage preferences')}</a>`\n );\n }\n if (links.length) lines.push(links.join(' '));\n return `<mj-text align=\"${align(block.alignment, 'center')}\" color=\"${color}\" font-size=\"12px\" padding=\"${pad}\">${lines.join('<br />')}</mj-text>`;\n }\n case 'quote': {\n const fg = safeColor(block.textColor, '#1e293b');\n const accent = safeColor(block.accentColor, design.linkColor);\n const bg = safeColor(block.backgroundColor, '#f8fafc');\n let attribution = '';\n if (block.author) {\n attribution = `<p style=\"margin: 12px 0 0; font-weight: 600;\">${escapeHtml(block.author)}</p>`;\n if (block.role) {\n attribution += `<p style=\"margin: 2px 0 0; font-size: 13px; opacity: 0.75;\">${escapeHtml(block.role)}</p>`;\n }\n }\n return `<mj-text align=\"${align(block.alignment, 'left')}\" color=\"${fg}\" container-background-color=\"${bg}\" padding=\"${pad}\"><div style=\"border-left: 4px solid ${accent}; padding: 8px 0 8px 16px;\"><p style=\"font-size: 18px; font-style: italic; line-height: 1.6; margin: 0;\">“${escapeHtml(block.text)}”</p>${attribution}</div></mj-text>`;\n }\n case 'table': {\n if (!block.rows.length) return '';\n const border = safeColor(block.borderColor, '#e5e7eb');\n const headBg = safeColor(block.headerBackgroundColor, '#f3f4f6');\n const headFg = safeColor(block.headerTextColor, design.headingColor);\n const textAlign = align(block.alignment, 'left');\n const rows = block.rows\n .map((row, r) => {\n const head = block.headerRow && r === 0;\n const tag = head ? 'th' : 'td';\n const style = head\n ? `background-color: ${headBg}; color: ${headFg}; font-weight: 600; `\n : '';\n return `<tr>${row\n .map(\n (cell) =>\n `<${tag} style=\"${style}padding: 10px 12px; border: 1px solid ${border}; text-align: ${textAlign};\">${escapeHtml(cell)}</${tag}>`\n )\n .join('')}</tr>`;\n })\n .join('');\n return `<mj-table padding=\"${pad}\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" css-class=\"email-table\">${rows}</mj-table>`;\n }\n // Unsupported block types (host-owned blocks in a loaded document) are\n // omitted from the email; the canvas shows a placeholder for them.\n default:\n return '';\n }\n}\n\nfunction renderHero(block: EmailHeroBlock): string {\n const bg = safeColor(block.backgroundColor, '#1e3a5f');\n const fg = safeColor(block.textColor, '#ffffff');\n const a = align(block.alignment, 'center');\n const parts: string[] = [];\n if (block.categoryText) {\n parts.push(\n `<mj-text align=\"${a}\" color=\"${fg}\" font-size=\"12px\" font-weight=\"700\" letter-spacing=\"2px\" text-transform=\"uppercase\" padding=\"0 0 8px 0\">${escapeHtml(block.categoryText)}</mj-text>`\n );\n }\n parts.push(\n `<mj-text align=\"${a}\" color=\"${fg}\" font-size=\"32px\" font-weight=\"bold\" line-height=\"1.2\" padding=\"0 0 8px 0\"><h1 style=\"color: ${fg}; margin: 0; font-size: 32px; line-height: 1.2;\">${escapeHtml(block.headline)}</h1></mj-text>`\n );\n if (block.subtitle) {\n parts.push(\n `<mj-text align=\"${a}\" color=\"${fg}\" font-size=\"16px\" line-height=\"1.5\" padding=\"0 0 16px 0\">${escapeHtml(block.subtitle)}</mj-text>`\n );\n }\n if (hasHeroCta(block)) {\n parts.push(\n `<mj-button align=\"${a}\" background-color=\"${safeColor(block.ctaColor, '#ffffff')}\" color=\"${bg}\" font-size=\"16px\" font-weight=\"600\" border-radius=\"6px\" padding=\"8px 0\" href=\"${safeUrl(block.ctaUrl)}\">${escapeHtml(block.ctaText ?? '')}</mj-button>`\n );\n }\n const gradient = heroGradient(block)\n ? ` css-class=\"hero-gradient-${block.id}\"`\n : '';\n return `<mj-section full-width=\"full-width\" background-color=\"${bg}\" padding=\"${px(block.padding, 48, 200)}px 25px\"${gradient}><mj-column>${parts.join('')}</mj-column></mj-section>`;\n}\n\nfunction renderBlock(block: EmailBlock, ctx: Ctx): string {\n if (block.type === 'hero') return renderHero(block);\n if (block.type === 'columns') {\n const bg = block.backgroundColor\n ? ` background-color=\"${safeColor(block.backgroundColor, 'transparent')}\"`\n : '';\n const columns = block.columns\n .map((column) => {\n const width = column.width\n ? ` width=\"${px(column.width, 50, 100)}%\"`\n : '';\n const colBg = column.backgroundColor\n ? ` background-color=\"${safeColor(column.backgroundColor, 'transparent')}\"`\n : '';\n const share = px(column.width ?? 100 / block.columns.length, 50, 100);\n const available =\n Math.round((ctx.design.contentWidth * share) / 100) - 24;\n const inner = column.blocks\n .map((b) => renderContent(b, ctx, '8px 12px', available))\n .join('');\n return `<mj-column${width}${colBg}>${inner || '<mj-text> </mj-text>'}</mj-column>`;\n })\n .join('');\n return `<mj-section${bg}>${columns}</mj-section>`;\n }\n const content = renderContent(\n block,\n ctx,\n '10px 25px',\n ctx.design.contentWidth - 50\n );\n return content\n ? `<mj-section><mj-column>${content}</mj-column></mj-section>`\n : '';\n}\n\n/**\n * Serialises an email document to MJML. Compile the result with `mjml` (server)\n * or `mjml-browser` to get client-safe HTML.\n */\n/** Defaults plus `design`, with every colour, width and font validated. */\nexport function normalizeDesignSettings(\n design: EmailDesignSettings | undefined\n): Required<EmailDesignSettings> {\n const defaults = createDefaultDesignSettings();\n const d = resolveDesignSettings(design);\n const color = (key: keyof EmailDesignSettings) =>\n safeColor(d[key] as string, defaults[key] as string);\n return {\n bodyBackgroundColor: color('bodyBackgroundColor'),\n contentBackgroundColor: color('contentBackgroundColor'),\n textColor: color('textColor'),\n headingColor: color('headingColor'),\n linkColor: color('linkColor'),\n buttonBackgroundColor: color('buttonBackgroundColor'),\n buttonTextColor: color('buttonTextColor'),\n buttonBorderRadius: px(d.buttonBorderRadius, 6, 100),\n // The design UI's 320px floor also applies to documents set programmatically.\n contentWidth: Math.max(320, px(d.contentWidth, 600, 1200)),\n fontFamily:\n typeof d.fontFamily === 'string' && /^[\\w\\s,'-]+$/.test(d.fontFamily)\n ? d.fontFamily\n : defaults.fontFamily,\n };\n}\n\nexport function renderEmailMjml(\n tree: EmailContentTree,\n options: RenderEmailMjmlOptions = {}\n): string {\n const design = normalizeDesignSettings(options.design);\n const ctx: Ctx = {\n design,\n sanitize: options.sanitizeHtml ?? defaultSanitize,\n unsubscribeUrl: options.unsubscribeUrl ?? '{{unsubscribe_url}}',\n };\n const gradients = tree.blocks\n .filter((b): b is EmailHeroBlock => b.type === 'hero')\n .map((b) => {\n const gradient = heroGradient(b);\n return gradient\n ? `.hero-gradient-${b.id} { background: ${gradient} !important; }`\n : '';\n })\n .filter(Boolean)\n .join('\\n');\n\n return `<mjml>\n <mj-head>\n <mj-attributes>\n <mj-all font-family=\"${escapeHtml(design.fontFamily)}\" color=\"${design.textColor}\" />\n <mj-text font-size=\"16px\" line-height=\"1.6\" />\n <mj-section background-color=\"${design.contentBackgroundColor}\" />\n </mj-attributes>\n <mj-style>\n a { color: ${design.linkColor}; }\n h1, h2, h3, h4, h5, h6 { color: inherit; margin: 0; }\n ${gradients}\n </mj-style>\n <mj-style inline=\"inline\">\n .email-table table { border-collapse: collapse; }\n </mj-style>\n </mj-head>\n <mj-body background-color=\"${design.bodyBackgroundColor}\" width=\"${design.contentWidth}px\">\n ${tree.blocks.map((block) => renderBlock(block, ctx)).join('\\n ')}\n </mj-body>\n</mjml>`;\n}\n","import * as React from 'react';\nimport {\n Facebook,\n Github,\n Globe,\n Image as ImageIcon,\n Instagram,\n Linkedin,\n Twitter,\n Youtube,\n} from 'lucide-react';\n\nimport {\n hasHeroCta,\n safeColor,\n safeGradient,\n sanitizeEmailHtml,\n} from './renderEmailMjml';\nimport type {\n EmailBlock,\n EmailContentBlock,\n EmailDesignSettings,\n EmailSocialPlatform,\n} from './types';\n\nconst SOCIAL_ICONS: Record<EmailSocialPlatform, React.ElementType> = {\n facebook: Facebook,\n twitter: Twitter,\n linkedin: Linkedin,\n instagram: Instagram,\n youtube: Youtube,\n github: Github,\n website: Globe,\n};\n\nconst HEADING_SIZES = { 1: 32, 2: 26, 3: 22, 4: 18 } as const;\n\nfunction SafeHtml({\n html,\n style,\n}: {\n html: string;\n style?: React.CSSProperties;\n}) {\n // Sanitise after mount: there is no DOM during server rendering.\n const [clean, setClean] = React.useState('');\n React.useEffect(() => setClean(sanitizeEmailHtml(html) ?? ''), [html]);\n // Undo the CSS reset so the content looks as it will in a mail client:\n // paragraphs and lists space out, headings (the editor offers H1–H6) are\n // bold at UA sizes (the MJML styles zero their margins), blockquotes get\n // the UA indent.\n return (\n <div\n style={style}\n className=\"[&_a]:underline [&_blockquote]:mx-10 [&_blockquote]:my-4 [&_h1]:text-[2em] [&_h1]:font-bold [&_h2]:text-[1.5em] [&_h2]:font-bold [&_h3]:text-[1.17em] [&_h3]:font-bold [&_h4]:text-[1em] [&_h4]:font-bold [&_h5]:text-[0.83em] [&_h5]:font-bold [&_h6]:text-[0.67em] [&_h6]:font-bold [&_ol]:list-decimal [&_ol]:ps-6 [&_p]:my-3 [&_ul]:list-disc [&_ul]:ps-6\"\n dangerouslySetInnerHTML={{ __html: clean }}\n />\n );\n}\n\nexport interface EmailBlockPreviewProps {\n block: EmailBlock;\n design: Required<EmailDesignSettings>;\n /** Renders a column's child block (selection frame, toolbar). */\n renderChild: (block: EmailContentBlock) => React.ReactNode;\n /** Shown in an empty column. */\n emptyColumnLabel: string;\n /** Shown for a block type this editor does not support; `{type}` is replaced. */\n unsupportedBlockLabel: string;\n /** Accessible names for the social block's icons, usually `labels.platforms`. */\n platformLabels: Record<EmailSocialPlatform, string>;\n}\n\n/** WYSIWYG approximation of a block; the sent email comes from `renderEmailMjml`. */\nexport function EmailBlockPreview({\n block,\n design,\n renderChild,\n emptyColumnLabel,\n unsupportedBlockLabel,\n platformLabels,\n}: EmailBlockPreviewProps) {\n const pad = '10px 25px';\n switch (block.type) {\n case 'heading': {\n const Tag = `h${block.level}` as 'h1';\n return (\n <Tag\n style={{\n margin: 0,\n padding: pad,\n fontSize: HEADING_SIZES[block.level],\n fontWeight: 700,\n lineHeight: 1.25,\n textAlign: block.alignment ?? 'left',\n color: safeColor(block.color, design.headingColor),\n }}\n >\n {block.text}\n </Tag>\n );\n }\n case 'text':\n return (\n <SafeHtml\n html={block.content}\n style={{\n padding: pad,\n textAlign: block.alignment ?? 'left',\n color: safeColor(block.color, design.textColor),\n }}\n />\n );\n case 'button':\n return (\n <div style={{ padding: pad, textAlign: block.alignment ?? 'center' }}>\n <span\n style={{\n display: block.fullWidth ? 'block' : 'inline-block',\n padding: '10px 25px',\n background: safeColor(\n block.backgroundColor,\n design.buttonBackgroundColor\n ),\n color: safeColor(block.textColor, design.buttonTextColor),\n borderRadius: block.borderRadius ?? design.buttonBorderRadius,\n fontWeight: 600,\n }}\n >\n {block.text}\n </span>\n </div>\n );\n case 'image':\n return (\n <div style={{ padding: pad, textAlign: block.alignment ?? 'center' }}>\n {block.src ? (\n <img\n src={block.src}\n alt={block.alt}\n style={{\n display: 'inline-block',\n maxWidth: '100%',\n // Zero/invalid widths fall back to full width, matching the\n // omitted width in renderEmailMjml.\n width:\n parseFloat(String(block.width ?? '')) > 0\n ? block.width\n : '100%',\n borderRadius: block.borderRadius,\n }}\n />\n ) : (\n <div className=\"border-border text-muted-foreground flex h-32 items-center justify-center rounded-md border-2 border-dashed\">\n <ImageIcon className=\"h-8 w-8\" aria-hidden=\"true\" />\n </div>\n )}\n </div>\n );\n case 'divider':\n return (\n <div style={{ padding: pad }}>\n <hr\n style={{\n margin: '0 auto',\n border: 0,\n borderTop: `1px ${block.style ?? 'solid'} ${safeColor(block.color, '#e5e7eb')}`,\n width: block.width ?? '100%',\n }}\n />\n </div>\n );\n case 'spacer':\n return <div style={{ height: block.height }} />;\n case 'social': {\n const size = { sm: 20, md: 25, lg: 35 }[block.iconSize ?? 'md'];\n return (\n <div\n style={{\n padding: pad,\n display: 'flex',\n gap: 8,\n justifyContent:\n block.alignment === 'left'\n ? 'flex-start'\n : block.alignment === 'right'\n ? 'flex-end'\n : 'center',\n }}\n >\n {block.links.map((link, i) => {\n const Icon = SOCIAL_ICONS[link.platform] ?? Globe;\n return (\n <Icon\n key={i}\n width={size}\n height={size}\n role=\"img\"\n aria-label={platformLabels[link.platform] ?? link.platform}\n />\n );\n })}\n </div>\n );\n }\n case 'html':\n return <SafeHtml html={block.html} style={{ padding: pad }} />;\n case 'footer': {\n const color = safeColor(block.color, '#6b7280');\n return (\n <div\n style={{\n padding: pad,\n fontSize: 12,\n color,\n textAlign: block.alignment ?? 'center',\n }}\n >\n {[block.companyName, block.address, block.phone]\n .filter(Boolean)\n .map((line, i) => (\n <div key={i}>{line}</div>\n ))}\n <div>\n {block.showUnsubscribe && (\n <span style={{ textDecoration: 'underline' }}>\n {block.unsubscribeText || 'Unsubscribe'}\n </span>\n )}\n {block.managePreferencesUrl && (\n <span\n style={{ textDecoration: 'underline', marginInlineStart: 12 }}\n >\n {block.managePreferencesText || 'Manage preferences'}\n </span>\n )}\n </div>\n </div>\n );\n }\n case 'quote':\n return (\n <div\n style={{\n margin: pad,\n padding: '8px 16px',\n background: safeColor(block.backgroundColor, '#f8fafc'),\n color: safeColor(block.textColor, '#1e293b'),\n borderInlineStart: `4px solid ${safeColor(block.accentColor, design.linkColor)}`,\n textAlign: block.alignment ?? 'left',\n }}\n >\n <p style={{ margin: 0, fontSize: 18, fontStyle: 'italic' }}>\n “{block.text}”\n </p>\n {block.author && (\n <p style={{ margin: '12px 0 0', fontWeight: 600 }}>\n {block.author}\n </p>\n )}\n {block.author && block.role && (\n <p style={{ margin: '2px 0 0', fontSize: 13, opacity: 0.75 }}>\n {block.role}\n </p>\n )}\n </div>\n );\n case 'table': {\n const border = `1px solid ${safeColor(block.borderColor, '#e5e7eb')}`;\n return (\n <div style={{ padding: pad }}>\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <tbody>\n {block.rows.map((row, r) => {\n const head = block.headerRow && r === 0;\n return (\n <tr key={r}>\n {row.map((cell, c) => {\n const Cell = head ? 'th' : 'td';\n return (\n <Cell\n key={c}\n style={{\n border,\n padding: '10px 12px',\n textAlign: block.alignment ?? 'left',\n ...(head && {\n background: safeColor(\n block.headerBackgroundColor,\n '#f3f4f6'\n ),\n color: safeColor(\n block.headerTextColor,\n design.headingColor\n ),\n }),\n }}\n >\n {cell}\n </Cell>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n }\n case 'hero': {\n const color = safeColor(block.textColor, '#ffffff');\n const bg = safeColor(block.backgroundColor, '#1e3a5f');\n return (\n <div\n style={{\n padding: `${block.padding ?? 48}px 25px`,\n background: safeGradient(block.backgroundGradient) ?? bg,\n color,\n textAlign: block.alignment ?? 'center',\n }}\n >\n {block.categoryText && (\n <div\n style={{\n fontSize: 12,\n fontWeight: 700,\n letterSpacing: 2,\n textTransform: 'uppercase',\n marginBottom: 8,\n }}\n >\n {block.categoryText}\n </div>\n )}\n <h1\n style={{ margin: '0 0 8px', fontSize: 32, lineHeight: 1.2, color }}\n >\n {block.headline}\n </h1>\n {block.subtitle && (\n <p style={{ margin: '0 0 16px' }}>{block.subtitle}</p>\n )}\n {hasHeroCta(block) && (\n <span\n style={{\n display: 'inline-block',\n padding: '10px 25px',\n borderRadius: 6,\n fontWeight: 600,\n background: safeColor(block.ctaColor, '#ffffff'),\n color: bg,\n }}\n >\n {block.ctaText}\n </span>\n )}\n </div>\n );\n }\n case 'columns':\n return (\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n background: block.backgroundColor\n ? safeColor(block.backgroundColor, 'transparent')\n : undefined,\n }}\n >\n {block.columns.map((column) => (\n <div\n key={column.id}\n style={{\n flex: `1 1 ${column.width ?? 100 / block.columns.length}%`,\n minWidth: 160,\n padding: 4,\n background: column.backgroundColor\n ? safeColor(column.backgroundColor, 'transparent')\n : undefined,\n }}\n >\n {column.blocks.length ? (\n column.blocks.map((child) => (\n <React.Fragment key={child.id}>\n {renderChild(child)}\n </React.Fragment>\n ))\n ) : (\n <div className=\"border-border text-muted-foreground rounded-md border border-dashed p-4 text-center text-xs\">\n {emptyColumnLabel}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n // Host-owned block types (e.g. Waggleline-only blocks) are kept in the\n // document but rendered as a visible placeholder; `renderEmailMjml` omits them.\n default:\n return (\n <div\n role=\"note\"\n className=\"border-border text-muted-foreground m-2 rounded-md border border-dashed p-4 text-center text-xs\"\n >\n {unsupportedBlockLabel.replace(\n '{type}',\n (block as { type: string }).type\n )}\n </div>\n );\n }\n}\n","import * as React from 'react';\nimport { Plus, Trash2, Upload } from 'lucide-react';\n\nimport { Button as BaseButton, type ButtonProps } from '../Button';\nimport { Input } from '../Input';\nimport type { RichTextVariableGroup } from '../RichTextEditor/RichTextEditor';\nimport { Select } from '../Select';\nimport { Switch } from '../Switch';\nimport { Textarea } from '../Textarea';\n// Text blocks ride the Kerebron (ProseMirror) engine (mieweb/ui#695) — the\n// same surface behind the main bundle's Textarea, so this adds no new peers.\nimport { TextAreaRichKerebron } from '../TextAreaRich/TextAreaRichKerebron';\nimport type { EmailEditorLabels } from './labels';\nimport { sanitizeEmailHtml } from './renderEmailMjml';\nimport {\n createEmailBlock,\n generateEmailBlockId,\n type EmailAlignment,\n type EmailBlock,\n type EmailColumn,\n type EmailContentBlock,\n type EmailDesignSettings,\n type EmailSocialPlatform,\n} from './types';\n\ntype Patch<B> = (patch: Partial<B>) => void;\n\n// Task lists have no place in an email: their checkbox <input>s are forbidden\n// by the sanitiser and inert in every mail client. Module-level so the editor\n// sees one stable identity.\nconst EMAIL_OMITTED_EXTENSIONS = ['task_list', 'task_item'] as const;\n\n/** Editor actions must never submit a host form. */\nexport function Button(props: ButtonProps) {\n return <BaseButton type=\"button\" {...props} />;\n}\n\ninterface FieldProps<T> {\n label: string;\n value: T | undefined;\n onChange: (value: T) => void;\n}\n\nfunction TextField({\n multiline,\n ...props\n}: FieldProps<string> & { multiline?: boolean; placeholder?: string }) {\n const Control = multiline ? Textarea : Input;\n return (\n <Control\n label={props.label}\n value={props.value ?? ''}\n placeholder={props.placeholder}\n onChange={(\n e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n ) => props.onChange(e.target.value)}\n />\n );\n}\n\nfunction NumberField({\n label,\n value,\n onChange,\n min = 0,\n max,\n}: FieldProps<number> & { min?: number; max?: number }) {\n return (\n <Input\n type=\"number\"\n label={label}\n min={min}\n max={max}\n value={value ?? ''}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (e.target.value !== '' && Number.isFinite(n)) onChange(n);\n }}\n />\n );\n}\n\nconst HEX6 = /^#[0-9a-f]{6}$/i;\n\nfunction ColorField({\n label,\n value,\n onChange,\n fallback = '#000000',\n}: FieldProps<string> & { fallback?: string }) {\n const swatch = value && HEX6.test(value) ? value : fallback;\n return (\n <div className=\"flex items-end gap-2\">\n <div className=\"min-w-0 flex-1\">\n <Input\n label={label}\n value={value ?? ''}\n placeholder={fallback}\n onChange={(e) => onChange(e.target.value)}\n />\n </div>\n <input\n type=\"color\"\n aria-label={label}\n value={HEX6.test(swatch) ? swatch : '#000000'}\n onChange={(e) => onChange(e.target.value)}\n className=\"border-border bg-background h-10 w-10 shrink-0 cursor-pointer rounded-md border p-1\"\n />\n </div>\n );\n}\n\nfunction SelectField<T extends string>({\n label,\n value,\n onChange,\n options,\n}: FieldProps<T> & { options: { value: T; label: string }[] }) {\n return (\n <Select\n label={label}\n value={value}\n options={options}\n onValueChange={(v) => onChange(v as T)}\n />\n );\n}\n\nfunction SwitchField({ label, value, onChange }: FieldProps<boolean>) {\n return (\n <Switch label={label} checked={Boolean(value)} onCheckedChange={onChange} />\n );\n}\n\nconst SOCIAL_PLATFORMS: EmailSocialPlatform[] = [\n 'facebook',\n 'twitter',\n 'linkedin',\n 'instagram',\n 'youtube',\n 'github',\n 'website',\n];\n\nexport const CONTENT_BLOCK_TYPES = [\n 'heading',\n 'text',\n 'button',\n 'image',\n 'divider',\n 'spacer',\n 'social',\n 'quote',\n 'table',\n 'html',\n 'footer',\n] as const satisfies readonly EmailContentBlock['type'][];\n\nexport function resizeColumns(\n columns: EmailColumn[],\n count: 1 | 2 | 3\n): EmailColumn[] {\n const width = Math.floor(100 / count);\n const next = Array.from({ length: count }, (_, i) => ({\n ...(columns[i] ?? { id: generateEmailBlockId(), blocks: [] }),\n // The last column absorbs the rounding remainder so widths sum to 100.\n width: i === count - 1 ? 100 - width * (count - 1) : width,\n }));\n // Keep content from dropped columns by moving it into the last remaining one.\n const dropped = columns.slice(count).flatMap((c) => c.blocks);\n next[count - 1] = {\n ...next[count - 1],\n blocks: [...next[count - 1].blocks, ...dropped],\n };\n return next;\n}\n\nexport interface EmailBlockSettingsProps {\n block: EmailBlock;\n design: Required<EmailDesignSettings>;\n onChange: (patch: Partial<EmailBlock>) => void;\n onAddToColumn: (columnIndex: number, block: EmailContentBlock) => void;\n labels: EmailEditorLabels;\n variableGroups?: RichTextVariableGroup[];\n onUploadImage?: (file: File) => Promise<string>;\n}\n\nexport function EmailBlockSettings({\n block,\n design,\n onChange,\n onAddToColumn,\n labels,\n variableGroups,\n onUploadImage,\n}: EmailBlockSettingsProps) {\n const f = labels.fields;\n const o = labels.options;\n const set = onChange as Patch<typeof block>;\n const alignOptions: { value: EmailAlignment; label: string }[] = [\n { value: 'left', label: o.left },\n { value: 'center', label: o.center },\n { value: 'right', label: o.right },\n ];\n const alignment = (\n value: EmailAlignment | undefined,\n fallback: EmailAlignment\n ) => (\n <SelectField\n label={f.alignment}\n value={value ?? fallback}\n options={alignOptions}\n onChange={(v) => onChange({ alignment: v } as Partial<EmailBlock>)}\n />\n );\n const uploadRef = React.useRef<HTMLInputElement>(null);\n const [uploading, setUploading] = React.useState(false);\n const [uploadFailed, setUploadFailed] = React.useState(false);\n // HTML the editor just emitted is already live in its document; sanitising it\n // again would normalise it, and the strictly controlled editor would rewrite\n // its content to match (losing the caret).\n const emitted = React.useRef<string | null>(null);\n // The editor captures `mediaUpload` once, when it mounts; reading the latest\n // `onUploadImage` through a ref keeps paste uploads in sync with the host's\n // current callback (added, swapped, or removed after mount) without\n // rebuilding the editor and losing the user's editing state.\n const onUploadImageRef = React.useRef(onUploadImage);\n onUploadImageRef.current = onUploadImage;\n const uploadPastedImage = React.useCallback(async (file: File) => {\n const upload = onUploadImageRef.current;\n if (!upload) {\n // The media extension catches rejections and inserts nothing — parity\n // with the legacy editor, where pasted image files never survived the\n // sanitiser — but leaves a console trace for debuggability.\n throw new Error(\n 'EmailEditor: pasted file skipped — no onUploadImage handler'\n );\n }\n return upload(file);\n }, []);\n\n switch (block.type) {\n case 'heading':\n return (\n <>\n <TextField\n label={f.text}\n value={block.text}\n onChange={(text) => set({ text })}\n />\n <SelectField\n label={f.level}\n value={String(block.level) as '1'}\n options={['1', '2', '3', '4'].map((v) => ({\n value: v as '1',\n label: `H${v}`,\n }))}\n onChange={(v) => set({ level: Number(v) as 1 })}\n />\n {alignment(block.alignment, 'left')}\n <ColorField\n label={f.color}\n value={block.color}\n fallback={design.headingColor}\n onChange={(color) => set({ color })}\n />\n </>\n );\n case 'text':\n return (\n <>\n <TextAreaRichKerebron\n aria-label={f.content}\n value={\n block.content === emitted.current\n ? block.content\n : (sanitizeEmailHtml(block.content) ?? '')\n }\n onChange={(content) => {\n emitted.current = content;\n set({ content });\n }}\n // Declares the policy pasted markup must pass. The Kerebron\n // surface filters pastes through the ProseMirror schema (a\n // stricter subset); stored content is still sanitised on every\n // exit (canvas preview and MJML render).\n sanitizeHtml={(html) => sanitizeEmailHtml(html) ?? ''}\n // A pasted image file must not become a base64 `data:` URL — the\n // email URL policy (`isSafeUrl`) strips those on render, leaving a\n // broken image. The always-present stable handler routes files\n // through the host's current uploader, or rejects (= skips the\n // file) without one. No videos in email text blocks.\n mediaUpload={{\n uploadHandler: uploadPastedImage,\n allowedVideoTypes: [],\n }}\n // Task lists serialize checkbox <input>s, which the sanitiser\n // forbids and no mail client would honour — dropping the nodes\n // removes the menu item, input rule and paste handling together.\n omitExtensions={EMAIL_OMITTED_EXTENSIONS}\n variableGroups={variableGroups}\n enableDictation={false}\n defaultToolbar=\"visible\"\n />\n {alignment(block.alignment, 'left')}\n <ColorField\n label={f.color}\n value={block.color}\n fallback={design.textColor}\n onChange={(color) => set({ color })}\n />\n </>\n );\n case 'button':\n return (\n <>\n <TextField\n label={f.text}\n value={block.text}\n onChange={(text) => set({ text })}\n />\n <TextField\n label={f.url}\n value={block.url}\n onChange={(url) => set({ url })}\n />\n {alignment(block.alignment, 'center')}\n <ColorField\n label={f.backgroundColor}\n value={block.backgroundColor}\n fallback={design.buttonBackgroundColor}\n onChange={(backgroundColor) => set({ backgroundColor })}\n />\n <ColorField\n label={f.textColor}\n value={block.textColor}\n fallback={design.buttonTextColor}\n onChange={(textColor) => set({ textColor })}\n />\n <NumberField\n label={f.borderRadius}\n value={block.borderRadius ?? design.buttonBorderRadius}\n max={100}\n onChange={(borderRadius) => set({ borderRadius })}\n />\n <SwitchField\n label={f.fullWidth}\n value={block.fullWidth}\n onChange={(fullWidth) => set({ fullWidth })}\n />\n </>\n );\n case 'image':\n return (\n <>\n <TextField\n label={f.imageUrl}\n value={block.src}\n onChange={(src) => set({ src })}\n />\n {onUploadImage && (\n <>\n <input\n ref={uploadRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"sr-only\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onChange={async (e) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (!file) return;\n setUploading(true);\n setUploadFailed(false);\n try {\n set({ src: await onUploadImage(file) });\n } catch {\n setUploadFailed(true);\n } finally {\n setUploading(false);\n }\n }}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n isLoading={uploading}\n leftIcon={<Upload className=\"h-4 w-4\" aria-hidden=\"true\" />}\n onClick={() => uploadRef.current?.click()}\n >\n {f.uploadImage}\n </Button>\n {uploadFailed && (\n <p role=\"alert\" className=\"text-destructive text-sm\">\n {f.uploadFailed}\n </p>\n )}\n </>\n )}\n <TextField\n label={f.altText}\n value={block.alt}\n onChange={(alt) => set({ alt })}\n />\n <TextField\n label={f.url}\n value={block.href}\n onChange={(href) => set({ href })}\n />\n <TextField\n label={f.width}\n value={block.width === undefined ? '' : String(block.width)}\n placeholder=\"100%\"\n onChange={(width) =>\n set({ width: /^\\d+$/.test(width) ? Number(width) : width })\n }\n />\n <NumberField\n label={f.borderRadius}\n value={block.borderRadius}\n max={100}\n onChange={(borderRadius) => set({ borderRadius })}\n />\n {alignment(block.alignment, 'center')}\n </>\n );\n case 'divider':\n return (\n <>\n <SelectField\n label={f.style}\n value={block.style ?? 'solid'}\n options={(['solid', 'dashed', 'dotted'] as const).map((v) => ({\n value: v,\n label: o[v],\n }))}\n onChange={(style) => set({ style })}\n />\n <ColorField\n label={f.color}\n value={block.color}\n onChange={(color) => set({ color })}\n />\n <TextField\n label={f.width}\n value={block.width}\n placeholder=\"100%\"\n onChange={(width) => set({ width })}\n />\n </>\n );\n case 'spacer':\n return (\n <NumberField\n label={f.height}\n value={block.height}\n max={400}\n onChange={(height) => set({ height })}\n />\n );\n case 'social':\n return (\n <>\n {alignment(block.alignment, 'center')}\n <SelectField\n label={f.iconSize}\n value={block.iconSize ?? 'md'}\n options={(['sm', 'md', 'lg'] as const).map((v) => ({\n value: v,\n label: o[v],\n }))}\n onChange={(iconSize) => set({ iconSize })}\n />\n {block.links.map((link, i) => {\n const update = (patch: Partial<typeof link>) =>\n set({\n links: block.links.map((l, j) =>\n j === i ? { ...l, ...patch } : l\n ),\n });\n return (\n <fieldset\n key={i}\n className=\"border-border space-y-2 rounded-md border p-3\"\n >\n <legend className=\"sr-only\">\n {f.socialLink.replace('{number}', String(i + 1))}\n </legend>\n <SelectField\n label={f.platform}\n value={link.platform}\n options={SOCIAL_PLATFORMS.map((p) => ({\n value: p,\n label: labels.platforms[p],\n }))}\n onChange={(platform) => update({ platform })}\n />\n <TextField\n label={f.url}\n value={link.url}\n onChange={(url) => update({ url })}\n />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n leftIcon={<Trash2 className=\"h-4 w-4\" aria-hidden=\"true\" />}\n onClick={() =>\n set({ links: block.links.filter((_, j) => j !== i) })\n }\n >\n {f.removeLink}\n </Button>\n </fieldset>\n );\n })}\n <Button\n variant=\"outline\"\n size=\"sm\"\n leftIcon={<Plus className=\"h-4 w-4\" aria-hidden=\"true\" />}\n onClick={() =>\n set({\n links: [\n ...block.links,\n { platform: 'website', url: 'https://' },\n ],\n })\n }\n >\n {f.addLink}\n </Button>\n </>\n );\n case 'html':\n return (\n <Textarea\n label={f.html}\n value={block.html}\n rows={10}\n className=\"font-mono text-xs\"\n onChange={(e) => set({ html: e.target.value })}\n />\n );\n case 'footer':\n return (\n <>\n <TextField\n label={f.companyName}\n value={block.companyName}\n onChange={(companyName) => set({ companyName })}\n />\n <TextField\n label={f.address}\n value={block.address}\n onChange={(address) => set({ address })}\n />\n <TextField\n label={f.phone}\n value={block.phone}\n onChange={(phone) => set({ phone })}\n />\n <SwitchField\n label={f.showUnsubscribe}\n value={block.showUnsubscribe}\n onChange={(showUnsubscribe) => set({ showUnsubscribe })}\n />\n {block.showUnsubscribe && (\n <TextField\n label={f.unsubscribeText}\n value={block.unsubscribeText}\n onChange={(unsubscribeText) => set({ unsubscribeText })}\n />\n )}\n <TextField\n label={f.managePreferencesUrl}\n value={block.managePreferencesUrl}\n onChange={(managePreferencesUrl) => set({ managePreferencesUrl })}\n />\n <TextField\n label={f.managePreferencesText}\n value={block.managePreferencesText}\n onChange={(managePreferencesText) => set({ managePreferencesText })}\n />\n {alignment(block.alignment, 'center')}\n <ColorField\n label={f.color}\n value={block.color}\n onChange={(color) => set({ color })}\n />\n </>\n );\n case 'quote':\n return (\n <>\n <TextField\n multiline\n label={f.text}\n value={block.text}\n onChange={(text) => set({ text })}\n />\n <TextField\n label={f.author}\n value={block.author}\n onChange={(author) => set({ author })}\n />\n <TextField\n label={f.role}\n value={block.role}\n onChange={(role) => set({ role })}\n />\n {alignment(block.alignment, 'left')}\n <ColorField\n label={f.backgroundColor}\n value={block.backgroundColor}\n onChange={(backgroundColor) => set({ backgroundColor })}\n />\n <ColorField\n label={f.textColor}\n value={block.textColor}\n onChange={(textColor) => set({ textColor })}\n />\n <ColorField\n label={f.accentColor}\n value={block.accentColor}\n fallback={design.linkColor}\n onChange={(accentColor) => set({ accentColor })}\n />\n </>\n );\n case 'table': {\n const cols = Math.max(1, ...block.rows.map((r) => r.length));\n const setCell = (r: number, c: number, value: string) =>\n set({\n rows: block.rows.map((row, i) =>\n i === r ? row.map((cell, j) => (j === c ? value : cell)) : row\n ),\n });\n return (\n <>\n <SwitchField\n label={f.headerRow}\n value={block.headerRow}\n onChange={(headerRow) => set({ headerRow })}\n />\n <div\n className=\"grid gap-1\"\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {block.rows.map((row, r) =>\n row.map((cell, c) => (\n <input\n key={`${r}-${c}`}\n aria-label={f.cell\n .replace('{row}', String(r + 1))\n .replace('{column}', String(c + 1))}\n value={cell}\n onChange={(e) => setCell(r, c, e.target.value)}\n className=\"border-input bg-background text-foreground focus-visible:ring-ring h-8 min-w-0 rounded-md border px-2 text-sm focus-visible:ring-2 focus-visible:outline-none\"\n />\n ))\n )}\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() =>\n set({ rows: [...block.rows, Array(cols).fill('')] })\n }\n >\n {f.addRow}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => set({ rows: block.rows.map((r) => [...r, '']) })}\n >\n {f.addColumn}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={block.rows.length <= 1}\n onClick={() => set({ rows: block.rows.slice(0, -1) })}\n >\n {f.removeRow}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={cols <= 1}\n onClick={() =>\n set({ rows: block.rows.map((r) => r.slice(0, -1)) })\n }\n >\n {f.removeColumn}\n </Button>\n </div>\n {alignment(block.alignment, 'left')}\n <ColorField\n label={f.borderColor}\n value={block.borderColor}\n onChange={(borderColor) => set({ borderColor })}\n />\n <ColorField\n label={f.headerBackgroundColor}\n value={block.headerBackgroundColor}\n onChange={(headerBackgroundColor) => set({ headerBackgroundColor })}\n />\n <ColorField\n label={f.headerTextColor}\n value={block.headerTextColor}\n onChange={(headerTextColor) => set({ headerTextColor })}\n />\n </>\n );\n }\n case 'hero':\n return (\n <>\n <TextField\n label={f.categoryText}\n value={block.categoryText}\n onChange={(categoryText) => set({ categoryText })}\n />\n <TextField\n label={f.headline}\n value={block.headline}\n onChange={(headline) => set({ headline })}\n />\n <TextField\n multiline\n label={f.subtitle}\n value={block.subtitle}\n onChange={(subtitle) => set({ subtitle })}\n />\n <TextField\n label={f.ctaText}\n value={block.ctaText}\n onChange={(ctaText) => set({ ctaText })}\n />\n <TextField\n label={f.ctaUrl}\n value={block.ctaUrl}\n onChange={(ctaUrl) => set({ ctaUrl })}\n />\n {alignment(block.alignment, 'center')}\n <ColorField\n label={f.backgroundColor}\n value={block.backgroundColor}\n onChange={(backgroundColor) => set({ backgroundColor })}\n />\n <TextField\n label={f.backgroundGradient}\n value={block.backgroundGradient}\n placeholder=\"linear-gradient(135deg, #1e3a5f, #2563eb)\"\n onChange={(backgroundGradient) => set({ backgroundGradient })}\n />\n <ColorField\n label={f.textColor}\n value={block.textColor}\n onChange={(textColor) => set({ textColor })}\n />\n <ColorField\n label={f.ctaColor}\n value={block.ctaColor}\n onChange={(ctaColor) => set({ ctaColor })}\n />\n <NumberField\n label={f.padding}\n value={block.padding}\n max={200}\n onChange={(padding) => set({ padding })}\n />\n </>\n );\n case 'columns':\n return (\n <>\n <SelectField\n label={f.columnCount}\n value={String(block.columnCount) as '1'}\n options={['1', '2', '3'].map((v) => ({\n value: v as '1',\n label: v,\n }))}\n onChange={(v) => {\n const columnCount = Number(v) as 1 | 2 | 3;\n set({\n columnCount,\n columns: resizeColumns(block.columns, columnCount),\n });\n }}\n />\n <ColorField\n label={f.backgroundColor}\n value={block.backgroundColor}\n onChange={(backgroundColor) => set({ backgroundColor })}\n />\n {block.columns.map((column, i) => (\n <Select\n key={column.id}\n label={`${labels.addBlock} — ${labels.column} ${i + 1}`}\n placeholder={labels.addBlock}\n value=\"\"\n options={CONTENT_BLOCK_TYPES.map((type) => ({\n value: type,\n label: labels.blockTypes[type],\n }))}\n onValueChange={(type) =>\n onAddToColumn(\n i,\n createEmailBlock(\n type as EmailContentBlock['type']\n ) as EmailContentBlock\n )\n }\n />\n ))}\n </>\n );\n }\n}\n\nconst FONT_OPTIONS = [\n 'Arial, Helvetica, sans-serif',\n 'Helvetica, Arial, sans-serif',\n 'Verdana, Geneva, sans-serif',\n 'Tahoma, Geneva, sans-serif',\n \"'Trebuchet MS', Helvetica, sans-serif\",\n 'Georgia, serif',\n \"'Times New Roman', Times, serif\",\n \"'Courier New', Courier, monospace\",\n];\n\nexport interface EmailDesignPanelProps {\n design: Required<EmailDesignSettings>;\n onChange: (patch: Partial<EmailDesignSettings>) => void;\n labels: EmailEditorLabels;\n}\n\nexport function EmailDesignPanel({\n design,\n onChange,\n labels,\n}: EmailDesignPanelProps) {\n const f = labels.fields;\n const fonts = FONT_OPTIONS.includes(design.fontFamily)\n ? FONT_OPTIONS\n : [design.fontFamily, ...FONT_OPTIONS];\n return (\n <>\n <SelectField\n label={f.fontFamily}\n value={design.fontFamily}\n options={fonts.map((font) => ({\n value: font,\n label: font.split(',')[0].replace(/'/g, ''),\n }))}\n onChange={(fontFamily) => onChange({ fontFamily })}\n />\n <NumberField\n label={f.contentWidth}\n value={design.contentWidth}\n min={320}\n max={1200}\n onChange={(contentWidth) => onChange({ contentWidth })}\n />\n {(\n [\n 'bodyBackgroundColor',\n 'contentBackgroundColor',\n 'textColor',\n 'headingColor',\n 'linkColor',\n 'buttonBackgroundColor',\n 'buttonTextColor',\n ] as const\n ).map((key) => (\n <ColorField\n key={key}\n label={f[key]}\n value={design[key]}\n onChange={(v) => onChange({ [key]: v })}\n />\n ))}\n <NumberField\n label={f.buttonBorderRadius}\n value={design.buttonBorderRadius}\n max={100}\n onChange={(buttonBorderRadius) => onChange({ buttonBorderRadius })}\n />\n </>\n );\n}\n","import type { EmailBlockType, EmailSocialPlatform } from './types';\n\nexport const defaultEmailEditorLabels = {\n blocks: 'Blocks',\n design: 'Design',\n blockSettings: 'Block settings',\n undo: 'Undo',\n redo: 'Redo',\n viewport: 'Preview width',\n desktop: 'Desktop',\n mobile: 'Mobile',\n canvas: 'Email canvas',\n moveUp: 'Move up',\n moveDown: 'Move down',\n duplicate: 'Duplicate',\n remove: 'Delete',\n dragHandle: 'Drag to reorder',\n addBlock: 'Add block',\n emptyCanvas: 'Drag a block here, or click one in the palette.',\n emptyColumn: 'Empty column',\n unsupportedBlock:\n 'Unsupported block ({type}). It will not be included in the sent email.',\n noSelection: 'Select a block in the canvas to edit it.',\n column: 'Column',\n selectBlock: 'Select {item}',\n announceAdded: '{item} added.',\n announceMoved: '{item} moved to position {position}.',\n announceDuplicated: '{item} duplicated.',\n announceRemoved: '{item} deleted.',\n blockTypes: {\n heading: 'Heading',\n text: 'Text',\n button: 'Button',\n image: 'Image',\n divider: 'Divider',\n spacer: 'Spacer',\n columns: 'Columns',\n social: 'Social links',\n hero: 'Hero banner',\n html: 'Custom HTML',\n footer: 'Footer',\n quote: 'Quote',\n table: 'Table',\n } satisfies Record<EmailBlockType, string>,\n platforms: {\n facebook: 'Facebook',\n twitter: 'Twitter',\n linkedin: 'LinkedIn',\n instagram: 'Instagram',\n youtube: 'YouTube',\n github: 'GitHub',\n website: 'Website',\n } satisfies Record<EmailSocialPlatform, string>,\n fields: {\n text: 'Text',\n content: 'Content',\n level: 'Level',\n alignment: 'Alignment',\n color: 'Color',\n textColor: 'Text color',\n backgroundColor: 'Background color',\n backgroundGradient: 'Background gradient (CSS)',\n accentColor: 'Accent color',\n url: 'Link URL',\n borderRadius: 'Corner radius (px)',\n fullWidth: 'Full width',\n imageUrl: 'Image URL',\n uploadImage: 'Upload image',\n uploadFailed: 'The image could not be uploaded. Try again.',\n altText: 'Alt text',\n width: 'Width (px or %)',\n style: 'Style',\n height: 'Height (px)',\n iconSize: 'Icon size',\n platform: 'Platform',\n socialLink: 'Link {number}',\n addLink: 'Add link',\n removeLink: 'Remove link',\n html: 'HTML',\n companyName: 'Company name',\n address: 'Address',\n phone: 'Phone',\n showUnsubscribe: 'Show unsubscribe link',\n unsubscribeText: 'Unsubscribe text',\n managePreferencesUrl: 'Preferences URL',\n managePreferencesText: 'Preferences text',\n author: 'Author',\n role: 'Role',\n headerRow: 'First row is a header',\n headerBackgroundColor: 'Header background',\n headerTextColor: 'Header text color',\n borderColor: 'Border color',\n addRow: 'Add row',\n addColumn: 'Add column',\n removeRow: 'Remove last row',\n removeColumn: 'Remove last column',\n cell: 'Row {row}, column {column}',\n categoryText: 'Eyebrow',\n headline: 'Headline',\n subtitle: 'Subtitle',\n ctaText: 'Button text',\n ctaUrl: 'Button URL',\n ctaColor: 'Button color',\n padding: 'Vertical padding (px)',\n columnCount: 'Columns',\n bodyBackgroundColor: 'Page background',\n contentBackgroundColor: 'Content background',\n contentWidth: 'Content width (px)',\n fontFamily: 'Font',\n headingColor: 'Heading color',\n linkColor: 'Link color',\n buttonBackgroundColor: 'Button color',\n buttonTextColor: 'Button text color',\n buttonBorderRadius: 'Button corner radius (px)',\n },\n options: {\n left: 'Left',\n center: 'Center',\n right: 'Right',\n solid: 'Solid',\n dashed: 'Dashed',\n dotted: 'Dotted',\n sm: 'Small',\n md: 'Medium',\n lg: 'Large',\n },\n};\n\nexport type EmailEditorLabels = typeof defaultEmailEditorLabels;\n\nexport type EmailEditorLabelOverrides = {\n [K in keyof EmailEditorLabels]?: EmailEditorLabels[K] extends string\n ? string\n : Partial<EmailEditorLabels[K]>;\n};\n\nexport function mergeEmailEditorLabels(\n overrides: EmailEditorLabelOverrides | undefined\n): EmailEditorLabels {\n if (!overrides) return defaultEmailEditorLabels;\n const d = defaultEmailEditorLabels;\n return {\n ...d,\n ...overrides,\n blockTypes: { ...d.blockTypes, ...overrides.blockTypes },\n platforms: { ...d.platforms, ...overrides.platforms },\n fields: { ...d.fields, ...overrides.fields },\n options: { ...d.options, ...overrides.options },\n } as EmailEditorLabels;\n}\n","import {\n generateEmailBlockId,\n type EmailBlock,\n type EmailContentBlock,\n} from './types';\n\ntype Edit = <B extends EmailBlock>(list: B[], index: number) => B[];\n\n/** Apply `edit` to whichever list (top level or a column) contains `id`. */\nfunction editContaining<B extends EmailBlock>(\n blocks: B[],\n id: string,\n edit: Edit\n): B[] {\n const index = blocks.findIndex((b) => b.id === id);\n if (index !== -1) return edit(blocks, index);\n let changed = false;\n const next = blocks.map((block) => {\n if (block.type !== 'columns') return block;\n let hit = false;\n const columns = block.columns.map((column) => {\n const inner = editContaining(column.blocks, id, edit);\n if (inner === column.blocks) return column;\n hit = changed = true;\n return { ...column, blocks: inner };\n });\n return hit ? { ...block, columns } : block;\n });\n return changed ? next : blocks;\n}\n\nexport function findEmailBlock(\n blocks: EmailBlock[],\n id: string | null\n): EmailBlock | undefined {\n if (!id) return undefined;\n for (const block of blocks) {\n if (block.id === id) return block;\n if (block.type === 'columns') {\n for (const column of block.columns) {\n const found = findEmailBlock(column.blocks, id);\n if (found) return found;\n }\n }\n }\n return undefined;\n}\n\nexport function updateEmailBlock(\n blocks: EmailBlock[],\n id: string,\n patch: Partial<EmailBlock>\n): EmailBlock[] {\n return editContaining(blocks, id, (list, i) =>\n list.map((b, j) => (j === i ? ({ ...b, ...patch } as typeof b) : b))\n );\n}\n\nexport function removeEmailBlock(\n blocks: EmailBlock[],\n id: string\n): EmailBlock[] {\n return editContaining(blocks, id, (list, i) =>\n list.filter((_, j) => j !== i)\n );\n}\n\nexport function moveEmailBlock(\n blocks: EmailBlock[],\n id: string,\n delta: number\n): EmailBlock[] {\n return editContaining(blocks, id, (list, i) => {\n const target = i + delta;\n if (target < 0 || target >= list.length) return list;\n const next = [...list];\n const [moved] = next.splice(i, 1);\n next.splice(target, 0, moved);\n return next;\n });\n}\n\nfunction cloneWithNewIds<B extends EmailBlock>(block: B): B {\n const copy = { ...block, id: generateEmailBlockId() };\n if (copy.type === 'columns') {\n copy.columns = copy.columns.map((column) => ({\n ...column,\n id: generateEmailBlockId(),\n blocks: column.blocks.map(cloneWithNewIds),\n }));\n }\n return copy;\n}\n\n/** Returns the new list and the copy's id. */\nexport function duplicateEmailBlock(\n blocks: EmailBlock[],\n id: string\n): { blocks: EmailBlock[]; newId: string | null } {\n let newId: string | null = null;\n const next = editContaining(blocks, id, (list, i) => {\n const copy = cloneWithNewIds(list[i]);\n newId = copy.id;\n return [...list.slice(0, i + 1), copy, ...list.slice(i + 1)];\n });\n return { blocks: next, newId };\n}\n\nexport function addBlockToColumn(\n blocks: EmailBlock[],\n columnsId: string,\n columnIndex: number,\n block: EmailContentBlock\n): EmailBlock[] {\n return blocks.map((b) =>\n b.id === columnsId && b.type === 'columns'\n ? {\n ...b,\n columns: b.columns.map((column, i) =>\n i === columnIndex\n ? { ...column, blocks: [...column.blocks, block] }\n : column\n ),\n }\n : b\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport {\n DndContext,\n DragOverlay,\n PointerSensor,\n closestCenter,\n useDraggable,\n useDroppable,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n} from '@dnd-kit/core';\nimport {\n SortableContext,\n arrayMove,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport {\n ChevronDown,\n ChevronUp,\n Code,\n Columns2,\n Copy,\n GripVertical,\n Heading,\n Image as ImageIcon,\n Megaphone,\n Minus,\n Monitor,\n MousePointerClick,\n MoveVertical,\n PanelBottom,\n Quote,\n Redo2,\n Share2,\n Smartphone,\n Table,\n Trash2,\n Type,\n Undo2,\n} from 'lucide-react';\n\nimport { useLiveAnnouncement } from '../../hooks/useLiveAnnouncement';\nimport { cn } from '../../utils/cn';\nimport type { RichTextVariableGroup } from '../RichTextEditor';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '../Tabs';\nimport { EmailBlockPreview } from './EmailBlockPreview';\nimport {\n Button,\n EmailBlockSettings,\n EmailDesignPanel,\n} from './EmailBlockSettings';\nimport {\n mergeEmailEditorLabels,\n type EmailEditorLabelOverrides,\n type EmailEditorLabels,\n} from './labels';\nimport { normalizeDesignSettings } from './renderEmailMjml';\nimport {\n addBlockToColumn,\n duplicateEmailBlock,\n findEmailBlock,\n moveEmailBlock,\n removeEmailBlock,\n updateEmailBlock,\n} from './tree';\nimport {\n createEmailBlock,\n resolveDesignSettings,\n type EmailBlock,\n type EmailBlockType,\n type EmailContentBlock,\n type EmailContentTree,\n type EmailDesignSettings,\n type EmailMergeTag,\n} from './types';\n\nconst BLOCK_ICONS: Record<EmailBlockType, React.ElementType> = {\n hero: Megaphone,\n columns: Columns2,\n heading: Heading,\n text: Type,\n button: MousePointerClick,\n image: ImageIcon,\n divider: Minus,\n spacer: MoveVertical,\n social: Share2,\n quote: Quote,\n table: Table,\n html: Code,\n footer: PanelBottom,\n};\n\nexport const EMAIL_BLOCK_TYPES = Object.keys(BLOCK_ICONS) as EmailBlockType[];\n\nconst PALETTE = 'palette:';\nconst CANVAS_END = 'canvas:end';\nconst MOBILE_WIDTH = 375;\n\nfunction fill(\n template: string,\n values: Record<string, string | number>\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) =>\n String(values[key] ?? '')\n );\n}\n\ninterface Snapshot {\n tree: EmailContentTree;\n design: EmailDesignSettings | undefined;\n /** Which controlled channels the commit that created this entry changed. */\n changed: { tree: boolean; design: boolean };\n}\n\nexport interface EmailEditorProps {\n /** The email document. Controlled. */\n value: EmailContentTree;\n /** Called with the next document after every edit. */\n onChange: (value: EmailContentTree) => void;\n /** Global colours, font and width. Merged over `createDefaultDesignSettings()`. */\n design?: EmailDesignSettings;\n /** Enables the Design tab. Omit to make design settings read-only. */\n onDesignChange?: (design: EmailDesignSettings) => void;\n /** Merge fields offered in the text block's Variables menu. */\n mergeTags?: EmailMergeTag[];\n /** Palette order and availability. Defaults to every block type. */\n blockTypes?: EmailBlockType[];\n /** Upload handler for image blocks; resolve with the hosted URL. */\n onUploadImage?: (file: File) => Promise<string>;\n /** Override any user-facing string. */\n labels?: EmailEditorLabelOverrides;\n className?: string;\n}\n\ninterface BlockFrameProps {\n block: EmailBlock;\n selected: boolean;\n labels: EmailEditorLabels;\n onSelect: () => void;\n onMove: (delta: number) => void;\n onDuplicate: () => void;\n onRemove: () => void;\n isFirst: boolean;\n isLast: boolean;\n dragHandle?: React.ReactNode;\n children: React.ReactNode;\n}\n\nfunction BlockFrame({\n block,\n selected,\n labels,\n onSelect,\n onMove,\n onDuplicate,\n onRemove,\n isFirst,\n isLast,\n dragHandle,\n children,\n}: BlockFrameProps) {\n // `?? type` names unsupported block types from host documents at runtime.\n const name = labels.blockTypes[block.type] ?? block.type;\n const tool = 'text-muted-foreground hover:text-foreground h-7 w-7';\n // Frames nest inside columns, so a child's click must not also select its parent.\n const own = (action: () => void) => (e: React.MouseEvent) => {\n e.stopPropagation();\n action();\n };\n return (\n <div\n data-slot=\"email-editor-block\"\n data-selected={selected || undefined}\n className={cn(\n 'relative outline-offset-[-2px]',\n selected\n ? 'outline-primary-500 outline outline-2'\n : 'hover:outline-primary-300 focus-within:outline-primary-300 focus-within:outline-1 focus-within:outline-dashed hover:outline-1 hover:outline-dashed'\n )}\n >\n <div\n data-slot=\"email-editor-block-toolbar\"\n className={cn(\n 'bg-background border-border absolute end-2 -top-3.5 z-10 flex items-center rounded-md border shadow-sm',\n // Reveal on hover of this frame only, not of a frame nested inside it.\n !selected &&\n 'opacity-0 focus-within:opacity-100 [[data-slot=email-editor-block]:hover:not(:has([data-slot=email-editor-block]:hover))>&]:opacity-100'\n )}\n >\n {dragHandle}\n <button\n type=\"button\"\n aria-pressed={selected}\n aria-label={fill(labels.selectBlock, { item: name })}\n onClick={own(onSelect)}\n className=\"text-foreground focus-visible:ring-ring rounded px-2 text-xs font-medium focus-visible:ring-2 focus-visible:outline-none\"\n >\n {name}\n </button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={tool}\n aria-label={labels.moveUp}\n disabled={isFirst}\n onClick={own(() => onMove(-1))}\n >\n <ChevronUp className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={tool}\n aria-label={labels.moveDown}\n disabled={isLast}\n onClick={own(() => onMove(1))}\n >\n <ChevronDown className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={tool}\n aria-label={labels.duplicate}\n onClick={own(onDuplicate)}\n >\n <Copy className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(tool, 'hover:text-destructive')}\n aria-label={labels.remove}\n onClick={own(onRemove)}\n >\n <Trash2 className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n </div>\n {/* Mouse shortcut for the Select button in the toolbar above. */}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n <div\n onClick={(e) => {\n e.stopPropagation();\n // A preview link reached by keyboard must select, not navigate away.\n if ((e.target as HTMLElement).closest('a')) e.preventDefault();\n onSelect();\n }}\n className=\"cursor-pointer [&_a]:pointer-events-none\"\n >\n {children}\n </div>\n </div>\n );\n}\n\nfunction SortableBlock({\n id,\n children,\n}: {\n id: string;\n children: (handle: React.ReactNode) => React.ReactNode;\n}) {\n const {\n setNodeRef,\n setActivatorNodeRef,\n listeners,\n transform,\n transition,\n isDragging,\n } = useSortable({ id });\n // Pointer-only: keyboard users reorder with the Move up/down buttons.\n const handle = (\n <span\n ref={setActivatorNodeRef}\n {...listeners}\n aria-hidden=\"true\"\n className=\"text-muted-foreground flex h-7 w-6 cursor-grab touch-none items-center justify-center\"\n >\n <GripVertical className=\"h-4 w-4\" />\n </span>\n );\n return (\n <div\n ref={setNodeRef}\n style={{ transform: CSS.Transform.toString(transform), transition }}\n className={cn(isDragging && 'relative z-20 opacity-60')}\n >\n {children(handle)}\n </div>\n );\n}\n\nfunction PaletteItem({\n type,\n label,\n onAdd,\n}: {\n type: EmailBlockType;\n label: string;\n onAdd: () => void;\n}) {\n const { setNodeRef, listeners } = useDraggable({ id: PALETTE + type });\n const Icon = BLOCK_ICONS[type];\n return (\n <button\n ref={setNodeRef}\n type=\"button\"\n onPointerDown={\n listeners?.onPointerDown as React.PointerEventHandler | undefined\n }\n onClick={onAdd}\n className=\"border-border bg-background hover:bg-muted hover:border-primary-300 text-foreground focus-visible:ring-ring flex w-24 shrink-0 flex-col items-center gap-1 rounded-md border p-2 text-xs focus-visible:ring-2 focus-visible:outline-none lg:w-auto\"\n >\n <Icon className=\"text-muted-foreground h-5 w-5\" aria-hidden=\"true\" />\n {label}\n </button>\n );\n}\n\nfunction CanvasEnd({ empty, label }: { empty: boolean; label: string }) {\n const { setNodeRef, isOver } = useDroppable({ id: CANVAS_END });\n return (\n <div\n ref={setNodeRef}\n className={cn(\n 'text-muted-foreground flex items-center justify-center text-center text-sm',\n empty\n ? 'border-border m-4 min-h-32 rounded-md border-2 border-dashed p-6'\n : 'min-h-8',\n isOver && 'bg-primary-500/10'\n )}\n >\n {empty && label}\n </div>\n );\n}\n\n/**\n * Block-based email builder: palette, sortable canvas, per-block settings and\n * global design. Serialise the document with `renderEmailMjml`.\n */\nexport const EmailEditor = React.forwardRef<HTMLDivElement, EmailEditorProps>(\n (\n {\n value,\n onChange,\n design: designProp,\n onDesignChange,\n mergeTags,\n blockTypes = EMAIL_BLOCK_TYPES,\n onUploadImage,\n labels: labelOverrides,\n className,\n },\n ref\n ) => {\n const labels = React.useMemo(\n () => mergeEmailEditorLabels(labelOverrides),\n [labelOverrides]\n );\n const design = React.useMemo(\n () => normalizeDesignSettings(designProp),\n [designProp]\n );\n const [selectedId, setSelectedId] = React.useState<string | null>(null);\n const [viewport, setViewport] = React.useState<'desktop' | 'mobile'>(\n 'desktop'\n );\n const [dragging, setDragging] = React.useState<string | null>(null);\n const [past, setPast] = React.useState<Snapshot[]>([]);\n const [future, setFuture] = React.useState<Snapshot[]>([]);\n const [announcement, announce] = useLiveAnnouncement();\n\n const variableGroups = React.useMemo<\n RichTextVariableGroup[] | undefined\n >(() => {\n if (!mergeTags?.length) return undefined;\n const groups = new Map<string, RichTextVariableGroup>();\n for (const tag of mergeTags) {\n const group = groups.get(tag.group) ?? {\n label: tag.group,\n variables: [],\n };\n group.variables.push({ label: tag.label, value: tag.token });\n groups.set(tag.group, group);\n }\n return [...groups.values()];\n }, [mergeTags]);\n\n // Async edits (image uploads) must land on the document as it is when they finish.\n const latest = React.useRef({ value, designProp, onChange });\n React.useEffect(() => {\n latest.current = { value, designProp, onChange };\n });\n\n const present = (changed: Snapshot['changed']): Snapshot => ({\n tree: value,\n design: designProp,\n changed,\n });\n const commit = (\n tree: EmailContentTree,\n nextDesign?: EmailDesignSettings\n ) => {\n const current = latest.current;\n const changed = {\n tree: tree !== current.value,\n design: Boolean(nextDesign),\n };\n if (!changed.tree && !changed.design) return;\n setPast((p) => [\n ...p.slice(-49),\n { tree: current.value, design: current.designProp, changed },\n ]);\n setFuture([]);\n if (changed.tree) current.onChange(tree);\n if (nextDesign) onDesignChange?.(nextDesign);\n };\n const setBlocks = (blocks: EmailBlock[]) => commit({ ...value, blocks });\n const patchBlock = (id: string, patch: Partial<EmailBlock>) => {\n const doc = latest.current.value;\n if (!findEmailBlock(doc.blocks, id)) return;\n commit({ ...doc, blocks: updateEmailBlock(doc.blocks, id, patch) });\n };\n // Only replay the channels the entry's commit changed: a design-only undo\n // must not overwrite a document the host may have updated since (and vice\n // versa), nor fire a spurious onChange.\n const restore = (snapshot: Snapshot) => {\n if (snapshot.changed.tree) onChange(snapshot.tree);\n if (snapshot.changed.design) onDesignChange?.(snapshot.design ?? {});\n };\n const undo = () => {\n const previous = past[past.length - 1];\n if (!previous) return;\n setPast((p) => p.slice(0, -1));\n setFuture((f) => [present(previous.changed), ...f]);\n restore(previous);\n };\n const redo = () => {\n const next = future[0];\n if (!next) return;\n setFuture((f) => f.slice(1));\n setPast((p) => [...p, present(next.changed)]);\n restore(next);\n };\n\n // `?? type` covers unsupported block types from host documents at runtime.\n const nameOf = (type: EmailBlockType) => labels.blockTypes[type] ?? type;\n\n const insertBlock = (type: EmailBlockType, index?: number) => {\n const block = createEmailBlock(type);\n const blocks = [...value.blocks];\n // The selection may sit inside columns; insert after its top-level container.\n const selectedIndex = blocks.findIndex((b) =>\n Boolean(findEmailBlock([b], selectedId))\n );\n const at =\n index ?? (selectedIndex === -1 ? blocks.length : selectedIndex + 1);\n blocks.splice(at, 0, block);\n setBlocks(blocks);\n setSelectedId(block.id);\n announce(fill(labels.announceAdded, { item: nameOf(type) }));\n };\n\n const selected = findEmailBlock(value.blocks, selectedId);\n\n const frameProps = (\n block: EmailBlock,\n siblings: EmailBlock[],\n index: number\n ) => ({\n block,\n labels,\n selected: block.id === selectedId,\n isFirst: index === 0,\n isLast: index === siblings.length - 1,\n onSelect: () => setSelectedId(block.id),\n onMove: (delta: number) => {\n setBlocks(moveEmailBlock(value.blocks, block.id, delta));\n announce(\n fill(labels.announceMoved, {\n item: nameOf(block.type),\n position: index + 1 + delta,\n })\n );\n },\n onDuplicate: () => {\n const { blocks, newId } = duplicateEmailBlock(value.blocks, block.id);\n setBlocks(blocks);\n setSelectedId(newId);\n announce(fill(labels.announceDuplicated, { item: nameOf(block.type) }));\n },\n onRemove: () => {\n setBlocks(removeEmailBlock(value.blocks, block.id));\n if (findEmailBlock([block], selectedId)) setSelectedId(null);\n announce(fill(labels.announceRemoved, { item: nameOf(block.type) }));\n },\n });\n\n const renderPreview = (block: EmailBlock) => (\n <EmailBlockPreview\n block={block}\n design={design}\n emptyColumnLabel={labels.emptyColumn}\n unsupportedBlockLabel={labels.unsupportedBlock}\n platformLabels={labels.platforms}\n renderChild={(child) => {\n const column =\n block.type === 'columns'\n ? block.columns.find((c) =>\n c.blocks.some((b) => b.id === child.id)\n )\n : undefined;\n const siblings = column?.blocks ?? [];\n return (\n <BlockFrame\n {...frameProps(child, siblings, siblings.indexOf(child))}\n >\n {renderPreview(child)}\n </BlockFrame>\n );\n }}\n />\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } })\n );\n\n const onDragStart = (event: DragStartEvent) =>\n setDragging(String(event.active.id));\n const onDragEnd = ({ active, over }: DragEndEvent) => {\n setDragging(null);\n if (!over) return;\n const activeId = String(active.id);\n const overId = String(over.id);\n const overIndex = value.blocks.findIndex((b) => b.id === overId);\n if (activeId.startsWith(PALETTE)) {\n insertBlock(\n activeId.slice(PALETTE.length) as EmailBlockType,\n overIndex === -1 ? value.blocks.length : overIndex\n );\n return;\n }\n const from = value.blocks.findIndex((b) => b.id === activeId);\n const to = overId === CANVAS_END ? value.blocks.length - 1 : overIndex;\n if (from === -1 || to === -1 || from === to) return;\n setBlocks(arrayMove(value.blocks, from, to));\n announce(\n fill(labels.announceMoved, {\n item: nameOf(value.blocks[from].type),\n position: to + 1,\n })\n );\n };\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n const target = event.target as HTMLElement;\n if (target.closest('input, textarea, select, [contenteditable=\"true\"]'))\n return;\n if (!(event.metaKey || event.ctrlKey) || event.key.toLowerCase() !== 'z')\n return;\n event.preventDefault();\n if (event.shiftKey) redo();\n else undo();\n };\n\n const draggingType = dragging?.startsWith(PALETTE)\n ? (dragging.slice(PALETTE.length) as EmailBlockType)\n : (value.blocks.find((b) => b.id === dragging)?.type ?? null);\n\n const panel = 'border-border bg-background flex min-h-0 flex-col';\n const panelBody = 'flex flex-col gap-3 overflow-y-auto p-4';\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragCancel={() => setDragging(null)}\n >\n {/* Undo/redo shortcuts for the whole editor; text fields keep their native undo. */}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div\n ref={ref}\n data-slot=\"email-editor\"\n onKeyDown={onKeyDown}\n className={cn(\n 'border-border bg-muted/30 text-foreground flex min-h-[640px] flex-col overflow-hidden rounded-lg border lg:flex-row',\n className\n )}\n >\n <aside\n data-slot=\"email-editor-palette\"\n className={cn(panel, 'border-b lg:w-64 lg:border-e lg:border-b-0')}\n >\n <Tabs\n defaultValue=\"blocks\"\n className=\"flex min-h-0 flex-1 flex-col\"\n >\n <TabsList className=\"px-2\">\n <TabsTrigger value=\"blocks\">{labels.blocks}</TabsTrigger>\n {onDesignChange && (\n <TabsTrigger value=\"design\">{labels.design}</TabsTrigger>\n )}\n </TabsList>\n <TabsContent value=\"blocks\" className=\"overflow-y-auto p-3\">\n <div\n className=\"flex gap-2 overflow-x-auto pb-1 lg:grid lg:grid-cols-2 lg:overflow-visible lg:pb-0\"\n aria-label={labels.addBlock}\n role=\"group\"\n >\n {blockTypes.map((type) => (\n <PaletteItem\n key={type}\n type={type}\n label={nameOf(type)}\n onAdd={() => insertBlock(type)}\n />\n ))}\n </div>\n </TabsContent>\n {onDesignChange && (\n <TabsContent value=\"design\" className={panelBody}>\n {/* Raw values, so an in-progress colour (`#12…`) is not snapped\n back to a fallback; only the canvas and MJML normalise. */}\n <EmailDesignPanel\n design={resolveDesignSettings(designProp)}\n labels={labels}\n onChange={(patch) =>\n commit(value, { ...designProp, ...patch })\n }\n />\n </TabsContent>\n )}\n </Tabs>\n </aside>\n\n <section\n data-slot=\"email-editor-canvas\"\n aria-label={labels.canvas}\n className=\"flex min-w-0 flex-1 flex-col\"\n >\n <div className=\"border-border bg-background flex items-center gap-1 border-b px-3 py-2\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.undo}\n title={labels.undo}\n disabled={!past.length}\n onClick={undo}\n >\n <Undo2 className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={labels.redo}\n title={labels.redo}\n disabled={!future.length}\n onClick={redo}\n >\n <Redo2 className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n <div\n role=\"group\"\n aria-label={labels.viewport}\n className=\"ms-auto flex gap-1\"\n >\n {(\n [\n ['desktop', Monitor, labels.desktop],\n ['mobile', Smartphone, labels.mobile],\n ] as const\n ).map(([mode, Icon, label]) => (\n <Button\n key={mode}\n variant={viewport === mode ? 'secondary' : 'ghost'}\n size=\"icon\"\n aria-label={label}\n title={label}\n aria-pressed={viewport === mode}\n onClick={() => setViewport(mode)}\n >\n <Icon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n ))}\n </div>\n </div>\n {/* Clicking the bare backdrop clears the selection. */}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n <div\n className=\"flex-1 overflow-auto px-2 py-8 sm:px-6\"\n style={{ background: design.bodyBackgroundColor }}\n onClick={(e) =>\n e.target === e.currentTarget && setSelectedId(null)\n }\n >\n <div\n dir=\"ltr\"\n className=\"mx-auto shadow-sm transition-[width]\"\n style={{\n width:\n viewport === 'mobile' ? MOBILE_WIDTH : design.contentWidth,\n maxWidth: '100%',\n background: design.contentBackgroundColor,\n color: design.textColor,\n fontFamily: design.fontFamily,\n fontSize: 16,\n lineHeight: 1.6,\n }}\n >\n <SortableContext\n items={value.blocks.map((b) => b.id)}\n strategy={verticalListSortingStrategy}\n >\n {value.blocks.map((block, index) => (\n <SortableBlock key={block.id} id={block.id}>\n {(handle) => (\n <BlockFrame\n {...frameProps(block, value.blocks, index)}\n dragHandle={handle}\n >\n {renderPreview(block)}\n </BlockFrame>\n )}\n </SortableBlock>\n ))}\n </SortableContext>\n <CanvasEnd\n empty={!value.blocks.length}\n label={labels.emptyCanvas}\n />\n </div>\n </div>\n </section>\n\n <aside\n data-slot=\"email-editor-settings\"\n aria-label={labels.blockSettings}\n className={cn(panel, 'border-t lg:w-80 lg:border-s lg:border-t-0')}\n >\n <h2 className=\"border-border border-b px-4 py-3 text-sm font-semibold\">\n {selected ? nameOf(selected.type) : labels.blockSettings}\n </h2>\n <div className={panelBody}>\n {selected ? (\n <EmailBlockSettings\n key={selected.id}\n block={selected}\n design={design}\n labels={labels}\n variableGroups={variableGroups}\n onUploadImage={onUploadImage}\n onChange={(patch) => patchBlock(selected.id, patch)}\n onAddToColumn={(columnIndex, block: EmailContentBlock) => {\n setBlocks(\n addBlockToColumn(\n value.blocks,\n selected.id,\n columnIndex,\n block\n )\n );\n setSelectedId(block.id);\n announce(\n fill(labels.announceAdded, { item: nameOf(block.type) })\n );\n }}\n />\n ) : (\n <p className=\"text-muted-foreground text-sm\">\n {labels.noSelection}\n </p>\n )}\n </div>\n </aside>\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n </div>\n <DragOverlay dropAnimation={null}>\n {draggingType && dragging?.startsWith(PALETTE) ? (\n <div className=\"bg-background border-primary-500 text-foreground rounded-md border px-3 py-2 text-xs font-medium shadow-lg\">\n {nameOf(draggingType)}\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n );\n }\n);\n\nEmailEditor.displayName = 'EmailEditor';\n"]}
|