react-email-studio 3.8.0 → 3.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +9 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +9 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/ReactEmailEditor.tsx","../src/constants.tsx","../src/defaultBlockProps.ts","../src/lib/columnProps.ts","../src/lib/factories.ts","../src/lib/columnPath.ts","../src/lib/htmlUtils.ts","../src/socialIcons.tsx","../src/lib/blockBackground.ts","../src/lib/emailHtml.ts","../src/schema/emailDocument.ts","../src/lib/emailDesignJson.ts","../src/lib/htmlToEmailDesign.ts","../src/editor/canvas/DesignCanvas.tsx","../src/editor/properties/PropertyEditors.tsx","../src/editor/properties/TextRichEditor.tsx","../src/editor/properties/LetterSpacing.ts","../src/editor/properties/ColorSwatchGrid.tsx","../src/editor/preview/EmailPreviewModal.tsx","../src/editor/overlays/ContextMenu.tsx","../src/editor/overlays/ConfirmDialog.tsx","../src/editor/chrome/TBtn.tsx"],"sourcesContent":["export {\r\n ReactEmailEditor,\r\n type ReactEmailEditorRef,\r\n type ReactEmailEditorProps,\r\n type ReactEmailEditorOptions,\r\n type LoadJsonOptions,\r\n} from \"./ReactEmailEditor\";\r\n\r\nexport {\r\n jsonToHtml,\r\n canonicalizeEmailDocument,\r\n coerceEmailDocumentInput,\r\n type JsonToHtmlOptions,\r\n} from \"./lib/emailDesignJson\";\r\nexport { htmlToEmailDesignTemplate, extractHtmlForDesign, htmlToJson } from \"./lib/htmlToEmailDesign\";\r\nexport type { EmailHtmlOptions } from \"./lib/emailHtml\";\r\nexport { utf8ToBase64, base64ToUtf8 } from \"./lib/htmlUtils\";\r\n\r\nexport {\r\n PreviewModal as EmailPreviewModal,\r\n DEVICES as emailPreviewDevices,\r\n type EmailPreviewModalProps,\r\n type MobilePreviewVariant,\r\n} from \"./editor/preview/EmailPreviewModal\";\r\n\r\nexport type {\r\n EmailDocument,\r\n EmailDocumentSettings,\r\n EmailDocumentRow,\r\n EmailDocumentColumn,\r\n BlockBase,\r\n RowProps,\r\n ColumnProps,\r\n RowStyles,\r\n ColumnStyles,\r\n} from \"./schema/emailDocument\";\r\n","import {\n useState, useRef, useEffect, useCallback, useMemo,\n forwardRef,\n useImperativeHandle,\n Fragment,\n type CSSProperties,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from \"react\";\nimport {\n THEMES,\n tr,\n LAYOUT_PRESETS,\n CONTENT_BLOCK_TYPES,\n BLOCK_PALETTE_GROUPS,\n type BlockPaletteGroupKey,\n} from \"./constants\";\nimport { makeLayoutRow, makeContentBlock, makeNestedRowBlock, makeRootContentRow, uid } from \"./lib/factories\";\nimport {\n getColumnBlocks,\n updateColumnAt,\n toColumnLoc,\n sameColumnLoc,\n countBlocksInDesign,\n isSplitLayoutBlock,\n isRootContentRow,\n MAX_NESTED_LAYOUT_DEPTH,\n nestedLayoutDepth,\n} from \"./lib/columnPath\";\nimport {\n coerceEmailDocumentInput,\n designToEmailDocument,\n emailDocumentToEditorRows,\n normalizeEmailDesignInput,\n jsonToHtml,\n} from \"./lib/emailDesignJson\";\nimport { htmlToJson } from \"./lib/htmlToEmailDesign\";\nimport { CanvasRow } from \"./editor/canvas/DesignCanvas\";\nimport { Image as ImageIcon, Repeat as RepeatIcon, Move as MoveIcon, Scaling, Crosshair, Blend as GradientIcon, Droplets as ColorIcon } from \"lucide-react\";\nimport { ContentBlockEditor, LayoutRowEditor, PR, NumRangePx, ColorField, ImageUrlUploadField, DynamicGradientField, BgModeButtons } from \"./editor/properties/PropertyEditors\";\nimport { PreviewModal } from \"./editor/preview/EmailPreviewModal\";\nimport { designToHtml, type EmailHtmlOptions } from \"./lib/emailHtml\";\nimport { ContextMenu } from \"./editor/overlays/ContextMenu\";\nimport { ConfirmDialog } from \"./editor/overlays/ConfirmDialog\";\nimport { TBtn } from \"./editor/chrome/TBtn\";\n\nconst RIGHT_RAIL_DEFAULT_W = 328;\nconst RIGHT_RAIL_MIN_W = 260;\nconst RIGHT_RAIL_MAX_W = 720;\n\n/** Theme color tokens (subset used by the editor chrome). */\ntype ThemeColors = (typeof THEMES)[\"light\"];\n\n/** Known `options` keys for {@link ReactEmailEditor} — callers may pass extra keys; these are what the editor reads. */\nexport type ReactEmailEditorOptions = EmailHtmlOptions & {\n appearance?: {\n theme?: string;\n /** Shallow merge over the active theme (e.g. accent border). */\n colors?: Partial<ThemeColors>;\n /** Extra named palettes; keys appear in Settings → Color scheme. */\n customThemes?: Record<string, ThemeColors>;\n };\n locale?: string;\n features?: { autoSave?: { enabled?: boolean; interval?: number } };\n tools?: Record<string, { enabled?: boolean }>;\n /** Optional labels for block-library sections (row layouts + content blocks). */\n blockLibrary?: {\n groupHeadings?: { blocks?: string };\n /** Override default palette group titles (keys: text, structure, media, actions, widgets). */\n paletteGroupLabels?: Partial<Record<BlockPaletteGroupKey, string>>;\n };\n};\n\nexport type LoadJsonOptions = { mode?: \"replace\" | \"append\" };\n\nexport interface ReactEmailEditorRef {\n loadJson(input: string | Record<string, unknown>, options?: LoadJsonOptions): void;\n /** Calls `cb` with the design as a JSON string (new `email_document` schema). */\n exportJson(cb: (json: string) => void, pretty?: boolean): void;\n}\n\nexport type ReactEmailEditorProps = {\n minHeight?: string;\n editorId?: string;\n options?: ReactEmailEditorOptions;\n style?: CSSProperties;\n onLoad?: (api: ReactEmailEditorRef) => void;\n onReady?: (api: ReactEmailEditorRef) => void;\n onUpload?: (file: File) => Promise<string>;\n templates?: { name: string; design: unknown; thumbnail?: string }[];\n hideTemplates?: boolean;\n children?: ReactNode;\n};\n\nconst ReactEmailEditorComponent = forwardRef<ReactEmailEditorRef, ReactEmailEditorProps>(\n function ReactEmailEditor(\n {\n minHeight = \"100vh\",\n editorId = \"email-editor\",\n onLoad,\n onReady,\n onUpload,\n options = {},\n templates = [],\n hideTemplates = false,\n style = {},\n },\n ref,\n ) {\n const opt = options;\n const mergedThemes = useMemo(\n () => ({ ...THEMES, ...(opt.appearance?.customThemes || {}) }),\n [opt.appearance?.customThemes],\n );\n const initialTheme =\n typeof opt.appearance?.theme === \"string\" && mergedThemes[opt.appearance.theme]\n ? opt.appearance.theme\n : \"light\";\n const [colorSchema, setColorSchema] = useState<string>(initialTheme);\n\n const [rows, setRows] = useState<any[]>(() => [makeLayoutRow(LAYOUT_PRESETS[0])]);\n const [selectedRowId,setSelectedRowId] = useState<string | null>(null);\n const [selContentId, setSelContentId] = useState<string | null>(null);\n const [selContentMeta,setSelMeta] = useState<any>(null);\n const [dragOver, setDragOver] = useState<number | null>(null);\n const [draggingRowId,setDraggingRowId] = useState<string | null>(null);\n const draggingRowIdRef = useRef<string | null>(null);\n const setRowDrag = useCallback((id: string | null) => {\n draggingRowIdRef.current = id;\n setDraggingRowId(id);\n }, []);\n const [history, setHistory] = useState<string[]>([]);\n const [future, setFuture] = useState<string[]>([]);\n const [showPreviewModal,setShowPreview]= useState<boolean>(false);\n const [previewDevice,setPreviewDevice] = useState<string>(\"desktop\");\n const [activeTab, setActiveTab] = useState<\"blocks\" | \"settings\">(\"blocks\");\n const [templatesOpen,setTemplatesOpen] = useState<boolean>(false);\n const [jsonLoading, setJsonLoading] = useState<boolean>(false);\n const [autoSaveMsg, setAutoSaveMsg] = useState<string>(\"\");\n const [locale, setLocale] = useState<string>(\n typeof opt.locale === \"string\" ? opt.locale : \"en\",\n );\n const [zoom, setZoom] = useState(100);\n const [rightRailWidth, setRightRailWidth] = useState(RIGHT_RAIL_DEFAULT_W);\n const [ctxMenu, setCtxMenu] = useState<any>(null); // {x,y,items}\n const [confirm, setConfirm] = useState<any>(null); // {msg,onConfirm}\n const [settings, setSettings] = useState({\n bgColor: \"#f1f5f9\",\n bgImage: \"\",\n bgSize: \"cover\",\n bgRepeat: \"no-repeat\",\n bgPosition: \"center\",\n bgGradient: null as any,\n contentBg: \"#ffffff\",\n contentBgImage: \"\",\n contentBgSize: \"cover\",\n contentBgRepeat: \"no-repeat\",\n contentBgPosition: \"center\",\n contentBgGradient: null as any,\n contentWidth: 600,\n padding: 24,\n borderRadius: 8,\n });\n /** Background UI: show type first; detail controls only after a choice (or after `loadJson`). */\n const [pageBgUiStep, setPageBgUiStep] = useState<null | \"solid\" | \"image\" | \"gradient\">(null);\n const [contentBgUiStep, setContentBgUiStep] = useState<null | \"solid\" | \"image\" | \"gradient\">(null);\n\n const pageBgLastSolidRef = useRef<string>(\"#f1f5f9\");\n const pageBgIsOff =\n !String((settings as any).bgColor ?? \"\").trim() &&\n !String((settings as any).bgImage ?? \"\").trim() &&\n !((settings as any).bgGradient as any);\n\n const applyPageBgMode = (mode: \"solid\" | \"image\" | \"gradient\") => {\n setPageBgUiStep(mode);\n if (mode === \"solid\") {\n setSettings((s) => {\n const next = { ...s, bgGradient: null, bgImage: \"\" };\n const raw = typeof next.bgColor === \"string\" ? next.bgColor.trim() : \"\";\n if (!raw) next.bgColor = pageBgLastSolidRef.current || \"#f1f5f9\";\n return next;\n });\n return;\n }\n if (mode === \"image\") {\n setSettings((s) => ({ ...s, bgGradient: null }));\n return;\n }\n setSettings((s) => ({\n ...s,\n bgImage: \"\",\n bgGradient:\n (s as any).bgGradient || { angle: 135, colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"], stops: [0, 50, 100] },\n }));\n };\n\n const applyContentBgMode = (mode: \"solid\" | \"image\" | \"gradient\") => {\n setContentBgUiStep(mode);\n if (mode === \"solid\") {\n setSettings((s) => ({ ...s, contentBgGradient: null, contentBgImage: \"\" }));\n return;\n }\n if (mode === \"image\") {\n setSettings((s) => ({ ...s, contentBgGradient: null }));\n return;\n }\n setSettings((s) => ({\n ...s,\n contentBgImage: \"\",\n contentBgGradient:\n (s as any).contentBgGradient || { angle: 135, colors: [\"#ffffff\", \"#ffffff\", \"#ffffff\"], stops: [0, 50, 100] },\n }));\n };\n\n const autoSaveTimer = useRef<any>(null);\n /** Latest document for `exportJson`. */\n const rowsRef = useRef(rows);\n const settingsRef = useRef(settings);\n rowsRef.current = rows;\n settingsRef.current = settings;\n\n useEffect(() => {\n if (rows.length === 0) {\n setRows([makeLayoutRow(LAYOUT_PRESETS[0])]);\n }\n }, [rows.length]);\n\n useEffect(() => {\n const t = opt.appearance?.theme;\n if (typeof t === \"string\" && mergedThemes[t]) setColorSchema(t);\n }, [opt.appearance?.theme, mergedThemes]);\n\n const baseTheme = mergedThemes[colorSchema] || mergedThemes.light;\n const C: ThemeColors = { ...baseTheme, ...(opt.appearance?.colors || {}) };\n\n const L = (key) => tr(locale, key);\n\n // ── History ─────────────────────────────────────────────────────────────────\n const snap = useCallback(prev=>{\n setHistory(h=>[...h.slice(-50),JSON.stringify(prev)]);\n setFuture([]);\n },[]);\n const mutate = useCallback(fn=>{\n setRows(prev=>{\n snap(prev);\n const next=fn(prev);\n if (opt.features?.autoSave?.enabled) {\n clearTimeout(autoSaveTimer.current ?? undefined);\n autoSaveTimer.current = setTimeout(\n () => {\n setAutoSaveMsg(L(\"autoSaved\"));\n setTimeout(() => setAutoSaveMsg(\"\"), 2500);\n },\n opt.features?.autoSave?.interval ?? 3000,\n );\n }\n return next;\n });\n }, [snap, opt, locale]);\n\n const undo=()=>{\n if(!history.length) return;\n setFuture(f=>[JSON.stringify(rows),...f]);\n setRows(JSON.parse(history[history.length-1]));\n setHistory(h=>h.slice(0,-1));\n };\n const redo=()=>{\n if(!future.length) return;\n setHistory(h=>[...h,JSON.stringify(rows)]);\n setRows(JSON.parse(future[0]));\n setFuture(f=>f.slice(1));\n };\n\n // ── Keyboard shortcuts ──────────────────────────────────────────────────────\n useEffect(()=>{\n const handler=(e)=>{\n const tag=document.activeElement?.tagName;\n if(tag===\"INPUT\"||tag===\"TEXTAREA\"||tag===\"SELECT\") return;\n const ae=document.activeElement;\n /** TipTap / ProseMirror — let Backspace, Ctrl+Z, etc. stay inside the rich text field (not delete the block). */\n if(ae instanceof HTMLElement&&ae.closest(\".ProseMirror\")) return;\n if((e.ctrlKey||e.metaKey)&&e.key===\"z\"){e.preventDefault();undo();}\n else if((e.ctrlKey||e.metaKey)&&(e.key===\"y\"||(e.shiftKey&&e.key===\"z\"))){e.preventDefault();redo();}\n else if((e.ctrlKey||e.metaKey)&&e.key===\"d\"){e.preventDefault();if(selContentMeta)duplicateSelected();}\n else if(e.key===\"Escape\"){setSelContentId(null);setSelMeta(null);setSelectedRowId(null);setCtxMenu(null);}\n else if(e.key===\"Delete\"||e.key===\"Backspace\"){if(selContentMeta){e.preventDefault();deleteSelected();}}\n };\n window.addEventListener(\"keydown\",handler);\n return()=>window.removeEventListener(\"keydown\",handler);\n },[rows,history,future,selContentMeta]);\n\n // ── API ─────────────────────────────────────────────────────────────────────\n const buildApi=useCallback(()=>({\n loadJson(input: string | Record<string, unknown>, options?: LoadJsonOptions) {\n setJsonLoading(true);\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n try {\n let parsed: unknown = input;\n if (typeof input === \"string\") {\n try {\n parsed = JSON.parse(input);\n } catch {\n return;\n }\n }\n const coerced = coerceEmailDocumentInput(parsed);\n if (options?.mode === \"append\") {\n const extra = emailDocumentToEditorRows(coerced ?? parsed);\n if (!extra?.length) return;\n setRows((prev) => [...prev, ...extra]);\n return;\n }\n const norm = normalizeEmailDesignInput(coerced ?? parsed);\n if (!norm) return;\n setRows(norm.rows);\n const ns = norm.settings as any;\n setSettings((s) => ({ ...s, ...ns }));\n const inferPage = (): \"solid\" | \"image\" | \"gradient\" => {\n if (ns?.bgGradient) return \"gradient\";\n if (String(ns?.bgImage ?? \"\").trim()) return \"image\";\n return \"solid\";\n };\n const inferContent = (): \"solid\" | \"image\" | \"gradient\" => {\n if (ns?.contentBgGradient) return \"gradient\";\n if (String(ns?.contentBgImage ?? \"\").trim()) return \"image\";\n return \"solid\";\n };\n setPageBgUiStep(inferPage());\n setContentBgUiStep(inferContent());\n } finally {\n setJsonLoading(false);\n }\n });\n });\n },\n exportJson(cb, pretty) {\n const design = designToEmailDocument(rowsRef.current, settingsRef.current);\n const json = pretty ? JSON.stringify(design, null, 2) : JSON.stringify(design);\n cb(json);\n },\n }),[]);\n\n useImperativeHandle(ref,()=>buildApi(),[buildApi]);\n useEffect(()=>{const api=buildApi();onLoad?.(api);onReady?.(api);},[]);// eslint-disable-line\n\n // ── Row ops ─────────────────────────────────────────────────────────────────\n const handleRowDrop=(targetIdx,e)=>{\n if(e){\n e.preventDefault();\n e.stopPropagation();\n try {\n const data=JSON.parse(e.dataTransfer.getData(\"application/json\")||\"{}\");\n if(data.layoutPresetKey){\n const preset=LAYOUT_PRESETS.find(p=>p.key===data.layoutPresetKey);\n if(preset){\n mutate(prev=>{const newRow=makeLayoutRow(preset);const next=[...prev];next.splice(targetIdx,0,newRow);return next;});\n setDragOver(null);return;\n }\n }\n } catch {}\n }\n const moveId =\n draggingRowIdRef.current ??\n draggingRowId ??\n (() => {\n if (!e) return null;\n try {\n const data = JSON.parse(e.dataTransfer.getData(\"application/json\") || \"{}\");\n return typeof data.moveRowId === \"string\" ? data.moveRowId : null;\n } catch {\n return null;\n }\n })();\n if(moveId){\n mutate(prev=>{\n const fi=prev.findIndex(r=>r.id===moveId);\n if(fi===-1)return prev;\n const next=[...prev];\n const[m]=next.splice(fi,1);\n const insertAt=targetIdx>fi?targetIdx-1:targetIdx;\n next.splice(Math.max(0,Math.min(insertAt,next.length)),0,m);\n return next;\n });\n }\n setDragOver(null);\n setRowDrag(null);\n };\n const addRow =(preset)=>mutate(prev=>[...prev,makeLayoutRow(preset)]);\n const deleteRow =(id)=>{mutate(prev=>prev.filter(r=>r.id!==id));if(selectedRowId===id)setSelectedRowId(null);};\n const reassignNestedBlockIds=(b)=>{const nb={...b,id:uid()};if(isSplitLayoutBlock(nb)&&nb.props?.cells){nb.props={...nb.props,cells:nb.props.cells.map((col)=>col.map(reassignNestedBlockIds))};}return nb;};\n const dupRow =(id)=>mutate(prev=>{const i=prev.findIndex(r=>r.id===id);const copy=JSON.parse(JSON.stringify(prev[i]));copy.id=uid();copy.cells=copy.cells.map((c)=>c.map(reassignNestedBlockIds));const next=[...prev];next.splice(i+1,0,copy);return next;});\n const moveRow =(id,dir)=>mutate(prev=>{const i=prev.findIndex(r=>r.id===id);if((dir<0&&i===0)||(dir>0&&i===prev.length-1))return prev;const next=[...prev];const[r]=next.splice(i,1);next.splice(i+dir,0,r);return next;});\n const updateRow =(upd)=>mutate(prev=>prev.map(r=>r.id===upd.id?upd:r));\n\n // ── Content ops ─────────────────────────────────────────────────────────────\n const splice=(arr,item,idx)=>{const n=[...arr];n.splice(idx===null?n.length:Math.max(0,Math.min(idx,n.length)),0,item);return n;};\n\n const resolveSelectedBlock=useCallback((meta)=>{\n if(!meta)return null;\n const r=rows.find(x=>x.id===meta.rowId);\n if(!r)return null;\n const col=r.cells[meta.cellIdx];\n if(!col)return null;\n const parent=col[meta.contentIdx];\n if(!meta.inner)return parent??null;\n if(!parent||!isSplitLayoutBlock(parent))return null;\n const innerCol=parent.props.cells[meta.inner.cellIdx];\n return innerCol?.[meta.inner.contentIdx]??null;\n },[rows]);\n\n const dropContent=(rowId:any,cellIdx:any,action:any)=>{\n const {insertAt:ia=null}=action;\n const nested=action.nested;\n const toLoc=toColumnLoc(rowId,cellIdx,nested);\n if(action.kind===\"new\"){\n if (\n (action.contentType === \"layout\" || action.contentType === \"nestedRow\") &&\n nestedLayoutDepth(nested) >= MAX_NESTED_LAYOUT_DEPTH\n ) {\n return;\n }\n let nb;\n if(\n action.preset &&\n (action.contentType === \"layout\" || action.contentType === \"nestedRow\")\n ){\n nb=makeNestedRowBlock(action.preset);\n }else{\n nb=makeContentBlock(action.contentType);\n }\n const col=getColumnBlocks(rows,toLoc);\n const prevLen=col.length;\n const insertIndex=ia==null||ia===undefined?prevLen:Math.max(0,Math.min(ia,prevLen));\n mutate(prev=>updateColumnAt(prev,toLoc,c=>splice(c,nb,insertIndex)));\n setSelectedRowId(null);\n setSelContentId(nb.id);\n if(nested){\n setSelMeta({rowId,cellIdx,contentIdx:nested.parentBlockIdx,inner:{cellIdx:nested.innerCellIdx,contentIdx:insertIndex}});\n }else{\n setSelMeta({rowId,cellIdx,contentIdx:insertIndex});\n }\n } else if(action.kind===\"move\"){\n const{fromRow,fromCell,fromIdx,fromNested}=action;\n const fromLoc=toColumnLoc(fromRow,fromCell,fromNested);\n const moved=getColumnBlocks(rows,fromLoc)[fromIdx];\n if(!moved)return;\n mutate(prev=>{\n let movedBlock=null;\n let next=updateColumnAt(prev,fromLoc,c=>{movedBlock=c[fromIdx];return c.filter((_,i)=>i!==fromIdx);});\n if(!movedBlock)return prev;\n let adj=ia;\n if(sameColumnLoc(fromLoc,toLoc)&&(ia!==null&&ia!==undefined))adj=fromIdx<ia?ia-1:ia;\n const lenAfter=getColumnBlocks(next,toLoc).length;\n const insertIndex=(ia===null||ia===undefined)?lenAfter:Math.max(0,Math.min(adj,lenAfter));\n return updateColumnAt(next,toLoc,c=>splice(c,movedBlock,insertIndex));\n });\n if(moved){\n const fromLoc2=toColumnLoc(fromRow,fromCell,fromNested);\n const toLoc2=toColumnLoc(rowId,cellIdx,nested);\n const targetLenBefore=getColumnBlocks(rows,toLoc2).length;\n const sameCol=sameColumnLoc(fromLoc2,toLoc2);\n let adj=ia;\n if(sameCol&&(ia!==null&&ia!==undefined))adj=fromIdx<ia?ia-1:ia;\n const lenAfterRemove=sameCol?Math.max(0,targetLenBefore-1):targetLenBefore;\n const insertIndex=(ia===null||ia===undefined)?lenAfterRemove:Math.max(0,Math.min(adj,lenAfterRemove));\n setSelectedRowId(null);\n setSelContentId(moved.id);\n if(nested){\n setSelMeta({rowId,cellIdx,contentIdx:nested.parentBlockIdx,inner:{cellIdx:nested.innerCellIdx,contentIdx:insertIndex}});\n }else{\n setSelMeta({rowId,cellIdx,contentIdx:insertIndex});\n }\n }\n } else if(action.kind===\"duplicate\"){\n const{fromIdx,fromNested}=action;\n const loc=toColumnLoc(rowId,cellIdx,fromNested);\n const col=getColumnBlocks(rows,loc);\n const source=col[fromIdx];\n if(!source)return;\n const copy=reassignNestedBlockIds(JSON.parse(JSON.stringify(source)));\n mutate(prev=>updateColumnAt(prev,loc,c=>{\n const n=[...c];\n n.splice(fromIdx+1,0,copy);\n return n;\n }));\n setSelectedRowId(null);\n setSelContentId(copy.id);\n if(fromNested){\n setSelMeta({rowId,cellIdx,contentIdx:fromNested.parentBlockIdx,inner:{cellIdx:fromNested.innerCellIdx,contentIdx:fromIdx+1}});\n }else{\n setSelMeta({rowId,cellIdx,contentIdx:fromIdx+1});\n }\n }\n };\n\n const rootContentPreset = LAYOUT_PRESETS.find((p) => p.cols === 1) ?? LAYOUT_PRESETS[0];\n\n /** Append a single-block row (exports as a flat root entry in `blocks[]`). */\n const insertRootContentBlock = (contentType: string) => {\n const { row: newRow, block: nb } = makeRootContentRow(contentType, rootContentPreset);\n const anchorRowId = selContentMeta?.rowId ?? selectedRowId ?? null;\n mutate((prev) => {\n if (anchorRowId) {\n const i = prev.findIndex((r) => r.id === anchorRowId);\n if (i >= 0) {\n const next = [...prev];\n next.splice(i + 1, 0, newRow);\n return next;\n }\n }\n return [...prev, newRow];\n });\n setSelectedRowId(null);\n setSelContentId(nb.id);\n setSelMeta({ rowId: newRow.id, cellIdx: 0, contentIdx: 0 });\n };\n\n /** Palette / canvas drop: content blocks → root `blocks[]`; layout blocks → new row or nested column. */\n const insertBlockFromLibrary = (contentType: string) => {\n const isLayoutType = contentType === \"layout\" || contentType === \"nestedRow\";\n if (selContentMeta?.inner) {\n const { rowId, cellIdx, contentIdx, inner } = selContentMeta;\n dropContent(rowId, cellIdx, {\n kind: \"new\",\n contentType,\n insertAt: null,\n nested: { parentBlockIdx: contentIdx, innerCellIdx: inner.cellIdx },\n });\n return;\n }\n if (isLayoutType) {\n if (\n selContentMeta?.rowId &&\n typeof selContentMeta.cellIdx === \"number\" &&\n selContentMeta.cellIdx >= 0 &&\n typeof selContentMeta.contentIdx === \"number\" &&\n selContentMeta.contentIdx >= 0\n ) {\n const r = rows.find((x) => x.id === selContentMeta.rowId);\n if (r && selContentMeta.cellIdx < r.cells.length) {\n dropContent(selContentMeta.rowId, selContentMeta.cellIdx, {\n kind: \"new\",\n contentType,\n insertAt: null,\n });\n return;\n }\n }\n addRow(rootContentPreset);\n return;\n }\n if (!rows.length) {\n insertRootContentBlock(contentType);\n return;\n }\n insertRootContentBlock(contentType);\n };\n\n /** @param inner null | { parentBlockIdx, cellIdx, contentIdx } — when set, ci is ignored; inner.contentIdx is index in inner column */\n const deleteContent=(rowId:any,cellIdx:any,ci:any,inner:any=null)=>{\n if(!inner){\n mutate(prev=>prev.map(r=>{if(r.id!==rowId)return r;const cells=r.cells.map((c,i)=>i===cellIdx?c.filter((_,j)=>j!==ci):c);return{...r,cells};}));\n }else{\n const loc={type:\"nested\",rowId,outerCellIdx:cellIdx,blockIdx:inner.parentBlockIdx,innerCellIdx:inner.cellIdx};\n mutate(prev=>updateColumnAt(prev,loc,c=>c.filter((_,j)=>j!==inner.contentIdx)));\n }\n setSelContentId(null);setSelMeta(null);\n };\n const moveContent=(rowId:any,cellIdx:any,ci:any,dir:any,inner:any=null)=>{\n if(inner){\n const loc={type:\"nested\",rowId,outerCellIdx:cellIdx,blockIdx:inner.parentBlockIdx,innerCellIdx:inner.cellIdx};\n mutate(prev=>updateColumnAt(prev,loc,c=>{\n const ibc=inner.contentIdx;\n const ni=ibc+dir;\n if(ni<0||ni>=c.length)return c;\n const n=[...c];\n [n[ibc],n[ni]]=[n[ni],n[ibc]];\n return n;\n }));\n return;\n }\n mutate(prev=>prev.map(r=>{if(r.id!==rowId)return r;const cells=r.cells.map((c,i)=>{if(i!==cellIdx)return c;const ni=ci+dir;if(ni<0||ni>=c.length)return c;const n=[...c];[n[ci],n[ni]]=[n[ni],n[ci]];return n;});return{...r,cells};}));\n };\n const updateContent=(rowId:any,cellIdx:any,ci:any,upd:any,inner:any=null)=>{\n if(!inner){\n mutate(prev=>prev.map(r=>{if(r.id!==rowId)return r;const cells=r.cells.map((c,i)=>i===cellIdx?c.map((b,j)=>j===ci?upd:b):c);return{...r,cells};}));\n return;\n }\n const loc={type:\"nested\",rowId,outerCellIdx:cellIdx,blockIdx:ci,innerCellIdx:inner.cellIdx};\n mutate(prev=>updateColumnAt(prev,loc,c=>c.map((b,j)=>j===inner.contentIdx?upd:b)));\n };\n const selectContent=(contentId:any,rowId:any,cellIdx:any,parentBlockIdx:any,inner:any=null)=>{\n setSelContentId(contentId);\n setSelMeta(inner?{rowId,cellIdx,contentIdx:parentBlockIdx,inner}:{rowId,cellIdx,contentIdx:parentBlockIdx});\n /** Empty-column affordance uses `contentIdx: -1` and `contentId: null`; column handler also sets row — do not clear row. */\n const emptyColumnAffordance =\n inner == null && contentId == null && parentBlockIdx === -1;\n if (!emptyColumnAffordance) setSelectedRowId(null);\n };\n\n const deleteSelected=()=>{if(selContentMeta){const{rowId,cellIdx,contentIdx,inner}=selContentMeta;if(inner)deleteContent(rowId,cellIdx,0,{parentBlockIdx:contentIdx,cellIdx:inner.cellIdx,contentIdx:inner.contentIdx});else deleteContent(rowId,cellIdx,contentIdx);}};\n const duplicateSelected=()=>{if(selContentMeta){const{rowId,cellIdx,contentIdx,inner}=selContentMeta;if(inner)dropContent(rowId,cellIdx,{kind:\"duplicate\",fromIdx:inner.contentIdx,fromNested:{parentBlockIdx:contentIdx,innerCellIdx:inner.cellIdx}});else dropContent(rowId,cellIdx,{kind:\"duplicate\",fromIdx:contentIdx});}};\n\n // ── Context menu ────────────────────────────────────────────────────────────\n /** inner: { parentBlockIdx, cellIdx, contentIdx } for block inside nested row */\n const handleContextMenu=(e:any,rowId:any,cellIdx:any,ci:any,inner:any=null)=>{\n setCtxMenu({x:e.clientX,y:e.clientY,items:[\n {icon:\"↑\",label:\"Move Up\", action:()=>moveContent(rowId,cellIdx,ci,-1,inner)},\n {icon:\"↓\",label:\"Move Down\",action:()=>moveContent(rowId,cellIdx,ci, 1,inner)},\n {sep:true},\n {icon:\"⧉\",label:\"Duplicate\",action:()=>dropContent(rowId,cellIdx,inner?{kind:\"duplicate\",fromIdx:inner.contentIdx,fromNested:{parentBlockIdx:inner.parentBlockIdx,innerCellIdx:inner.cellIdx}}:{kind:\"duplicate\",fromIdx:ci})},\n {sep:true},\n {icon:\"✕\",label:\"Delete\",action:()=>inner?deleteContent(rowId,cellIdx,0,inner):deleteContent(rowId,cellIdx,ci),danger:true},\n ]});\n };\n\n const handleLayoutContextMenu=(e,rowId)=>{\n e.preventDefault();\n e.stopPropagation();\n const ri=rows.findIndex(r=>r.id===rowId);\n setSelectedRowId(rowId);\n setSelContentId(null);\n setSelMeta(null);\n setCtxMenu({x:e.clientX,y:e.clientY,items:[\n {icon:\"↑\",label:\"Move row up\",disabled:ri<=0,action:()=>{if(ri>0)moveRow(rowId,-1);}},\n {icon:\"↓\",label:\"Move row down\",disabled:ri<0||ri>=rows.length-1,action:()=>{if(ri>=0&&ri<rows.length-1)moveRow(rowId,1);}},\n {sep:true},\n {icon:\"⧉\",label:\"Duplicate row\",action:()=>dupRow(rowId)},\n {sep:true},\n {icon:\"✕\",label:\"Delete row\",action:()=>deleteRow(rowId),danger:true},\n ]});\n };\n\n const selectedRow=rows.find(r=>r.id===selectedRowId);\n const selectedCB=resolveSelectedBlock(selContentMeta);\n const totalBlocks=countBlocksInDesign(rows);\n\n const filteredBlockTypes = CONTENT_BLOCK_TYPES.filter((bt) => {\n if (opt.tools?.[bt.type]?.enabled === false) return false;\n return true;\n });\n\n const onRightRailResizePointerDown = useCallback((e: ReactPointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n if (e.pointerType === \"mouse\" && e.button !== 0) return;\n const startX = e.clientX;\n const startW = rightRailWidth;\n const onMove = (ev: PointerEvent) => {\n const delta = startX - ev.clientX;\n setRightRailWidth(() =>\n Math.min(RIGHT_RAIL_MAX_W, Math.max(RIGHT_RAIL_MIN_W, startW + delta)),\n );\n };\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n window.removeEventListener(\"pointercancel\", onUp);\n document.body.style.removeProperty(\"cursor\");\n document.body.style.removeProperty(\"user-select\");\n };\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n window.addEventListener(\"pointercancel\", onUp);\n }, [rightRailWidth]);\n\n const paletteGroupLabelOverrides = opt.blockLibrary?.paletteGroupLabels;\n const blockPaletteSections = BLOCK_PALETTE_GROUPS.map(({ key, labelKey }) => {\n const blocks = filteredBlockTypes\n .filter((bt) => bt.paletteGroup === key)\n .slice()\n .sort((a, b) => a.paletteOrder - b.paletteOrder);\n if (blocks.length === 0) return null;\n return {\n groupKey: key,\n title: paletteGroupLabelOverrides?.[key] ?? L(labelKey),\n blocks,\n };\n }).filter(Boolean) as { groupKey: BlockPaletteGroupKey; title: string; blocks: typeof filteredBlockTypes }[];\n\n const IS: CSSProperties = {\n width: \"100%\",\n padding: \"6px 8px\",\n border: `1px solid ${C.border}`,\n borderRadius: 5,\n background: C.inputBg,\n color: C.text,\n fontSize: 13,\n boxSizing: \"border-box\",\n outline: \"none\",\n };\n const CI: CSSProperties = {\n padding: \"2px 4px\",\n height: 28,\n cursor: \"pointer\",\n border: `1px solid ${C.border}`,\n borderRadius: 5,\n background: C.inputBg,\n };\n\n const LEFT_TEMPLATE_W = 292;\n const eid = (suffix?: string) => (suffix ? `${editorId}-${suffix}` : editorId);\n\n const sectionHeadingStyle: CSSProperties = {\n fontSize: 10,\n color: C.muted,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \".08em\",\n marginBottom: 8,\n };\n\n /** Right-rail cards: same look for Settings sections (and scroll padding). */\n const RAIL_BODY_PAD: CSSProperties = { padding: \"12px 12px 20px\" };\n const railSectionCard: CSSProperties = {\n marginBottom: 8,\n border: `1px solid ${C.border}`,\n borderRadius: 10,\n background: C.surface,\n overflow: \"hidden\",\n };\n const railSectionSummary: CSSProperties = {\n cursor: \"pointer\",\n listStyle: \"none\",\n fontSize: 10,\n fontWeight: 800,\n color: C.text,\n textTransform: \"uppercase\",\n letterSpacing: \".08em\",\n padding: \"9px 11px\",\n background: C.toolbarBg,\n borderBottom: `1px solid ${C.border}`,\n userSelect: \"none\",\n };\n const railSectionBody: CSSProperties = {\n padding: \"10px 11px 12px\",\n };\n\n return (\n <div id={eid()}\n style={{display:\"flex\",flexDirection:\"column\",height:minHeight,maxHeight:minHeight,background:C.bg,color:C.text,fontFamily:\"'Inter',system-ui,sans-serif\",overflow:\"hidden\",...style}}>\n <style>{`\n *{box-sizing:border-box;}\n input[type=range]{accent-color:${C.accent};}\n input[type=checkbox]{accent-color:${C.accent};}\n details.rail-section > summary::-webkit-details-marker{display:none;}\n details.rail-section > summary{list-style:none;}\n ::-webkit-scrollbar{width:5px;height:5px;}\n ::-webkit-scrollbar-track{background:transparent;}\n ::-webkit-scrollbar-thumb{background:${C.border};border-radius:3px;}\n ::-webkit-scrollbar-thumb:hover{background:${C.muted};}\n @keyframes email-editor-json-spin{to{transform:rotate(360deg);}}\n `}</style>\n\n <div id={eid(\"workspace\")} style={{\n display:\"flex\",flex:1,overflow:\"hidden\",minHeight:0,position:\"relative\",\n alignItems:\"stretch\",gap:0,\n padding:12,\n maxHeight: \"calc(100% - 24px)\",\n width: \"100%\",\n }}>\n\n {/* ── LEFT: templates drawer ─────────────────────────────────────────── */}\n {!hideTemplates && templatesOpen && (\n <aside\n id={eid(\"templates-panel\")}\n style={{\n flexShrink: 0,\n width: LEFT_TEMPLATE_W,\n alignSelf: \"stretch\",\n background: C.sidebar,\n borderRight: `1px solid ${C.border}`,\n borderRadius: 12,\n display: \"flex\",\n flexDirection: \"column\",\n zIndex: 60, \n maxHeight: \"calc(100% - 24px)\",\n overflow: \"auto\",\n boxShadow: \"4px 0 24px rgba(0,0,0,0.06)\",\n }}>\n <div\n id={eid(\"templates-panel-header\")}\n style={{\n padding: \"10px 12px\",\n borderBottom: `1px solid ${C.border}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n flexShrink: 0,\n background: C.sidebar,\n }}>\n <span style={{ fontSize: 11, fontWeight: 700, color: C.text }}>{L(\"templates\")}</span>\n <button\n type=\"button\"\n id={eid(\"templates-panel-close\")}\n title={L(\"closePanel\")}\n onClick={() => setTemplatesOpen(false)}\n style={{\n background: C.surface,\n border: `1px solid ${C.border}`,\n borderRadius: 6,\n color: C.text,\n cursor: \"pointer\",\n fontSize: 16,\n lineHeight: 1,\n padding: \"2px 8px\",\n }}>\n ×\n </button>\n </div>\n <div id={eid(\"templates-panel-body\")} style={{ flex: 1, overflowY: \"auto\", padding: 10 }}>\n {templates.map((tpl, idx) => (\n <div\n key={idx}\n id={eid(`template-${idx}`)}\n onClick={() => {\n if (rows.length > 0) {\n setConfirm({\n msg: \"Loading a template will replace your current design. Continue?\",\n onConfirm: () => {\n buildApi().loadJson(tpl.design as Record<string, unknown>);\n setTemplatesOpen(false);\n },\n });\n } else {\n buildApi().loadJson(tpl.design as Record<string, unknown>);\n setTemplatesOpen(false);\n }\n }}\n style={{\n background: C.surface,\n border: `1px solid ${C.border}`,\n borderRadius: 10,\n padding: 10,\n cursor: \"pointer\",\n transition: \"all .2s\",\n marginBottom: 10,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = C.accent;\n e.currentTarget.style.transform = \"translateY(-1px)\";\n e.currentTarget.style.boxShadow = \"0 6px 16px rgba(0,0,0,0.08)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = C.border;\n e.currentTarget.style.transform = \"none\";\n e.currentTarget.style.boxShadow = \"none\";\n }}>\n {tpl.thumbnail ? (\n <img\n src={tpl.thumbnail}\n alt={tpl.name}\n style={{\n width: \"100%\",\n height: 100,\n objectFit: \"cover\",\n borderRadius: 6,\n background: C.canvas,\n marginBottom: 8,\n border: `1px solid ${C.border}`,\n }}\n />\n ) : (\n <div\n style={{\n width: \"100%\",\n height: 64,\n background: C.canvas,\n borderRadius: 6,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 28,\n marginBottom: 8,\n border: `1px solid ${C.border}`,\n }}>\n 📄\n </div>\n )}\n <div style={{ fontSize: 11, fontWeight: 700, color: C.text }}>{tpl.name}</div>\n </div>\n ))}\n {templates.length === 0 && (\n <div style={{ color: C.muted, fontSize: 11, padding: 20, textAlign: \"center\" }}>No templates available.</div>\n )}\n </div>\n </aside>\n )}\n\n {/* ── CENTER: content toolbar + canvas ───────────────────────────────── */}\n <div\n id={eid(\"content-column\")}\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n minWidth: 0,\n padding: 12,\n paddingBottom: 0,\n paddingTop: 0,\n gap: 10,\n maxHeight: \"calc(100% - 24px)\",\n overflow: \"auto\",\n }}>\n <div\n id={eid(\"content-toolbar\")}\n style={{\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n gap: 0,\n padding: \"7px 12px\",\n background: C.toolbarBg,\n border: `1px solid ${C.border}`,\n borderRadius: 12,\n boxShadow: \"0 1px 3px rgba(0,0,0,0.06)\",\n }}>\n {/* Left: templates + canvas zoom */}\n <div\n id={eid(\"toolbar-left\")}\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-start\",\n gap: 8,\n minWidth: 0,\n }}\n >\n {!hideTemplates && (\n <TBtn\n onClick={() => setTemplatesOpen((o) => !o)}\n title={L(\"templates\")}\n accent={C.accent}\n muted={C.muted}\n border={C.border}\n text={C.text}\n style={{\n padding: \"5px 12px\",\n fontWeight: 700,\n ...(templatesOpen\n ? { outline: `2px solid ${C.accent}`, outlineOffset: 2, borderRadius: 8 }\n : {}),\n }}\n >\n {L(\"templates\")}\n </TBtn>\n )}\n <div id={eid(\"toolbar-zoom\")} style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <TBtn\n onClick={() => setZoom((z) => Math.max(50, z - 10))}\n title={L(\"zoomOut\")}\n accent={C.accent}\n muted={C.muted}\n border={C.border}\n text={C.text}\n style={{ padding: \"4px 8px\" }}\n >\n −\n </TBtn>\n <span\n style={{\n fontSize: 11,\n color: C.muted,\n minWidth: 34,\n textAlign: \"center\",\n userSelect: \"none\",\n }}\n >\n {zoom}%\n </span>\n <TBtn\n onClick={() => setZoom((z) => Math.min(150, z + 10))}\n title={L(\"zoomIn\")}\n accent={C.accent}\n muted={C.muted}\n border={C.border}\n text={C.text}\n style={{ padding: \"4px 8px\" }}\n >\n +\n </TBtn>\n </div>\n </div>\n\n {/* Center: preview (true visual center) */}\n <div\n id={eid(\"toolbar-center\")}\n style={{\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <TBtn\n onClick={() => {\n setPreviewDevice(\"desktop\");\n setShowPreview(true);\n }}\n title=\"Preview\"\n accent={C.accent}\n muted={C.muted}\n border={C.border}\n text={C.text}\n style={{ padding: \"5px 14px\", fontWeight: 700, display: \"flex\", alignItems: \"center\", gap: 6 }}\n >\n <svg width=\"14\" height=\"10\" viewBox=\"0 0 14 10\" fill=\"none\" style={{ flexShrink: 0 }}>\n <rect x=\".5\" y=\".5\" width=\"13\" height=\"9\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M4 10h6M7 9v1\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n </TBtn>\n </div>\n\n {/* Right: autosave + history */}\n <div\n id={eid(\"toolbar-right\")}\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n gap: 8,\n minWidth: 0,\n }}\n >\n {autoSaveMsg ? (\n <>\n <span style={{ fontSize: 10, color: C.success, fontWeight: 700, whiteSpace: \"nowrap\" }}>\n ✓ {autoSaveMsg}\n </span>\n <span style={{ width: 1, height: 22, background: C.border, flexShrink: 0 }} />\n </>\n ) : null}\n <div id={eid(\"toolbar-history\")} style={{ display: \"flex\", alignItems: \"center\", gap: 4, flexShrink: 0 }}>\n <TBtn\n onClick={undo}\n title={`${L(\"undo\")} (Ctrl+Z)`}\n disabled={!history.length}\n accent={C.accent}\n muted={C.muted}\n border={C.border}\n text={C.text}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 7v6h6\" />\n <path d=\"M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13\" />\n </svg>\n </TBtn>\n <TBtn\n onClick={redo}\n title={`${L(\"redo\")} (Ctrl+Y)`}\n disabled={!future.length}\n accent={C.accent}\n muted={C.muted}\n border={C.border}\n text={C.text}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 7v6h-6\" />\n <path d=\"M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3l3 2.7\" />\n </svg>\n </TBtn>\n </div>\n </div>\n </div>\n\n <div\n id={eid(\"canvas\")}\n style={{\n flex: 1,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n background: C.canvas,\n padding: 12,\n minHeight: 0,\n borderRadius: 12,\n border: `1px solid ${C.border}`,\n }}\n onClick={() => {\n setSelectedRowId(null);\n setSelContentId(null);\n setSelMeta(null);\n setCtxMenu(null);\n }}\n onDragOver={(e) => {\n e.preventDefault();\n }}\n onDrop={(e) => {\n e.preventDefault();\n try {\n const data = JSON.parse(e.dataTransfer.getData(\"application/json\") || \"{}\");\n if (data.moveRowId) return;\n if (data.layoutPresetKey) {\n const preset = LAYOUT_PRESETS.find((p) => p.key === data.layoutPresetKey);\n if (preset) mutate((prev) => [...prev, makeLayoutRow(preset)]);\n } else if (data.contentType && typeof data.contentType === \"string\") {\n insertBlockFromLibrary(data.contentType);\n }\n } catch {\n /* ignore */\n }\n }}>\n <div\n id={eid(\"canvas-scale\")}\n style={{\n transform: `scale(${zoom / 100})`,\n transformOrigin: \"top center\",\n transition: \"transform .2s\",\n paddingBottom: zoom < 100 ? `${(1 - zoom / 100) * 200}px` : 0,\n }}>\n <div\n id={eid(\"canvas-document\")}\n style={(() => {\n const img =\n typeof (settings as { contentBgImage?: string }).contentBgImage === \"string\"\n ? (settings as { contentBgImage?: string }).contentBgImage!.trim()\n : \"\";\n const base: CSSProperties = {\n maxWidth: settings.contentWidth,\n margin: \"0 auto\",\n borderRadius: settings.borderRadius,\n padding: settings.padding,\n minHeight: 420,\n border: `1px solid ${C.border}`,\n };\n if (img) {\n const st = settings as {\n contentBgSize?: string;\n contentBgRepeat?: string;\n };\n base.backgroundColor = settings.contentBg;\n base.backgroundImage = `url(${JSON.stringify(img)})`;\n base.backgroundSize = (st.contentBgSize || \"cover\").trim() || \"cover\";\n base.backgroundPosition = \"center\";\n base.backgroundRepeat = (st.contentBgRepeat || \"no-repeat\").trim() || \"no-repeat\";\n } else {\n base.background = settings.contentBg;\n }\n return base;\n })()}\n onDragOver={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onDrop={(e) => {\n e.preventDefault();\n e.stopPropagation();\n try {\n const data = JSON.parse(e.dataTransfer.getData(\"application/json\") || \"{}\");\n if (data.moveRowId) return;\n if (data.contentType && typeof data.contentType === \"string\") {\n insertBlockFromLibrary(data.contentType);\n }\n } catch {\n /* ignore */\n }\n }}>\n {rows.length === 0 && (\n <div id={eid(\"canvas-empty\")} style={{ padding: \"56px 20px\", textAlign: \"center\", color: C.muted, border: `2px dashed ${C.border}`, borderRadius: 7 }}>\n <div style={{ fontSize: 30, marginBottom: 10 }}>✉</div>\n <div style={{ fontWeight: 700, marginBottom: 6, color: C.text }}>{L(\"addRow\")}</div>\n <div style={{ fontSize: 12 }}>{L(\"canvasEmptyHint\")}</div>\n </div>\n )}\n\n {rows.map((row, ri) => (\n <Fragment key={row.id}>\n <CanvasRow\n editorId={editorId}\n row={row}\n ri={ri}\n selectedRowId={selectedRowId}\n selContentMeta={selContentMeta}\n dragOver={dragOver}\n draggingRowId={draggingRowId}\n C={C}\n setDragOver={setDragOver}\n handleRowDrop={handleRowDrop}\n setRowDrag={setRowDrag}\n setSelectedRowId={setSelectedRowId}\n setSelContentId={setSelContentId}\n setSelMeta={setSelMeta}\n selectContent={selectContent}\n dropContent={dropContent}\n deleteContent={deleteContent}\n handleContextMenu={handleContextMenu}\n handleLayoutContextMenu={handleLayoutContextMenu}\n selContentId={selContentId}\n />\n </Fragment>\n ))}\n\n {/* Bottom drop zone */}\n <div\n id={eid(\"canvas-row-drop-end\")}\n onDragOver={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(rows.length);\n }}\n onDragLeave={() => setDragOver(null)}\n onDrop={(e) => handleRowDrop(rows.length, e)}\n style={{\n height: dragOver === rows.length ? 28 : 10,\n background: dragOver === rows.length ? `${C.accent}25` : \"transparent\",\n border:\n dragOver === rows.length\n ? `2px dashed ${C.accent}`\n : \"2px solid transparent\",\n borderRadius: 4,\n transition: \"all .12s\",\n margin: \"2px 0\",\n boxSizing: \"border-box\",\n }}\n />\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Right rail resize + sidebar ── */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n flexShrink: 0,\n alignItems: \"stretch\",\n alignSelf: \"stretch\",\n maxHeight: \"calc(100% - 24px)\",\n minHeight: 0,\n }}\n >\n <div\n id={eid(\"sidebar-resize-handle\")}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={L(\"resizeSidebar\")}\n title={L(\"resizeSidebar\")}\n onPointerDown={onRightRailResizePointerDown}\n style={{\n width: 6,\n flexShrink: 0,\n cursor: \"col-resize\",\n touchAction: \"none\",\n alignSelf: \"stretch\",\n borderRadius: \"6px 0 0 6px\",\n background: `${C.border}33`,\n borderLeft: `1px solid ${C.border}`,\n borderTop: `1px solid ${C.border}`,\n borderBottom: `1px solid ${C.border}`,\n marginRight: -1,\n zIndex: 56,\n }}\n onPointerEnter={(ev) => {\n ev.currentTarget.style.background = `${C.accent}40`;\n }}\n onPointerLeave={(ev) => {\n ev.currentTarget.style.background = `${C.border}33`;\n }}\n />\n\n {/* ── UNIFIED SIDEBAR (Right Rail) ── */}\n <div id={eid(\"sidebar\")} style={{\n position:\"relative\",flexShrink:0,width:rightRailWidth,alignSelf:\"stretch\",\n minHeight:0,minWidth:RIGHT_RAIL_MIN_W,\n background:C.sidebar,border:`1px solid ${C.border}`,\n borderRadius: 12,maxHeight: \"calc(100% - 24px)\",overflow: \"auto\",\n display:\"flex\",flexDirection:\"column\",zIndex:55,\n }}>\n {selectedCB || selectedRow ? (\n /* Properties / Inspector View */\n <div id={eid(\"sidebar-properties\")} style={{display:\"flex\",flexDirection:\"column\",flex:1,minHeight:0,overflow:\"hidden\"}}>\n {/* Inspector Header */}\n <div id={eid(\"sidebar-inspector-header\")} style={{padding:\"9px 11px\",borderBottom:`1px solid ${C.border}`,flexShrink:0,background:C.toolbarBg,zIndex:5,display:\"flex\",alignItems:\"center\",gap:8}}>\n <button\n type=\"button\"\n onClick={()=>{setSelContentId(null);setSelMeta(null);setSelectedRowId(null);}}\n style={{background:C.surface,border:`1px solid ${C.border}`,borderRadius:8,color:C.text,cursor:\"pointer\",fontSize:10,padding:\"6px 10px\",fontWeight:700,display:\"flex\",alignItems:\"center\",gap:4,textTransform:\"uppercase\",letterSpacing:\".05em\"}}>\n <span>← Library</span>\n </button>\n <div style={{flex:1,textAlign:\"right\",fontSize:10,fontWeight:800,color:C.text,textTransform:\"uppercase\",letterSpacing:\".08em\",lineHeight:1.3}}>\n {selectedCB\n ? (selectedCB.type === \"layout\" && isSplitLayoutBlock(selectedCB)\n ? \"Layout · Customize\"\n : \"Block inspector\")\n : \"Row inspector\"}\n </div>\n </div>\n\n <div id={eid(\"sidebar-properties-content\")} style={{flex:1,minHeight:0,overflowY:\"auto\",overflowX:\"hidden\",...RAIL_BODY_PAD}}>\n {selectedCB && selContentMeta ? (\n <ContentBlockEditor\n block={selectedCB}\n onChange={upd=>updateContent(selContentMeta.rowId,selContentMeta.cellIdx,selContentMeta.contentIdx,upd,selContentMeta.inner||null)}\n onClose={()=>{setSelContentId(null);setSelMeta(null);setSelectedRowId(null);}}\n onUpload={onUpload}\n C={C}/>\n ) : (\n <LayoutRowEditor \n row={selectedRow} \n onChange={updateRow} \n onClose={()=>setSelectedRowId(null)} \n onUpload={onUpload} \n initialCol={selContentMeta?.rowId === selectedRowId ? selContentMeta.cellIdx : null}\n rowIndex={rows.findIndex((r) => r.id === selectedRowId)}\n rowCount={rows.length}\n onMoveUp={() => selectedRow && moveRow(selectedRow.id, -1)}\n onMoveDown={() => selectedRow && moveRow(selectedRow.id, 1)}\n C={C}\n />\n )}\n </div>\n </div>\n ) : (\n /* Main Tabs View (Library) */\n <>\n <div id={eid(\"sidebar-tabs\")} style={{display:\"flex\",gap:6,padding:\"8px 10px 0\",borderBottom:`1px solid ${C.border}`,flexShrink:0,position:\"sticky\",top:0,background:C.sidebar,zIndex:10}}>\n {([\"blocks\",\"settings\"] as const).map((tab) => (\n <button key={tab} id={eid(`tab-${tab}`)} type=\"button\" onClick={() => setActiveTab(tab)}\n style={{\n flex:1,\n padding:\"9px 8px 10px\",\n background:activeTab===tab?C.surface:\"transparent\",\n border:`1px solid ${activeTab===tab?C.border:\"transparent\"}`,\n borderBottom:activeTab===tab?`1px solid ${C.surface}`:`1px solid transparent`,\n marginBottom:-1,\n borderRadius:\"10px 10px 0 0\",\n color:activeTab===tab?C.accent:C.muted,\n cursor:\"pointer\",\n fontSize:10,\n fontWeight:800,\n textTransform:\"uppercase\",\n letterSpacing:\".06em\",\n }}>\n {L(tab)}\n </button>\n ))}\n </div>\n\n <div id={eid(\"sidebar-body\")} style={{flex:1,minHeight:0,overflowY:\"auto\",overflowX:\"hidden\",...RAIL_BODY_PAD}}>\n {activeTab===\"blocks\"&&<>\n {opt.blockLibrary?.groupHeadings?.blocks ? (\n <div id={eid(\"blocks-section-heading\")} style={{...sectionHeadingStyle,marginTop:0}}>\n {opt.blockLibrary.groupHeadings.blocks}\n </div>\n ) : null}\n {blockPaletteSections.map(({ groupKey, title, blocks }, gi) => (\n <div key={groupKey} id={eid(`blocks-group-${groupKey}`)}>\n <div\n id={eid(`blocks-group-heading-${groupKey}`)}\n style={{\n ...sectionHeadingStyle,\n marginTop: gi === 0 ? (opt.blockLibrary?.groupHeadings?.blocks ? 10 : 0) : 14,\n marginBottom: 8,\n }}>\n {title}\n </div>\n <div id={eid(`blocks-list-${groupKey}`)} style={{ display: \"flex\", flexDirection: \"column\", gap: 6, marginBottom: 4 }}>\n {blocks.map((bt) => (\n <div\n key={bt.type}\n id={eid(`block-palette-${bt.type}`)}\n draggable\n onDragStart={(e) => {\n e.dataTransfer.setData(\"application/json\", JSON.stringify({ contentType: bt.type }));\n }}\n onClick={() => insertBlockFromLibrary(bt.type)}\n title={\n selContentMeta?.inner\n ? \"Click to add inside the selected nested column\"\n : selContentMeta?.rowId\n ? \"Click to add in the selected column\"\n : selectedRowId\n ? \"Click to add to column 1 of the selected row\"\n : \"Click to add to the first row, first column\"\n }\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 10,\n background: C.surface,\n border: `1px solid ${C.border}`,\n borderLeft: `3px solid ${C.text}`,\n borderRadius: 8,\n padding: \"8px 10px\",\n cursor: \"grab\",\n userSelect: \"none\",\n transition: \"background .15s, border-color .15s\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = C.canvas;\n e.currentTarget.style.borderColor = C.muted;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = C.surface;\n e.currentTarget.style.borderColor = C.border;\n }}>\n <div style={{ fontSize: 16, width: 28, textAlign: \"center\", flexShrink: 0, color: C.text }}>{bt.icon}</div>\n <div style={{ flex: 1, fontSize: 12, color: C.text, fontWeight: 600 }}>{bt.label}</div>\n </div>\n ))}\n </div>\n </div>\n ))}\n {filteredBlockTypes.length === 0 && (\n <div style={{ color: C.muted, fontSize: 12, padding: 12, textAlign: \"center\" }}>No blocks available</div>\n )}\n </>}\n\n {/* Settings */}\n {activeTab===\"settings\"&&<>\n <div\n id={eid(\"settings-heading\")}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n marginBottom: 10,\n padding: \"9px 11px\",\n background: C.toolbarBg,\n border: `1px solid ${C.border}`,\n borderRadius: 10,\n }}\n >\n <span style={{ fontSize: 10, fontWeight: 800, color: C.text, textTransform: \"uppercase\", letterSpacing: \".08em\" }}>{L(\"emailContentSettings\")}</span>\n <button\n type=\"button\"\n onClick={() => {\n setPageBgUiStep(null);\n setContentBgUiStep(null);\n setSettings({\n bgColor: \"#f1f5f9\",\n bgImage: \"\",\n bgSize: \"cover\",\n bgRepeat: \"no-repeat\",\n bgPosition: \"center\",\n bgGradient: null,\n contentBg: \"#ffffff\",\n contentBgImage: \"\",\n contentBgSize: \"cover\",\n contentBgRepeat: \"no-repeat\",\n contentBgPosition: \"center\",\n contentBgGradient: null,\n contentWidth: 600,\n padding: 24,\n borderRadius: 8,\n fontFamily: \"Arial, sans-serif\",\n } as any);\n }}\n style={{\n background: C.surface,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n padding: \"5px 10px\",\n cursor: \"pointer\",\n fontSize: 10,\n fontWeight: 700,\n color: C.muted,\n textTransform: \"uppercase\",\n letterSpacing: \".05em\",\n }}\n >\n Reset\n </button>\n </div>\n\n <details open className=\"rail-section\" style={railSectionCard}>\n <summary style={railSectionSummary}>Typography</summary>\n <div style={railSectionBody}>\n <PR label=\"Default Font Family\" C={C}>\n <select\n style={IS}\n value={(settings as any).fontFamily || \"Arial, sans-serif\"}\n onChange={(e) => setSettings((s) => ({ ...s, fontFamily: e.target.value }))}\n >\n {[\"Arial, sans-serif\", \"Georgia, serif\", \"Verdana, sans-serif\", \"'Inter', sans-serif\", \"'Courier New', monospace\"].map((f) => (\n <option key={f} value={f}>\n {f.replace(/'/g, \"\").split(\",\")[0]}\n </option>\n ))}\n </select>\n </PR>\n </div>\n </details>\n\n <details open className=\"rail-section\" style={railSectionCard}>\n <summary style={railSectionSummary}>Layout</summary>\n <div style={railSectionBody}>\n <NumRangePx label={L(\"width\")} value={(settings as any).contentWidth ?? 600} onChange={(n)=>setSettings((s)=>({...s,contentWidth:n}))} min={320} max={1200} step={10} C={C}/>\n <NumRangePx label={L(\"padding\")} value={(settings as any).padding ?? 24} onChange={(n)=>setSettings((s)=>({...s,padding:n}))} min={0} max={120} step={1} C={C}/>\n <NumRangePx label={L(\"radius\")} value={(settings as any).borderRadius ?? 8} onChange={(n)=>setSettings((s)=>({...s,borderRadius:n}))} min={0} max={80} step={1} C={C}/>\n </div>\n </details>\n\n <details open className=\"rail-section\" style={railSectionCard}>\n <summary style={railSectionSummary}>Background</summary>\n <div style={railSectionBody}>\n <div style={{fontSize:10,color:C.muted,fontWeight:800,textTransform:\"uppercase\",letterSpacing:\".06em\",marginBottom:6}}>Page background</div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, marginBottom: 8 }}>\n <label style={{ display: \"flex\", alignItems: \"center\", gap: 8, cursor: \"pointer\", userSelect: \"none\" }}>\n <input\n type=\"checkbox\"\n checked={pageBgIsOff}\n onChange={(e) => {\n const off = e.target.checked;\n if (off) {\n const cur = String((settings as any).bgColor ?? \"\").trim();\n if (cur) pageBgLastSolidRef.current = cur;\n setPageBgUiStep(null);\n setSettings((s) => ({ ...s, bgColor: \"\", bgImage: \"\", bgGradient: null }));\n } else {\n setPageBgUiStep(\"solid\");\n setSettings((s) => ({\n ...s,\n bgColor: pageBgLastSolidRef.current || \"#f1f5f9\",\n }));\n }\n }}\n style={{ width: 15, height: 15, accentColor: C.accent, cursor: \"pointer\" }}\n />\n <span style={{ color: C.muted, fontSize: 12 }}>No page background</span>\n </label>\n </div>\n <BgModeButtons\n value={pageBgIsOff ? null : pageBgUiStep}\n onChange={applyPageBgMode}\n C={C}\n />\n {pageBgUiStep === null ? (\n <div style={{ fontSize: 11, color: C.muted, marginBottom: 12, lineHeight: 1.45 }}>\n Choose Color, Gradient, or Image — then the matching settings appear below.\n </div>\n ) : null}\n\n {pageBgUiStep === \"solid\" ? (\n <ColorField\n label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><ColorIcon size={13} strokeWidth={2.25} aria-hidden />bg color</span>}\n value={(settings as any).bgColor}\n onChange={(v)=>{\n pageBgLastSolidRef.current = v;\n setSettings((s)=>({...s,bgColor:v}));\n }}\n placeholder=\"#f1f5f9\"\n C={C}\n />\n ) : null}\n {pageBgUiStep === \"image\" ? (\n <>\n <ImageUrlUploadField\n label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><ImageIcon size={13} strokeWidth={2.25} aria-hidden />bg image</span>}\n value={String((settings as any).bgImage || \"\")}\n onChange={(v)=>setSettings((s)=>({...s,bgImage:v}))}\n onUpload={onUpload}\n accept=\"image/*\"\n buttonLabel=\"upload\"\n inputId={eid(\"settings-page-bg-image-file\")}\n C={C}\n />\n <div style={{ display: \"flex\", gap: 8, marginBottom: 12 }}>\n <div style={{ flex: 1 }}>\n <PR label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><Scaling size={13} strokeWidth={2.25} aria-hidden />{L(\"objectFit\")}</span>} C={C}>\n <select style={IS} value={(settings as any).bgSize || \"cover\"} onChange={(e) => setSettings((s) => ({ ...s, bgSize: e.target.value }))}>\n <option value=\"auto\">Auto</option>\n <option value=\"cover\">Cover</option>\n <option value=\"contain\">Contain</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><RepeatIcon size={13} strokeWidth={2.25} aria-hidden />repeat</span>} C={C}>\n <select style={IS} value={(settings as any).bgRepeat || \"no-repeat\"} onChange={(e) => setSettings((s) => ({ ...s, bgRepeat: e.target.value }))}>\n <option value=\"no-repeat\">No repeat</option>\n <option value=\"repeat\">Repeat</option>\n <option value=\"repeat-x\">Repeat X</option>\n <option value=\"repeat-y\">Repeat Y</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><Crosshair size={13} strokeWidth={2.25} aria-hidden />{L(\"objectPosition\")}</span>} C={C}>\n <select style={IS} value={(settings as any).bgPosition || \"center\"} onChange={(e) => setSettings((s) => ({ ...s, bgPosition: e.target.value }))}>\n {[\"center\",\"top\",\"bottom\",\"left\",\"right\",\"top left\",\"top right\",\"bottom left\",\"bottom right\"].map((p)=>(\n <option key={p} value={p}>{p}</option>\n ))}\n </select>\n </PR>\n </div>\n </div>\n </>\n ) : null}\n\n {pageBgUiStep === \"gradient\" ? (\n <DynamicGradientField\n label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><GradientIcon size={13} strokeWidth={2.25} aria-hidden />gradient</span>}\n value={(settings as any).bgGradient}\n onChange={(g)=>setSettings((s)=>({...s,bgGradient:g}))}\n defaults={{ colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"] }}\n C={C}\n />\n ) : null}\n\n <div style={{height:1,background:C.border,margin:\"12px 0\"}} />\n <div style={{fontSize:10,color:C.muted,fontWeight:800,textTransform:\"uppercase\",letterSpacing:\".06em\",marginBottom:6}}>Content background</div>\n <BgModeButtons value={contentBgUiStep} onChange={applyContentBgMode} C={C} />\n {contentBgUiStep === null ? (\n <div style={{ fontSize: 11, color: C.muted, marginBottom: 12, lineHeight: 1.45 }}>\n Choose Color, Gradient, or Image — then the matching settings appear below.\n </div>\n ) : null}\n\n {contentBgUiStep === \"solid\" ? (\n <ColorField\n label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><ColorIcon size={13} strokeWidth={2.25} aria-hidden />content bg</span>}\n value={(settings as any).contentBg}\n onChange={(v)=>setSettings((s)=>({...s,contentBg:v}))}\n placeholder=\"#ffffff\"\n C={C}\n />\n ) : null}\n\n {contentBgUiStep === \"image\" ? (\n <>\n <ImageUrlUploadField\n label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><ImageIcon size={13} strokeWidth={2.25} aria-hidden />content image</span>}\n value={String((settings as any).contentBgImage || \"\")}\n onChange={(v)=>setSettings((s)=>({...s,contentBgImage:v}))}\n onUpload={onUpload}\n accept=\"image/*\"\n buttonLabel=\"upload\"\n inputId={eid(\"settings-content-bg-image-file\")}\n C={C}\n />\n <div style={{ display: \"flex\", gap: 8, marginBottom: 4 }}>\n <div style={{ flex: 1 }}>\n <PR label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><Scaling size={13} strokeWidth={2.25} aria-hidden />{L(\"contentBgSize\")}</span>} C={C}>\n <select\n style={IS}\n value={(settings as { contentBgSize?: string }).contentBgSize || \"cover\"}\n onChange={(e) => setSettings((s) => ({ ...s, contentBgSize: e.target.value }))}\n >\n <option value=\"auto\">Auto</option>\n <option value=\"cover\">Cover</option>\n <option value=\"contain\">Contain</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label={L(\"contentBgRepeat\")} C={C}>\n <select\n style={IS}\n value={(settings as { contentBgRepeat?: string }).contentBgRepeat || \"no-repeat\"}\n onChange={(e) => setSettings((s) => ({ ...s, contentBgRepeat: e.target.value }))}\n >\n <option value=\"no-repeat\">No repeat</option>\n <option value=\"repeat\">Repeat</option>\n <option value=\"repeat-x\">Repeat X</option>\n <option value=\"repeat-y\">Repeat Y</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><Crosshair size={13} strokeWidth={2.25} aria-hidden />{L(\"objectPosition\")}</span>} C={C}>\n <select\n style={IS}\n value={(settings as any).contentBgPosition || \"center\"}\n onChange={(e) => setSettings((s) => ({ ...s, contentBgPosition: e.target.value }))}\n >\n {[\"center\",\"top\",\"bottom\",\"left\",\"right\",\"top left\",\"top right\",\"bottom left\",\"bottom right\"].map((p)=>(\n <option key={p} value={p}>{p}</option>\n ))}\n </select>\n </PR>\n </div>\n </div>\n </>\n ) : null}\n\n {contentBgUiStep === \"gradient\" ? (\n <DynamicGradientField\n label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><GradientIcon size={13} strokeWidth={2.25} aria-hidden />gradient</span>}\n value={(settings as any).contentBgGradient}\n onChange={(g)=>setSettings((s)=>({...s,contentBgGradient:g}))}\n defaults={{ colors: [\"#ffffff\", \"#ffffff\", \"#ffffff\"] }}\n C={C}\n />\n ) : null}\n </div>\n </details>\n </>}\n </div>\n </>\n )}\n </div>\n </div>\n {jsonLoading ? (\n <div\n id={eid(\"json-loading\")}\n role=\"status\"\n aria-live=\"polite\"\n aria-busy={true}\n style={{\n position: \"absolute\",\n inset: 0,\n zIndex: 180,\n background: `${C.bg}f2`,\n backdropFilter: \"blur(2px)\",\n WebkitBackdropFilter: \"blur(2px)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 14,\n pointerEvents: \"auto\",\n }}\n >\n <div\n aria-hidden\n style={{\n width: 40,\n height: 40,\n borderRadius: \"50%\",\n border: `3px solid ${C.border}`,\n borderTopColor: C.accent,\n animation: \"email-editor-json-spin 0.65s linear infinite\",\n }}\n />\n <span style={{ fontSize: 13, fontWeight: 600, color: C.text }}>{L(\"loadingDesign\")}</span>\n </div>\n ) : null}\n </div>\n\n {/* ── STATUS BAR ──────────────────────────────────────────────────────── */}\n <div id={eid(\"status-bar\")} style={{display:\"flex\",alignItems:\"center\",gap:12,padding:\"3px 14px\",background:C.toolbarBg,borderTop:`1px solid ${C.border}`,fontSize:10,color:C.muted,flexShrink:0,position:\"sticky\",bottom:0,zIndex:100}}>\n <span>{rows.length} row{rows.length!==1?\"s\":\"\"}</span>\n <span style={{color:C.border}}>·</span>\n <span>{totalBlocks} block{totalBlocks!==1?\"s\":\"\"}</span>\n <span style={{color:C.border}}>·</span>\n <span>{settings.contentWidth}px</span>\n <span style={{color:C.border}}>·</span>\n <span>{zoom}%</span>\n <span style={{color:C.border}}>·</span>\n <span>{locale.toUpperCase()}</span>\n {selectedCB&&<><span style={{color:C.border}}>·</span><span style={{color:C.accent2}}>{selectedCB.type}</span></>}\n </div>\n\n {/* ── MODALS & OVERLAYS ───────────────────────────────────────────────── */}\n {showPreviewModal&&<PreviewModal html={designToHtml(rows, settings, options)} contentWidth={settings.contentWidth} rowCount={rows.length} blockCount={countBlocksInDesign(rows)} editorZoom={zoom} locale={locale} initialDevice={previewDevice} onClose={()=>setShowPreview(false)} C={C}/>}\n {ctxMenu &&<ContextMenu x={ctxMenu.x} y={ctxMenu.y} items={ctxMenu.items} onClose={()=>setCtxMenu(null)} C={C}/>}\n {confirm &&<ConfirmDialog message={confirm.msg} onConfirm={()=>{confirm.onConfirm();setConfirm(null);}} onCancel={()=>setConfirm(null)} C={C}/>}\n </div>\n );\n});\n\nconst ReactEmailEditor = Object.assign(ReactEmailEditorComponent, { jsonToHtml, htmlToJson });\n\nexport { ReactEmailEditor };\n","import React from \"react\";\r\nimport { DEFAULT_BLOCK_PROPS } from \"./defaultBlockProps\";\r\n\r\n// ─── THEMES (monochrome — black / white / gray only) ─────────────────────────\r\nexport const THEMES = {\r\n /** White chrome, dark type */\r\n light: {\r\n bg: \"#f5f5f5\",\r\n sidebar: \"#ffffff\",\r\n canvas: \"#ebebeb\",\r\n surface: \"#fafafa\",\r\n border: \"#d4d4d4\",\r\n accent: \"#0a0a0a\",\r\n accent2: \"#262626\",\r\n text: \"#0a0a0a\",\r\n muted: \"#525252\",\r\n danger: \"#171717\",\r\n success: \"#404040\",\r\n warn: \"#525252\",\r\n inputBg: \"#ffffff\",\r\n toolbarBg: \"#ffffff\",\r\n },\r\n /** Dark chrome, light type */\r\n dark: {\r\n bg: \"#0a0a0a\",\r\n sidebar: \"#141414\",\r\n canvas: \"#0a0a0a\",\r\n surface: \"#1a1a1a\",\r\n border: \"#404040\",\r\n accent: \"#fafafa\",\r\n accent2: \"#e5e5e5\",\r\n text: \"#fafafa\",\r\n muted: \"#a3a3a3\",\r\n danger: \"#f5f5f5\",\r\n success: \"#d4d4d4\",\r\n warn: \"#a3a3a3\",\r\n inputBg: \"#171717\",\r\n toolbarBg: \"#141414\",\r\n },\r\n /** @deprecated aliases — same palette family */\r\n modern_light: {\r\n bg: \"#f5f5f5\",\r\n sidebar: \"#ffffff\",\r\n canvas: \"#ebebeb\",\r\n surface: \"#fafafa\",\r\n border: \"#d4d4d4\",\r\n accent: \"#0a0a0a\",\r\n accent2: \"#262626\",\r\n text: \"#0a0a0a\",\r\n muted: \"#525252\",\r\n danger: \"#171717\",\r\n success: \"#404040\",\r\n warn: \"#525252\",\r\n inputBg: \"#ffffff\",\r\n toolbarBg: \"#ffffff\",\r\n },\r\n modern_dark: {\r\n bg: \"#0a0a0a\",\r\n sidebar: \"#141414\",\r\n canvas: \"#0a0a0a\",\r\n surface: \"#1a1a1a\",\r\n border: \"#404040\",\r\n accent: \"#fafafa\",\r\n accent2: \"#e5e5e5\",\r\n text: \"#fafafa\",\r\n muted: \"#a3a3a3\",\r\n danger: \"#f5f5f5\",\r\n success: \"#d4d4d4\",\r\n warn: \"#a3a3a3\",\r\n inputBg: \"#171717\",\r\n toolbarBg: \"#141414\",\r\n },\r\n};\r\n\r\n// ─── I18N ─────────────────────────────────────────────────────────────────────\r\nexport const I18N = {\r\n en: { layouts:\"Layouts\",blocks:\"Blocks\",settings:\"Settings\",addRow:\"Click layout to add row\",\r\n dragIntoCell:\"Drag into a cell\",dropHere:\"Drop here\",releaseHere:\"Release to drop\",\r\n nothingSelected:\"Nothing selected\",clickBlock:\"Click a row or block to edit.\",\r\n preview:\"Preview\",exportHtml:\"HTML\",save:\"Save\",load:\"Load\",newDesign:\"New\",\r\n undo:\"Undo\",redo:\"Redo\",desktop:\"Desktop\",tablet:\"Tablet\",mobile:\"Mobile\",\r\n copied:\"Copied!\",copyHtml:\"Copy HTML\",emailSettings:\"Email Settings\",\r\n background:\"Background\",contentBg:\"Content Bg\",contentBgImage:\"Content bg image URL\",contentBgSize:\"Content bg image size\",contentBgRepeat:\"Content bg image repeat\",\r\n objectFit:\"Object fit\",objectPosition:\"Object position\",width:\"Width\",\r\n padding:\"Padding\",radius:\"Radius\",row:\"Row\",duplicate:\"Duplicate\",\r\n delete:\"Delete\",moveUp:\"Move Up\",moveDown:\"Move Down\",\r\n autoSaved:\"Auto-saved\",search:\"Search blocks…\",\r\n zoomIn:\"Zoom In\",zoomOut:\"Zoom Out\",zoom:\"Zoom\",templates:\"Templates\",\r\n resizeSidebar:\"Resize sidebar\",\r\n colorScheme:\"Color scheme\",\r\n blockGroupLayouts:\"Row layouts\",\r\n blockGroupBlocks:\"Content blocks\",\r\n blockPaletteGroupText:\"Text & content\",\r\n blockPaletteGroupStructure:\"Layout & structure\",\r\n blockPaletteGroupMedia:\"Media\",\r\n blockPaletteGroupActions:\"Buttons & links\",\r\n blockPaletteGroupWidgets:\"Widgets\",\r\n closePanel:\"Close\",\r\n canvasEmptyHint:\"Drag row layouts or blocks from the library. Drop blocks into a column or onto the mail preview area.\",\r\n emailContentSettings:\"Email content\",\r\n loadingDesign:\"Loading design…\" },\r\n fr: { layouts:\"Mises en page\",blocks:\"Blocs\",settings:\"Paramètres\",addRow:\"Cliquer pour ajouter\",\r\n dragIntoCell:\"Glisser dans une cellule\",dropHere:\"Déposer ici\",releaseHere:\"Relâcher ici\",\r\n nothingSelected:\"Rien de sélectionné\",clickBlock:\"Cliquez sur une ligne ou un bloc.\",\r\n preview:\"Aperçu\",exportHtml:\"HTML\",save:\"Enregistrer\",load:\"Charger\",newDesign:\"Nouveau\",\r\n undo:\"Annuler\",redo:\"Refaire\",desktop:\"Bureau\",tablet:\"Tablette\",mobile:\"Mobile\",\r\n copied:\"Copié!\",copyHtml:\"Copier HTML\",emailSettings:\"Paramètres email\",\r\n background:\"Arrière-plan\",contentBg:\"Fond contenu\",contentBgImage:\"Image de fond du contenu (URL)\",contentBgSize:\"Taille de l’image de fond\",contentBgRepeat:\"Répétition de l’image\",\r\n objectFit:\"Remplissage\",objectPosition:\"Position\",width:\"Largeur\",\r\n padding:\"Rembourrage\",radius:\"Rayon\",row:\"Ligne\",duplicate:\"Dupliquer\",\r\n delete:\"Supprimer\",moveUp:\"Monter\",moveDown:\"Descendre\",\r\n autoSaved:\"Auto-sauvegardé\",search:\"Rechercher…\",\r\n colorScheme:\"Schéma de couleurs\",\r\n blockGroupLayouts:\"Mises en page\",\r\n blockGroupBlocks:\"Blocs de contenu\",\r\n blockPaletteGroupText:\"Texte et contenu\",\r\n blockPaletteGroupStructure:\"Mise en page\",\r\n blockPaletteGroupMedia:\"Médias\",\r\n blockPaletteGroupActions:\"Boutons et liens\",\r\n blockPaletteGroupWidgets:\"Widgets\",\r\n closePanel:\"Fermer\",\r\n canvasEmptyHint:\"Glissez des blocs dans la colonne, ou ajoutez un bloc Mise en page pour plusieurs colonnes.\",\r\n loadingDesign:\"Chargement du design…\",\r\n emailContentSettings:\"Contenu de l’e-mail\",\r\n zoomIn:\"Zoom +\",zoomOut:\"Zoom -\",zoom:\"Zoom\",\r\n resizeSidebar:\"Redimensionner le panneau\",\r\n copy:\"Copier\",paste:\"Coller\" },\r\n de: { layouts:\"Layouts\",blocks:\"Blöcke\",settings:\"Einstellungen\",addRow:\"Layout hinzufügen\",\r\n dragIntoCell:\"In Zelle ziehen\",dropHere:\"Hier ablegen\",releaseHere:\"Loslassen\",\r\n nothingSelected:\"Nichts ausgewählt\",clickBlock:\"Zeile oder Block anklicken.\",\r\n preview:\"Vorschau\",exportHtml:\"HTML\",save:\"Speichern\",load:\"Laden\",newDesign:\"Neu\",\r\n undo:\"Rückgängig\",redo:\"Wiederholen\",desktop:\"Desktop\",tablet:\"Tablet\",mobile:\"Mobil\",\r\n copied:\"Kopiert!\",copyHtml:\"HTML kopieren\",emailSettings:\"E-Mail-Einstellungen\",\r\n background:\"Hintergrund\",contentBg:\"Inhalts-Hintergrund\",contentBgImage:\"Hintergrundbild Inhalt (URL)\",contentBgSize:\"Größe Hintergrundbild\",contentBgRepeat:\"Wiederholung Hintergrundbild\",\r\n objectFit:\"Einpassen\",objectPosition:\"Position\",width:\"Breite\",\r\n padding:\"Innenabstand\",radius:\"Radius\",row:\"Zeile\",duplicate:\"Duplizieren\",\r\n delete:\"Löschen\",moveUp:\"Nach oben\",moveDown:\"Nach unten\",\r\n autoSaved:\"Auto-gespeichert\",search:\"Blöcke suchen…\",\r\n colorScheme:\"Farbschema\",\r\n blockGroupLayouts:\"Zeilenlayouts\",\r\n blockGroupBlocks:\"Inhaltsblöcke\",\r\n blockPaletteGroupText:\"Text & Inhalt\",\r\n blockPaletteGroupStructure:\"Layout & Struktur\",\r\n blockPaletteGroupMedia:\"Medien\",\r\n blockPaletteGroupActions:\"Buttons & Links\",\r\n blockPaletteGroupWidgets:\"Widgets\",\r\n closePanel:\"Schließen\",\r\n canvasEmptyHint:\"Blöcke in die Spalte ziehen oder Layout-Block für mehrspaltige Bereiche hinzufügen.\",\r\n loadingDesign:\"Design wird geladen…\",\r\n emailContentSettings:\"E-Mail-Inhalt\",\r\n zoomIn:\"Zoom +\",zoomOut:\"Zoom -\",zoom:\"Zoom\",\r\n resizeSidebar:\"Seitenleiste skalieren\" },\r\n es: { layouts:\"Diseños\",blocks:\"Bloques\",settings:\"Ajustes\",addRow:\"Haga clic para agregar\",\r\n dragIntoCell:\"Arrastrar a celda\",dropHere:\"Soltar aquí\",releaseHere:\"Soltar aquí\",\r\n nothingSelected:\"Nada seleccionado\",clickBlock:\"Haga clic en una fila o bloque.\",\r\n preview:\"Vista previa\",exportHtml:\"HTML\",save:\"Guardar\",load:\"Cargar\",newDesign:\"Nuevo\",\r\n undo:\"Deshacer\",redo:\"Rehacer\",desktop:\"Escritorio\",tablet:\"Tableta\",mobile:\"Móvil\",\r\n copied:\"¡Copiado!\",copyHtml:\"Copiar HTML\",emailSettings:\"Ajustes de email\",\r\n background:\"Fondo\",contentBg:\"Fondo contenido\",contentBgImage:\"Imagen de fondo del contenido (URL)\",contentBgSize:\"Tamaño imagen de fondo\",contentBgRepeat:\"Repetición imagen de fondo\",\r\n objectFit:\"Ajuste\",objectPosition:\"Posición\",width:\"Ancho\",\r\n padding:\"Relleno\",radius:\"Radio\",row:\"Fila\",duplicate:\"Duplicar\",\r\n delete:\"Eliminar\",moveUp:\"Subir\",moveDown:\"Bajar\",\r\n autoSaved:\"Auto-guardado\",search:\"Buscar bloques…\",\r\n zoomIn:\"Zoom +\",zoomOut:\"Zoom -\",zoom:\"Zoom\",\r\n colorScheme:\"Esquema de color\",\r\n blockGroupLayouts:\"Diseños de fila\",\r\n blockGroupBlocks:\"Bloques de contenido\",\r\n blockPaletteGroupText:\"Texto y contenido\",\r\n blockPaletteGroupStructure:\"Diseño y estructura\",\r\n blockPaletteGroupMedia:\"Medios\",\r\n blockPaletteGroupActions:\"Botones y enlaces\",\r\n blockPaletteGroupWidgets:\"Widgets\",\r\n closePanel:\"Cerrar\",\r\n canvasEmptyHint:\"Arrastra bloques a la columna o añade un bloque Diseño para varias columnas.\",\r\n loadingDesign:\"Cargando diseño…\",\r\n emailContentSettings:\"Contenido del correo\",\r\n resizeSidebar:\"Redimensionar panel\" },\r\n};\r\nexport const tr = (locale, key) => (I18N[locale] || I18N.en)[key] || key;\r\n\r\n// ─── LAYOUT PRESETS ───────────────────────────────────────────────────────────\r\nexport const LAYOUT_PRESETS = [\r\n { key:\"layout1\", label:\"Full Width\", cols:1, ratios:[1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"48\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout2\", label:\"2 Columns\", cols:2, ratios:[1,1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"22\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"28\" y=\"2\" width=\"22\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout3\", label:\"3 Columns\", cols:3, ratios:[1,1,1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"14\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"19\" y=\"2\" width=\"14\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"36\" y=\"2\" width=\"14\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout4\", label:\"4 Columns\", cols:4, ratios:[1,1,1,1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"15\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"28\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"41\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout13\", label:\"1:3 Split\", cols:2, ratios:[1,3], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"16\" y=\"2\" width=\"34\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout31\", label:\"3:1 Split\", cols:2, ratios:[3,1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"34\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"40\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout121\", label:\"1:2:1\", cols:3, ratios:[1,2,1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"16\" y=\"2\" width=\"20\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"40\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout212\", label:\"2:1:2\", cols:3, ratios:[2,1,2], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"18\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"24\" y=\"2\" width=\"8\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"36\" y=\"2\" width=\"14\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout_5\", label:\"5 Columns\", cols:5, ratios:[1,1,1,1,1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"1\" y=\"2\" width=\"8\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"11\" y=\"2\" width=\"8\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"21\" y=\"2\" width=\"8\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"31\" y=\"2\" width=\"8\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"41\" y=\"2\" width=\"9\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout_6\", label:\"6 Columns\", cols:6, ratios:[1,1,1,1,1,1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"1\" y=\"2\" width=\"6\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"9\" y=\"2\" width=\"6\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"17\" y=\"2\" width=\"6\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"25\" y=\"2\" width=\"6\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"33\" y=\"2\" width=\"6\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"41\" y=\"2\" width=\"9\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n];\r\n\r\n// ─── CONTENT BLOCK TYPES ─────────────────────────────────────────────────────\r\n/** Sidebar palette groups: order = top to bottom. Each block uses `paletteGroup` + `paletteOrder` (ascending within group). */\r\nexport const BLOCK_PALETTE_GROUPS = [\r\n { key: \"text\", labelKey: \"blockPaletteGroupText\" as const },\r\n { key: \"structure\", labelKey: \"blockPaletteGroupStructure\" as const },\r\n { key: \"media\", labelKey: \"blockPaletteGroupMedia\" as const },\r\n { key: \"actions\", labelKey: \"blockPaletteGroupActions\" as const },\r\n { key: \"widgets\", labelKey: \"blockPaletteGroupWidgets\" as const },\r\n] as const;\r\n\r\nexport type BlockPaletteGroupKey = (typeof BLOCK_PALETTE_GROUPS)[number][\"key\"];\r\n\r\ntype PaletteMeta = {\r\n label: string;\r\n icon: string;\r\n color: string;\r\n paletteGroup: BlockPaletteGroupKey;\r\n paletteOrder: number;\r\n};\r\n\r\n/** Sidebar palette: one entry per `DEFAULT_BLOCK_PROPS` key (labels / groups for the block library). */\r\nconst PALETTE_META = {\r\n heading: { label: \"Heading\", icon: \"H\", color: \"#262626\", paletteGroup: \"text\", paletteOrder: 1 },\r\n text: { label: \"Text\", icon: \"T\", color: \"#262626\", paletteGroup: \"text\", paletteOrder: 2 },\r\n html: { label: \"Rich editor\", icon: \"Aa\", color: \"#262626\", paletteGroup: \"text\", paletteOrder: 3 },\r\n layout: { label: \"Layout\", icon: \"⊞\", color: \"#262626\", paletteGroup: \"structure\", paletteOrder: 1 },\r\n divider: { label: \"Divider\", icon: \"—\", color: \"#262626\", paletteGroup: \"structure\", paletteOrder: 2 },\r\n spacer: { label: \"Spacer\", icon: \"↕\", color: \"#262626\", paletteGroup: \"structure\", paletteOrder: 3 },\r\n table: { label: \"Table\", icon: \"▦\", color: \"#262626\", paletteGroup: \"structure\", paletteOrder: 4 },\r\n image: { label: \"Image\", icon: \"🖼\", color: \"#262626\", paletteGroup: \"media\", paletteOrder: 1 },\r\n video: { label: \"Video\", icon: \"▶\", color: \"#262626\", paletteGroup: \"media\", paletteOrder: 2 },\r\n button: { label: \"Button\", icon: \"⬜\", color: \"#262626\", paletteGroup: \"actions\", paletteOrder: 1 },\r\n link: { label: \"Link\", icon: \"🔗\", color: \"#262626\", paletteGroup: \"actions\", paletteOrder: 2 },\r\n menu: { label: \"Menu\", icon: \"☰\", color: \"#262626\", paletteGroup: \"actions\", paletteOrder: 3 },\r\n social: { label: \"Social\", icon: \"◎\", color: \"#262626\", paletteGroup: \"widgets\", paletteOrder: 1 },\r\n timer: { label: \"Countdown\", icon: \"⏱\", color: \"#262626\", paletteGroup: \"widgets\", paletteOrder: 2 },\r\n} satisfies Record<keyof typeof DEFAULT_BLOCK_PROPS, PaletteMeta>;\r\n\r\nexport const CONTENT_BLOCK_TYPES = (\r\n Object.keys(PALETTE_META) as (keyof typeof PALETTE_META)[]\r\n).map((type) => ({\r\n type,\r\n ...PALETTE_META[type],\r\n}));\r\n\r\nexport const SC = { twitter:\"#000000\",facebook:\"#1877F2\",instagram:\"#E1306C\",linkedin:\"#0A66C2\",youtube:\"#FF0000\",pinterest:\"#E60023\",tiktok:\"#000000\",snapchat:\"#FFFC00\",github:\"#24292e\",discord:\"#5865F2\" };\r\nexport const ALL_NETWORKS = Object.keys(SC);\r\n\r\nexport function pickPresetByColCount(n) {\r\n const exact = LAYOUT_PRESETS.find((p) => p.cols === n);\r\n if (exact) return exact;\r\n if (n <= 1) return LAYOUT_PRESETS[0];\r\n return LAYOUT_PRESETS.find((p) => p.cols === Math.min(n, 6)) || LAYOUT_PRESETS[0];\r\n}\r\n","/** Shared defaults for a multi-column block inside a cell (`type: \"layout\"` with `props.cells`). */\r\nconst LAYOUT_IN_CELL_DEFAULTS = {\r\n cols: 2,\r\n ratios: [1, 1],\r\n gap: 12,\r\n padding: 8,\r\n bgColor: \"\",\r\n bgImage: \"\",\r\n bgSize: \"cover\",\r\n bgRepeat: \"no-repeat\",\r\n bgPosition: \"center\",\r\n bgGradient: null as { angle: number; colors: string[]; stops: number[] } | null,\r\n cells: [[], []],\r\n} as const;\r\n\r\nconst BOX0 = { top: 0, right: 0, bottom: 0, left: 0 } as const;\r\nconst boxAll = (n: number) => ({ top: n, right: n, bottom: n, left: n });\r\n\r\nconst BLOCK_BG = {\r\n bgColor: \"\",\r\n bgImage: \"\",\r\n bgGradient: null as { angle: number; colors: string[]; stops: number[] } | null,\r\n bgSize: \"cover\",\r\n bgRepeat: \"no-repeat\",\r\n bgPosition: \"center\",\r\n} as const;\r\n\r\nconst BACKDROP_BG = {\r\n backdropColor: \"\",\r\n backdropImage: \"\",\r\n backdropGradient: null as { angle: number; colors: string[]; stops: number[] } | null,\r\n backdropSize: \"cover\",\r\n backdropRepeat: \"no-repeat\",\r\n backdropPosition: \"center\",\r\n} as const;\r\n\r\n/** Plain defaults for `makeContentBlock` — `text.content` is HTML (TipTap / rich text). */\r\nexport const DEFAULT_BLOCK_PROPS = {\r\n heading: {\r\n ...BLOCK_BG,\r\n content: \"Your Headline Here\",\r\n level: \"h2\",\r\n fontSize: 28,\r\n color: \"#1e293b\",\r\n align: \"center\",\r\n fontWeight: \"700\",\r\n padding: boxAll(16),\r\n letterSpacing: 0,\r\n lineHeight: 1.2,\r\n fontFamily: \"Georgia,serif\",\r\n margin: { ...BOX0 },\r\n },\r\n text: {\r\n ...BLOCK_BG,\r\n content: \"Simple text block for plain messaging.\",\r\n fontSize: 15,\r\n color: \"#1e293b\",\r\n align: \"left\",\r\n fontWeight: \"400\",\r\n italic: false,\r\n underline: false,\r\n padding: boxAll(12),\r\n lineHeight: 1.65,\r\n letterSpacing: 0,\r\n fontFamily: \"Georgia,serif\",\r\n margin: { ...BOX0 },\r\n },\r\n /** Rich HTML body lives on the block root as `content` (string), not in `props`. */\r\n html: {\r\n ...BLOCK_BG,\r\n fontSize: 15,\r\n color: \"#1e293b\",\r\n align: \"left\",\r\n padding: boxAll(12),\r\n lineHeight: 1.65,\r\n letterSpacing: 0,\r\n fontFamily: \"Georgia,serif\",\r\n margin: { ...BOX0 },\r\n },\r\n image: {\r\n ...BLOCK_BG,\r\n src: \"https://placehold.co/600x160/e2e8f0/94a3b8?text=Image\",\r\n alt: \"Image\",\r\n width: \"100%\",\r\n objectFit: \"cover\",\r\n objectPosition: \"center\",\r\n align: \"center\",\r\n padding: boxAll(8),\r\n link: \"\",\r\n linkEnabled: false,\r\n linkTarget: \"_blank\",\r\n borderRadius: { tl: 0, tr: 0, br: 0, bl: 0 },\r\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\r\n },\r\n button: {\r\n ...BACKDROP_BG,\r\n label: \"Click Here\",\r\n href: \"#\",\r\n bgColor: \"#6366f1\",\r\n textColor: \"#ffffff\",\r\n align: \"center\",\r\n borderRadius: { tl: 6, tr: 6, br: 6, bl: 6 },\r\n paddingV: 11,\r\n paddingH: 24,\r\n fontSize: 14,\r\n fontWeight: 600,\r\n fullWidth: false,\r\n borderColor: \"transparent\",\r\n borderWidth: 0,\r\n linkTarget: \"_blank\",\r\n /** Space around the button block (outside the CTA). */\r\n padding: { ...BOX0 },\r\n margin: { ...BOX0 },\r\n },\r\n link: {\r\n ...BLOCK_BG,\r\n label: \"Link text\",\r\n href: \"#\",\r\n linkTarget: \"_blank\",\r\n color: \"#2563eb\",\r\n fontSize: 15,\r\n align: \"left\",\r\n fontWeight: \"700\",\r\n padding: boxAll(8),\r\n underline: true,\r\n fontFamily: \"Arial, Helvetica, sans-serif\",\r\n margin: { ...BOX0 },\r\n },\r\n divider: {\r\n ...BLOCK_BG,\r\n color: \"#e2e8f0\",\r\n thickness: 1,\r\n padding: boxAll(12),\r\n style: \"solid\",\r\n margin: { ...BOX0 },\r\n },\r\n spacer: { ...BLOCK_BG, height: 24, padding: { ...BOX0 }, margin: { ...BOX0 } },\r\n social: {\r\n ...BLOCK_BG,\r\n networks: [\"twitter\", \"facebook\", \"instagram\", \"linkedin\"],\r\n socialUrls: {},\r\n iconSize: 30,\r\n align: \"center\",\r\n padding: boxAll(12),\r\n shape: \"circle\",\r\n gap: 6,\r\n margin: { ...BOX0 },\r\n },\r\n video: {\r\n ...BLOCK_BG,\r\n src: \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\r\n height: 280,\r\n padding: boxAll(8),\r\n margin: { ...BOX0 },\r\n },\r\n menu: {\r\n ...BLOCK_BG,\r\n items: [\r\n { label: \"Home\", href: \"#\" },\r\n { label: \"About\", href: \"#\" },\r\n { label: \"Contact\", href: \"#\" },\r\n ],\r\n align: \"center\",\r\n fontSize: 14,\r\n color: \"#6366f1\",\r\n padding: boxAll(12),\r\n gap: 20,\r\n margin: { ...BOX0 },\r\n },\r\n timer: {\r\n ...BACKDROP_BG,\r\n endDate: new Date(Date.now() + 7 * 864e5).toISOString(),\r\n align: \"center\",\r\n bgColor: \"#6366f1\",\r\n textColor: \"#ffffff\",\r\n padding: boxAll(12),\r\n borderRadius: { tl: 6, tr: 6, br: 6, bl: 6 },\r\n label: \"Offer ends in:\",\r\n showLabels: true,\r\n margin: { ...BOX0 },\r\n },\r\n layout: {\r\n ...LAYOUT_IN_CELL_DEFAULTS,\r\n preset: \"custom\",\r\n },\r\n table: {\r\n ...BLOCK_BG,\r\n header: false,\r\n tableRole: \"data\",\r\n rows: 3,\r\n cols: 3,\r\n /** Padding around the whole table (outside cells). */\r\n padding: boxAll(10),\r\n /** Padding inside each table cell (same shape as block padding). */\r\n cellPadding: boxAll(10),\r\n headerBg: \"#1a5fbe\",\r\n headerColor: \"#ffffff\",\r\n cellBg: \"#ffffff\",\r\n cellBorder: \"#d0dff0\",\r\n stripedBg: \"#f4f8ff\",\r\n striped: true,\r\n data: [\r\n [\"Col A\", \"Col B\", \"Col C\"],\r\n [\"Row 2 A\", \"Row 2 B\", \"Row 2 C\"],\r\n [\"Row 3 A\", \"Row 3 B\", \"Row 3 C\"],\r\n ],\r\n fontSize: 13,\r\n fontFamily: \"sans-serif\",\r\n margin: { ...BOX0 },\r\n },\r\n} as const;\r\n\r\n/** Default markup for new `html` blocks (`makeContentBlock(\"html\")`). */\r\nexport const DEFAULT_HTML_BLOCK_MARKUP =\r\n \"<p>Rich HTML content. Edit with the rich editor.</p>\" as const;\r\n\r\nexport function imageLinkActive(p: { linkEnabled?: boolean; link?: string }): boolean {\r\n const url = typeof p.link === \"string\" ? p.link.trim() : \"\";\r\n const enabled = p.linkEnabled ?? !!url;\r\n return enabled && !!url;\r\n}\r\n\r\nexport type BlockPropKey = keyof typeof DEFAULT_BLOCK_PROPS;\r\n\r\n/** Content blocks allowed in design JSON / editor (same keys as {@link DEFAULT_BLOCK_PROPS}). */\r\nexport function isKnownBlockType(type: unknown): type is BlockPropKey {\r\n return typeof type === \"string\" && type in DEFAULT_BLOCK_PROPS;\r\n}\r\n","const BOX0 = { top: 0, right: 0, bottom: 0, left: 0 } as const;\r\n\r\n/** Per-column surface defaults (matches former `columnStyles[i]` fields). */\r\nexport const DEFAULT_COLUMN_PROPS = {\r\n bgColor: \"\",\r\n bgImage: \"\",\r\n bgGradient: null as { angle: number; colors: string[]; stops: number[] } | null,\r\n bgSize: \"cover\",\r\n bgRepeat: \"no-repeat\",\r\n bgPosition: \"center\",\r\n padding: { ...BOX0 },\r\n borderRadius: 0 as number | { tl: number; tr: number; br: number; bl: number },\r\n} as const;\r\n\r\nexport type ColumnProps = typeof DEFAULT_COLUMN_PROPS;\r\nexport type ColumnEntry = { props: ColumnProps };\r\n\r\nfunction isObj(x: unknown): x is Record<string, unknown> {\r\n return x !== null && typeof x === \"object\" && !Array.isArray(x);\r\n}\r\n\r\nfunction colCountFromContainer(c: { cells?: unknown[]; ratios?: unknown[]; cols?: number }) {\r\n const cells = Array.isArray(c.cells) ? c.cells.length : 0;\r\n const ratios = Array.isArray(c.ratios) ? c.ratios.length : 0;\r\n const cols = typeof c.cols === \"number\" && c.cols > 0 ? c.cols : 0;\r\n return Math.max(1, cells, ratios, cols);\r\n}\r\n\r\n/** Legacy `columnStyles` map → `columns[]`. */\r\nexport function columnsFromLegacyMap(\r\n map: unknown,\r\n count: number,\r\n): ColumnEntry[] {\r\n const n = Math.max(1, count);\r\n const src = isObj(map) ? map : {};\r\n return Array.from({ length: n }, (_, i) => {\r\n const raw = (src[i] ?? src[String(i)]) as Record<string, unknown> | undefined;\r\n return { props: { ...DEFAULT_COLUMN_PROPS, ...(isObj(raw) ? raw : {}) } as ColumnProps };\r\n });\r\n}\r\n\r\n/** Normalize row or layout `props` to `columns[]` (supports legacy `columnStyles`). */\r\nexport function getColumns(container: {\r\n columns?: unknown;\r\n columnStyles?: unknown;\r\n cells?: unknown[];\r\n ratios?: unknown[];\r\n cols?: number;\r\n}): ColumnEntry[] {\r\n const count = colCountFromContainer(container);\r\n if (Array.isArray(container.columns)) {\r\n const cols = container.columns as unknown[];\r\n return Array.from({ length: count }, (_, i) => {\r\n const entry = cols[i];\r\n if (isObj(entry) && isObj(entry.props)) {\r\n return { props: { ...DEFAULT_COLUMN_PROPS, ...entry.props } as ColumnProps };\r\n }\r\n if (isObj(entry)) {\r\n return { props: { ...DEFAULT_COLUMN_PROPS, ...entry } as ColumnProps };\r\n }\r\n return { props: { ...DEFAULT_COLUMN_PROPS } };\r\n });\r\n }\r\n if (container.columnStyles) {\r\n return columnsFromLegacyMap(container.columnStyles, count);\r\n }\r\n return columnsFromLegacyMap({}, count);\r\n}\r\n\r\nexport function getColumnPropsAt(\r\n container: Parameters<typeof getColumns>[0],\r\n index: number,\r\n): ColumnProps {\r\n const cols = getColumns(container);\r\n const i = Math.max(0, Math.min(index, cols.length - 1));\r\n return cols[i]?.props ?? { ...DEFAULT_COLUMN_PROPS };\r\n}\r\n\r\nexport function patchColumnPropsAt(\r\n container: Parameters<typeof getColumns>[0],\r\n index: number,\r\n patch: Partial<ColumnProps>,\r\n): ColumnEntry[] {\r\n const cols = getColumns(container);\r\n const i = Math.max(0, index);\r\n while (cols.length <= i) cols.push({ props: { ...DEFAULT_COLUMN_PROPS } });\r\n cols[i] = { props: { ...cols[i].props, ...patch } };\r\n return cols;\r\n}\r\n\r\n/** Strip legacy `columnStyles` when persisting `columns`. */\r\nexport function withColumnsOnly<T extends Record<string, unknown>>(\r\n row: T,\r\n columns: ColumnEntry[],\r\n): T & { columns: ColumnEntry[] } {\r\n const { columnStyles: _drop, ...rest } = row as T & { columnStyles?: unknown };\r\n return { ...rest, columns };\r\n}\r\n\r\nexport function columnPaddingNonZero(pad: { top: number; right: number; bottom: number; left: number }) {\r\n return pad.top !== 0 || pad.right !== 0 || pad.bottom !== 0 || pad.left !== 0;\r\n}\r\n\r\nexport function columnRadiusNonZero(r: unknown) {\r\n if (typeof r === \"number\") return r !== 0;\r\n if (isObj(r)) {\r\n return !!(r.tl || r.tr || r.br || r.bl);\r\n }\r\n return false;\r\n}\r\n\r\nexport function columnEntryHasSurface(entry: ColumnEntry) {\r\n const p = entry.props;\r\n const pad = p.padding;\r\n const hasPad =\r\n pad && typeof pad === \"object\"\r\n ? columnPaddingNonZero(pad as { top: number; right: number; bottom: number; left: number })\r\n : false;\r\n return !!(\r\n p.bgColor ||\r\n hasPad ||\r\n columnRadiusNonZero(p.borderRadius) ||\r\n p.bgImage ||\r\n p.bgGradient\r\n );\r\n}\r\n","import { DEFAULT_BLOCK_PROPS, DEFAULT_HTML_BLOCK_MARKUP } from \"../defaultBlockProps\";\r\nimport { DEFAULT_COLUMN_PROPS } from \"./columnProps\";\r\n\r\nexport function uid() { return Math.random().toString(36).slice(2,10); }\r\nexport function makeLayoutRow(preset) {\r\n return {\r\n id: uid(),\r\n type: \"layout\",\r\n preset: preset.key,\r\n cols: preset.cols,\r\n ratios: [...preset.ratios],\r\n gap: 12,\r\n padding: 8,\r\n bgColor: \"\",\r\n bgImage: \"\",\r\n bgSize: \"cover\",\r\n bgRepeat: \"no-repeat\",\r\n bgPosition: \"center\",\r\n bgGradient: null,\r\n cells: preset.ratios.map(() => []),\r\n };\r\n}\r\n\r\n/** Content block: columns inside a column (`layout` with cells; preset from row layout). */\r\nexport function makeNestedRowBlock(preset) {\r\n const row = makeLayoutRow(preset);\r\n return {\r\n id: uid(),\r\n type: \"layout\",\r\n props: {\r\n preset: row.preset,\r\n cols: row.cols,\r\n ratios: [...row.ratios],\r\n gap: row.gap,\r\n padding: row.padding,\r\n bgColor: row.bgColor,\r\n bgImage: row.bgImage,\r\n bgSize: row.bgSize ?? \"cover\",\r\n bgRepeat: row.bgRepeat ?? \"no-repeat\",\r\n bgPosition: (row as any).bgPosition ?? \"center\",\r\n bgGradient: (row as any).bgGradient ?? null,\r\n columns: (row as any).columns ?? (row as any).cells?.map(() => ({ props: { ...DEFAULT_COLUMN_PROPS } })),\r\n cells: row.cells,\r\n },\r\n };\r\n}\r\n\r\nexport function makeContentBlock(type) {\r\n if (type === \"html\") {\r\n return {\r\n id: uid(),\r\n type,\r\n content: DEFAULT_HTML_BLOCK_MARKUP,\r\n props: { ...DEFAULT_BLOCK_PROPS.html, content: DEFAULT_HTML_BLOCK_MARKUP },\r\n };\r\n }\r\n return { id: uid(), type, props: { ...DEFAULT_BLOCK_PROPS[type] } };\r\n}\r\n\r\n/** Editor row with one content block — exports as a flat root block in `blocks[]`. */\r\nexport function makeRootContentRow(contentType: string, preset: { key: string; cols: number; ratios: number[] }) {\r\n const row = makeLayoutRow(preset);\r\n row.gap = 0;\r\n row.padding = 0;\r\n const block = makeContentBlock(contentType);\r\n row.cells[0] = [block];\r\n return { row, block };\r\n}\r\n","/**\n * Maximum layout nesting the editor supports for moves/drops/selection.\n * `ColumnLoc` is only `top` or one `nested` hop (row → outer cell → layout → inner cell).\n * Deeper `layout` blocks in JSON are clamped on hydrate/export (see `emailDesignJson`).\n */\nexport const MAX_NESTED_LAYOUT_DEPTH = 1;\n\n/** 0 = top-level row column; 1 = column inside a nested `layout` block. */\nexport function nestedLayoutDepth(\n nested: { parentBlockIdx?: number; innerCellIdx?: number } | null | undefined,\n): number {\n return nested != null && nested.parentBlockIdx != null && nested.innerCellIdx != null ? 1 : 0;\n}\n\n/** Content blocks that contain multiple columns (`cells` / `ratios`). */\nexport function isSplitLayoutBlock(b) {\n return b && b.type === \"layout\" && b.props && Array.isArray(b.props.cells);\n}\n\n/** Canvas row with a single root content block (one section = one block at export). */\nexport function isRootContentRow(row: { cells?: unknown[][] }) {\n if (!row?.cells || row.cells.length !== 1) return false;\n const col = row.cells[0];\n if (!Array.isArray(col) || col.length !== 1) return false;\n const b = col[0] as { type?: string } | null;\n return !!b && typeof b.type === \"string\" && b.type !== \"layout\" && b.type !== \"nestedRow\";\n}\n\n/**\n * Address a column of blocks: top-level row column, or a column inside a nested `layout` block.\n * @typedef {{ type: 'top', rowId: string, cellIdx: number }} TopColumnLoc\n * @typedef {{ type: 'nested', rowId: string, outerCellIdx: number, blockIdx: number, innerCellIdx: number }} NestedColumnLoc\n * @typedef {TopColumnLoc | NestedColumnLoc} ColumnLoc\n */\n\n/** @param {ColumnLoc} loc */\nexport function getColumnBlocks(rows, loc) {\n const r = rows.find((x) => x.id === loc.rowId);\n if (!r) return [];\n if (loc.type === \"top\") return r.cells[loc.cellIdx] || [];\n const col = r.cells[loc.outerCellIdx];\n if (!col) return [];\n const b = col[loc.blockIdx];\n if (!isSplitLayoutBlock(b)) return [];\n return b.props.cells[loc.innerCellIdx] || [];\n}\n\n/** @param {ColumnLoc} loc @param {(col: object[]) => object[]} updater */\nexport function updateColumnAt(rows, loc, updater) {\n return rows.map((r) => {\n if (r.id !== loc.rowId) return r;\n if (loc.type === \"top\") {\n return {\n ...r,\n cells: r.cells.map((c, ci) => (ci === loc.cellIdx ? updater(c) : c)),\n };\n }\n return {\n ...r,\n cells: r.cells.map((col, oci) => {\n if (oci !== loc.outerCellIdx) return col;\n return col.map((b, bi) => {\n if (bi !== loc.blockIdx || !isSplitLayoutBlock(b)) return b;\n const nextInner = b.props.cells.map((ic, ici) =>\n ici === loc.innerCellIdx ? updater(ic) : ic,\n );\n return { ...b, props: { ...b.props, cells: nextInner } };\n });\n }),\n };\n });\n}\n\n/**\n * @param {object[]} rows\n * @param {string} rowId\n * @param {number} cellIdx outer column\n * @param {{ parentBlockIdx: number, innerCellIdx: number }|null|undefined} nested\n * @returns {ColumnLoc}\n */\nexport function toColumnLoc(rowId, cellIdx, nested) {\n if (nested && nested.parentBlockIdx != null && nested.innerCellIdx != null) {\n return {\n type: \"nested\",\n rowId,\n outerCellIdx: cellIdx,\n blockIdx: nested.parentBlockIdx,\n innerCellIdx: nested.innerCellIdx,\n };\n }\n return { type: \"top\", rowId, cellIdx };\n}\n\n/** True when both locs refer to the same block column (for move index math). */\nexport function sameColumnLoc(a, b) {\n if (!a || !b || a.rowId !== b.rowId) return false;\n if (a.type === \"top\" && b.type === \"top\") return a.cellIdx === b.cellIdx;\n if (a.type === \"nested\" && b.type === \"nested\") {\n return (\n a.outerCellIdx === b.outerCellIdx &&\n a.blockIdx === b.blockIdx &&\n a.innerCellIdx === b.innerCellIdx\n );\n }\n return false;\n}\n\nexport function countBlocksInDesign(rows) {\n const colBlocks = (blocks) =>\n blocks.reduce((n, b) => {\n if (isSplitLayoutBlock(b)) {\n const inner = (b.props.cells || []).reduce((m, c) => m + c.length, 0);\n return n + 1 + inner;\n }\n return n + 1;\n }, 0);\n return rows.reduce((sum, r) => sum + r.cells.reduce((s, c) => s + colBlocks(c), 0), 0);\n}\n","// --- HTML text safety ---\r\nexport function escHtmlAttr(s: unknown) {\r\n return String(s ?? \"\")\r\n .replace(/&/g, \"&\")\r\n .replace(/\"/g, \""\")\r\n .replace(/</g, \"<\")\r\n .replace(/>/g, \">\");\r\n}\r\n\r\nexport function escHtml(s: unknown) {\r\n return String(s ?? \"\")\r\n .replace(/&/g, \"&\")\r\n .replace(/</g, \"<\")\r\n .replace(/>/g, \">\");\r\n}\r\n\r\n// --- Base64 (UTF-8) for embedded design blobs / tooling ---\r\nexport function utf8ToBase64(raw: string): string {\r\n const bytes = new TextEncoder().encode(raw);\r\n let bin = \"\";\r\n for (let i = 0; i < bytes.length; i++) bin += String.fromCharCode(bytes[i]!);\r\n return btoa(bin);\r\n}\r\n\r\nexport function base64ToUtf8(b64: string): string {\r\n try {\r\n const bin = atob(b64.trim());\r\n const bytes = new Uint8Array(bin.length);\r\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\r\n return new TextDecoder().decode(bytes);\r\n } catch {\r\n return \"\";\r\n }\r\n}\r\n\r\n// --- Video URLs (YouTube / Vimeo) ---\r\nexport function videoSrcForEditorDisplay(src: unknown) {\r\n if (!src || typeof src !== \"string\") return \"\";\r\n const ytEmb = src.match(/youtube\\.com\\/embed\\/([A-Za-z0-9_-]{11})/);\r\n if (ytEmb) return `https://www.youtube.com/watch?v=${ytEmb[1]}`;\r\n const viEmb = src.match(/player\\.vimeo\\.com\\/video\\/(\\d+)/);\r\n if (viEmb) return `https://vimeo.com/${viEmb[1]}`;\r\n return src;\r\n}\r\n\r\nexport function videoUrlToEmbedSrc(url: unknown) {\r\n if (!url || typeof url !== \"string\") return \"\";\r\n const yt = url.match(/(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/)([A-Za-z0-9_-]{11})/);\r\n if (yt) return `https://www.youtube.com/embed/${yt[1]}`;\r\n const sh = url.match(/youtube\\.com\\/shorts\\/([A-Za-z0-9_-]{11})/);\r\n if (sh) return `https://www.youtube.com/embed/${sh[1]}`;\r\n const vi = url.match(/vimeo\\.com\\/(\\d+)/);\r\n if (vi) return `https://player.vimeo.com/video/${vi[1]}`;\r\n return url;\r\n}\r\n\r\n// --- Rich HTML (TipTap / canvas storage) ---\r\nconst EMPTY_RICH_HTML = \"<p></p>\";\r\n\r\nfunction unwrapAllDivElements(container: HTMLElement) {\r\n let el: HTMLDivElement | null;\r\n while ((el = container.querySelector(\"div\"))) {\r\n const parent = el.parentNode;\r\n if (!parent) break;\r\n while (el.firstChild) parent.insertBefore(el.firstChild, el);\r\n parent.removeChild(el);\r\n }\r\n}\r\n\r\n/** Collapse empty rich HTML to a canonical body; strip layout `<div>` wrappers in the browser. */\r\nexport function normalizeRichHtmlForStorage(html: string | undefined | null): string {\r\n const raw = String(html ?? \"\").trim();\r\n if (!raw) return EMPTY_RICH_HTML;\r\n if (typeof document === \"undefined\") {\r\n if (/^<p[^>]*>\\s*(<br\\s*\\/?\\s*>)?\\s*<\\/p>$/i.test(raw)) return EMPTY_RICH_HTML;\r\n return raw;\r\n }\r\n const tmp = document.createElement(\"div\");\r\n tmp.innerHTML = raw;\r\n unwrapAllDivElements(tmp);\r\n const text = (tmp.textContent || \"\").replace(/\\u00a0/g, \" \").trim();\r\n if (!text && !tmp.querySelector(\"img,video,iframe,svg\")) return EMPTY_RICH_HTML;\r\n return tmp.innerHTML.trim();\r\n}\r\n\r\nexport function isEffectivelyEmptyRichHtml(html: string | undefined | null): boolean {\r\n return normalizeRichHtmlForStorage(html) === EMPTY_RICH_HTML;\r\n}\r\n\r\n/** Shared rich HTML presentation (lists, headings, quotes) for canvas + email preview. */\r\nexport const RICH_HTML_CONTENT_CSS = `\r\n.email-rich-html-content ul,\r\n.email-rich-html-content ol {\r\n margin: 0.35em 0;\r\n padding-left: 1.35rem;\r\n list-style-position: outside;\r\n}\r\n.email-rich-html-content ul { list-style-type: disc; }\r\n.email-rich-html-content ol { list-style-type: decimal; }\r\n.email-rich-html-content li { margin: 0.2em 0; }\r\n.email-rich-html-content li > p { margin: 0; }\r\n.email-rich-html-content p { margin: 0.35em 0; }\r\n.email-rich-html-content h2,\r\n.email-rich-html-content h3,\r\n.email-rich-html-content h4 {\r\n margin: 0.5em 0 0.25em;\r\n line-height: 1.25;\r\n font-weight: 700;\r\n}\r\n.email-rich-html-content blockquote {\r\n margin: 0.35em 0;\r\n padding-left: 0.75rem;\r\n border-left: 3px solid #cbd5e1;\r\n}\r\n.email-rich-html-content hr {\r\n border: none;\r\n border-top: 1px solid #e2e8f0;\r\n margin: 0.75em 0;\r\n}\r\n.email-rich-html-content code {\r\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\r\n font-size: 0.92em;\r\n background: rgba(0, 0, 0, 0.06);\r\n padding: 0.1em 0.35em;\r\n border-radius: 3px;\r\n}\r\n.email-rich-html-inner ul,\r\n.email-rich-html-inner ol {\r\n margin: 0.35em 0;\r\n padding-left: 1.35rem;\r\n list-style-position: outside;\r\n}\r\n.email-rich-html-inner ul { list-style-type: disc; }\r\n.email-rich-html-inner ol { list-style-type: decimal; }\r\n.email-rich-html-inner li { margin: 0.2em 0; }\r\n.email-rich-html-inner li > p { margin: 0; }\r\n.email-rich-html-inner p { margin: 0.35em 0; }\r\n.email-rich-html-inner h2,\r\n.email-rich-html-inner h3,\r\n.email-rich-html-inner h4 {\r\n margin: 0.5em 0 0.25em;\r\n line-height: 1.25;\r\n font-weight: 700;\r\n}\r\n.email-rich-html-inner blockquote {\r\n margin: 0.35em 0;\r\n padding-left: 0.75rem;\r\n border-left: 3px solid #cbd5e1;\r\n}\r\n.email-rich-html-inner hr {\r\n border: none;\r\n border-top: 1px solid #e2e8f0;\r\n margin: 0.75em 0;\r\n}\r\n`.trim();\r\n\r\nfunction applyInlineListStyles(root: HTMLElement) {\r\n root.querySelectorAll(\"ul\").forEach((ul) => {\r\n const el = ul as HTMLElement;\r\n el.style.margin = el.style.margin || \"0.35em 0\";\r\n el.style.paddingLeft = el.style.paddingLeft || \"1.35rem\";\r\n el.style.listStyleType = el.style.listStyleType || \"disc\";\r\n el.style.listStylePosition = el.style.listStylePosition || \"outside\";\r\n });\r\n root.querySelectorAll(\"ol\").forEach((ol) => {\r\n const el = ol as HTMLElement;\r\n el.style.margin = el.style.margin || \"0.35em 0\";\r\n el.style.paddingLeft = el.style.paddingLeft || \"1.35rem\";\r\n el.style.listStyleType = el.style.listStyleType || \"decimal\";\r\n el.style.listStylePosition = el.style.listStylePosition || \"outside\";\r\n });\r\n root.querySelectorAll(\"li\").forEach((li) => {\r\n const el = li as HTMLElement;\r\n if (!el.style.margin) el.style.margin = \"0.2em 0\";\r\n });\r\n root.querySelectorAll(\"li > p\").forEach((p) => {\r\n const el = p as HTMLElement;\r\n if (!el.style.margin) el.style.margin = \"0\";\r\n });\r\n}\r\n\r\n/** Inline list/quote styles for HTML email clients that strip `<style>` rules. */\r\nexport function enhanceRichHtmlForEmail(html: string | undefined | null): string {\r\n const raw = String(html ?? \"\").trim();\r\n if (!raw || raw === EMPTY_RICH_HTML) return raw || EMPTY_RICH_HTML;\r\n if (typeof document === \"undefined\") return raw;\r\n const tmp = document.createElement(\"div\");\r\n tmp.innerHTML = raw;\r\n if (!tmp.querySelector(\"ul,ol,blockquote,h2,h3,h4,hr\")) return raw;\r\n applyInlineListStyles(tmp);\r\n tmp.querySelectorAll(\"blockquote\").forEach((bq) => {\r\n const el = bq as HTMLElement;\r\n if (!el.style.margin) el.style.margin = \"0.35em 0\";\r\n if (!el.style.paddingLeft) el.style.paddingLeft = \"0.75rem\";\r\n if (!el.style.borderLeft) el.style.borderLeft = \"3px solid #cbd5e1\";\r\n });\r\n return tmp.innerHTML.trim();\r\n}\r\n","import React from \"react\";\r\n\r\n/** viewBox 0 0 24 24 — paths adapted from Simple Icons (MIT) */\r\nconst GLYPHS = {\r\n facebook:\r\n \"M24 12.073C24 5.446 18.627 0 12 0S0 5.446 0 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z\",\r\n /** X (formerly Twitter) — Simple Icons “X” */\r\n twitter:\r\n \"M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z\",\r\n instagram:\r\n \"M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.98-6.98.072-1.28.07-1.689.07-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z\",\r\n linkedin:\r\n \"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\",\r\n youtube:\r\n \"M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\",\r\n pinterest:\r\n \"M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.174-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.966-2.901 2.165-2.901 1.021 0 1.512.765 1.512 1.682 0 1.025-.653 2.555-.99 3.978-.281 1.189.597 2.159 1.775 2.159 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.085.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.402.165-1.495-.698-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.354-.629-2.758-1.379l-.749 2.848c-.269 1.045-1.004 2.352-1.498 3.146 1.123.345 2.306.535 3.55.535 6.607 0 11.985-5.365 11.985-11.987C23.97 5.39 18.592.026 11.985.026z\",\r\n tiktok:\r\n \"M19.59 6.69a4.83 4.83 0 01-3.77-4.245V2h-3.45v13.672a2.896 2.896 0 01-5.201 1.743 2.895 2.895 0 012.31-4.629 2.89 2.89 0 01.878.14V9.4a6.84 6.84 0 00-1-.05A6.33 6.33 0 005 20.1a6.34 6.34 0 0010.86-4.43v-7.36a8.16 8.16 0 004.77 1.52v-3.4a4.85 4.85 0 01-1-.1z\",\r\n snapchat:\r\n \"M12 0C5.373 0 0 5.372 0 12c0 4.991 3.657 9.128 8.438 9.879-.118-.949-.227-2.422.045-3.461.222-.95 1.444-6.037 1.444-6.037s-.367-.744-.367-1.844c0-1.726.999-3.012 2.243-3.012 1.058 0 1.569.795 1.569 1.748 0 1.065-.679 2.653-1.029 4.13-.292 1.237.618 2.246 1.835 2.246 2.203 0 3.895-2.323 3.895-5.67 0-2.965-2.129-5.038-5.167-5.038-3.52 0-5.585 2.643-5.585 5.589 0 1.106.425 2.295.956 2.943a.77.77 0 01.194.569c-.21.997-.679 3.135-.769 3.568-.121.588-.402.712-.929.431-3.485-1.624-5.667-6.731-5.667-10.839C2.5 6.506 6.847 2.344 12.001 2.344c4.391 0 7.809 2.776 7.809 6.586 0 4.308-2.694 7.635-6.369 7.635-1.271 0-2.464-.677-2.871-1.475 0 0-.669 2.562-.828 3.193-.301 1.301-1.12 2.929-1.668 3.922.125.047.256.07.395.07 1 0 1.826-.827 2.13-1.856.169-.617.982-3.857.982-3.857z\",\r\n github:\r\n \"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\",\r\n discord:\r\n \"M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z\",\r\n};\r\n\r\nfunction iconFillForNetwork(network) {\r\n return network === \"snapchat\" ? \"#000000\" : \"#ffffff\";\r\n}\r\n\r\nfunction glyphPath(network) {\r\n return GLYPHS[network] || null;\r\n}\r\n\r\n/** Inline SVG string for exported email HTML (Gmail-friendly) */\r\nexport function socialIconSvgString(network, pixelSize) {\r\n const d = glyphPath(network);\r\n const fill = iconFillForNetwork(network);\r\n const s = Math.max(8, Math.round(pixelSize));\r\n if (!d) {\r\n const letter = (network && network[0] ? network[0] : \"?\").toUpperCase();\r\n return `<span style=\"font-size:${Math.floor(s * 0.44)}px;font-weight:800;line-height:1;\">${letter}</span>`;\r\n }\r\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"${s}\" height=\"${s}\" style=\"display:block;flex-shrink:0;\" aria-hidden=\"true\"><path fill=\"${fill}\" d=\"${d}\"/></svg>`;\r\n}\r\n\r\nexport function SocialGlyph({ network, size }) {\r\n const d = glyphPath(network);\r\n const s = Math.max(8, Math.round(size));\r\n if (!d) {\r\n return (\r\n <span style={{ fontSize: Math.floor(s * 0.44), fontWeight: 800, lineHeight: 1 }}>\r\n {(network && network[0] ? network[0] : \"?\").toUpperCase()}\r\n </span>\r\n );\r\n }\r\n return (\r\n <svg\r\n width={s}\r\n height={s}\r\n viewBox=\"0 0 24 24\"\r\n style={{ display: \"block\", flexShrink: 0 }}\r\n aria-hidden\r\n >\r\n <path fill=\"currentColor\" d={d} />\r\n </svg>\r\n );\r\n}\r\n","import type { CSSProperties } from \"react\";\r\n\r\n/** Parsed gradient object from editor JSON */\r\nexport type GradientSpec = {\r\n angle?: number;\r\n colors?: unknown[];\r\n stops?: unknown[];\r\n};\r\n\r\nexport function linearGradientCssInner(g: unknown): string {\r\n if (!g || typeof g !== \"object\" || Array.isArray(g)) return \"\";\r\n const o = g as GradientSpec;\r\n if (!Array.isArray(o.colors) || !Array.isArray(o.stops)) return \"\";\r\n if (o.colors.length < 2 || o.stops.length !== o.colors.length) return \"\";\r\n const angle = typeof o.angle === \"number\" ? o.angle : 135;\r\n const pairs = o.colors\r\n .map((c, i) => [String(c ?? \"\").trim(), Number(o.stops![i])] as const)\r\n .filter(([c, s]) => c && Number.isFinite(s))\r\n .map(([c, s]) => `${c} ${Math.max(0, Math.min(100, s))}%`);\r\n if (pairs.length < 2) return \"\";\r\n return `linear-gradient(${angle}deg, ${pairs.join(\", \")})`;\r\n}\r\n\r\nexport type SurfaceBgProps = {\r\n bgColor?: string;\r\n bgImage?: string;\r\n bgSize?: string;\r\n bgRepeat?: string;\r\n bgPosition?: string;\r\n bgGradient?: unknown;\r\n};\r\n\r\nexport function backgroundLayerStyle(p: SurfaceBgProps): CSSProperties {\r\n const pos =\r\n typeof p.bgPosition === \"string\" && p.bgPosition.trim()\r\n ? p.bgPosition.trim()\r\n : \"center\";\r\n const gradInner = linearGradientCssInner(p.bgGradient);\r\n if (gradInner) {\r\n return {\r\n backgroundColor:\r\n p.bgColor && String(p.bgColor).trim() ? p.bgColor : \"transparent\",\r\n backgroundImage: gradInner,\r\n backgroundRepeat: \"no-repeat\",\r\n backgroundPosition: pos,\r\n backgroundSize: \"cover\",\r\n };\r\n }\r\n const img = String(p.bgImage ?? \"\").trim();\r\n if (img) {\r\n return {\r\n backgroundColor:\r\n p.bgColor && String(p.bgColor).trim() ? p.bgColor : \"transparent\",\r\n backgroundImage: `url(${img})`,\r\n backgroundSize: p.bgSize || \"cover\",\r\n backgroundRepeat: p.bgRepeat || \"no-repeat\",\r\n backgroundPosition: pos,\r\n };\r\n }\r\n if (p.bgColor && String(p.bgColor).trim()) {\r\n return { backgroundColor: p.bgColor };\r\n }\r\n return {};\r\n}\r\n\r\n/** Inline CSS fragment for email HTML `style=\"\"` (no leading/trailing semicolons required). */\r\nexport function emailSurfaceBgCss(p: SurfaceBgProps): string {\r\n const pos =\r\n typeof p.bgPosition === \"string\" && p.bgPosition.trim()\r\n ? p.bgPosition.trim()\r\n : \"center\";\r\n const gradInner = linearGradientCssInner(p.bgGradient);\r\n if (gradInner) {\r\n const bc =\r\n p.bgColor && String(p.bgColor).trim()\r\n ? `background-color:${p.bgColor};`\r\n : \"\";\r\n return `${bc}background-image:${gradInner};background-repeat:no-repeat;background-position:${pos};background-size:cover;`;\r\n }\r\n const img = String(p.bgImage ?? \"\").trim();\r\n if (img) {\r\n const bc =\r\n p.bgColor && String(p.bgColor).trim()\r\n ? `background-color:${p.bgColor};`\r\n : \"\";\r\n return `${bc}background-image:url(${img});background-size:${p.bgSize || \"cover\"};background-repeat:${p.bgRepeat || \"no-repeat\"};background-position:${pos};`;\r\n }\r\n if (p.bgColor && String(p.bgColor).trim())\r\n return `background-color:${p.bgColor};`;\r\n return \"\";\r\n}\r\n\r\nexport type BackdropBgProps = {\r\n backdropColor?: string;\r\n backdropImage?: string;\r\n backdropSize?: string;\r\n backdropRepeat?: string;\r\n backdropPosition?: string;\r\n backdropGradient?: unknown;\r\n};\r\n\r\nexport function backdropLayerStyle(p: BackdropBgProps): CSSProperties {\r\n return backgroundLayerStyle({\r\n bgColor: p.backdropColor,\r\n bgImage: p.backdropImage,\r\n bgSize: p.backdropSize,\r\n bgRepeat: p.backdropRepeat,\r\n bgPosition: p.backdropPosition,\r\n bgGradient: p.backdropGradient,\r\n });\r\n}\r\n\r\nexport function emailBackdropBgCss(p: BackdropBgProps): string {\r\n return emailSurfaceBgCss({\r\n bgColor: p.backdropColor,\r\n bgImage: p.backdropImage,\r\n bgSize: p.backdropSize,\r\n bgRepeat: p.backdropRepeat,\r\n bgPosition: p.backdropPosition,\r\n bgGradient: p.backdropGradient,\r\n });\r\n}\r\n","import { imageLinkActive } from \"../defaultBlockProps\";\r\nimport { enhanceRichHtmlForEmail, RICH_HTML_CONTENT_CSS } from \"./htmlUtils\";\r\nimport { getColumnPropsAt, getColumns } from \"./columnProps\";\r\nimport { socialIconSvgString } from \"../socialIcons\";\r\nimport { SC } from \"../constants\";\r\nimport { escHtmlAttr, escHtml, utf8ToBase64, videoUrlToEmbedSrc } from \"./htmlUtils\";\r\nimport { emailBackdropBgCss, emailSurfaceBgCss } from \"./blockBackground\";\r\n\r\nfunction blockToHtml(cb) {\r\n const p = cb.props;\r\n const numOr = (n: unknown, fallback: number) => (typeof n === \"number\" && Number.isFinite(n) ? n : fallback);\r\n const boxPx = (m: any) => {\r\n const top = numOr(m?.top, 0);\r\n const right = numOr(m?.right, top);\r\n const bottom = numOr(m?.bottom, top);\r\n const left = numOr(m?.left, right);\r\n return `${top}px ${right}px ${bottom}px ${left}px`;\r\n };\r\n /** Padding is always px (UI forces px; keep backward compatibility with number). */\r\n const pd = (v: unknown) =>\r\n v && typeof v === \"object\" && !Array.isArray(v) ? `padding:${boxPx(v)}` : `padding:${numOr(v, 0)}px`;\r\n const lenPx = (v: unknown) => `${numOr(v, 0)}px`;\r\n const lh = (v: unknown, u?: unknown) => {\r\n // Always unitless in export (email clients expect unitless line-height for text).\r\n return String(numOr(v, 1.65));\r\n };\r\n const box = (m: any, u?: unknown) => {\r\n const top = numOr(m?.top, 0);\r\n const right = numOr(m?.right, top);\r\n const bottom = numOr(m?.bottom, top);\r\n const left = numOr(m?.left, right);\r\n return `${top}px ${right}px ${bottom}px ${left}px`;\r\n };\r\n const marginCss = () => `margin:${box(p.margin)};`;\r\n const radiusPx = (r: any) => {\r\n if (typeof r === \"number\") return `${numOr(r, 0)}px`;\r\n if (r && typeof r === \"object\" && !Array.isArray(r)) {\r\n const tl = numOr(r.tl, 0);\r\n const tr = numOr(r.tr, tl);\r\n const br = numOr(r.br, tl);\r\n const bl = numOr(r.bl, tr);\r\n return `${tl}px ${tr}px ${br}px ${bl}px`;\r\n }\r\n return \"0px\";\r\n };\r\n switch(cb.type) {\r\n case \"heading\": {\r\n const shell = emailSurfaceBgCss(p);\r\n const tag = p.level || \"h2\";\r\n const typo = `font-size:${lenPx(p.fontSize)};color:${p.color};text-align:${p.align};font-weight:${p.fontWeight ?? (p.bold ? 700 : 400)};letter-spacing:${lenPx(p.letterSpacing)};line-height:${lh(p.lineHeight)};font-family:${p.fontFamily || \"Georgia,serif\"}`;\r\n if (shell) {\r\n return `<div style=\"${pd(p.padding)};${marginCss()}${shell}\"><${tag} style=\"margin:0;${typo}\">${p.content}</${tag}></div>`;\r\n }\r\n return `<${tag} style=\"${pd(p.padding)};${typo};${marginCss()}\">${p.content}</${tag}>`;\r\n }\r\n case \"text\": {\r\n const shell = emailSurfaceBgCss(p);\r\n const inner = `font-size:${lenPx(p.fontSize)};color:${p.color};text-align:${p.align};font-weight:${p.fontWeight || 400};font-style:${p.italic ? \"italic\" : \"normal\"};text-decoration:${p.underline ? \"underline\" : \"none\"};line-height:${lh(p.lineHeight)};letter-spacing:${lenPx(p.letterSpacing)};font-family:${p.fontFamily || \"Georgia,serif\"}`;\r\n return `<div style=\"${pd(p.padding)};${marginCss()}${shell}\"><div style=\"${inner}\">${p.content}</div></div>`;\r\n }\r\n case \"html\": {\r\n const shell = emailSurfaceBgCss(p);\r\n const inner = `font-size:${lenPx(p.fontSize)};color:${p.color};text-align:${p.align};line-height:${lh(p.lineHeight)};letter-spacing:${lenPx(p.letterSpacing)};font-family:${p.fontFamily || \"Georgia,serif\"}`;\r\n const bodyRaw =\r\n typeof (cb as { content?: unknown }).content === \"string\"\r\n ? (cb as { content: string }).content\r\n : typeof p.content === \"string\"\r\n ? p.content\r\n : \"\";\r\n const body = enhanceRichHtmlForEmail(bodyRaw || \"<p></p>\");\r\n return `<div style=\"${pd(p.padding)};${marginCss()}${shell}\"><div class=\"email-rich-html-inner\" style=\"${inner}\">${body}</div></div>`;\r\n }\r\n case \"image\": {\r\n const of = typeof p.objectFit === \"string\" && p.objectFit.trim() ? p.objectFit.trim() : \"cover\";\r\n const op = typeof p.objectPosition === \"string\" && p.objectPosition.trim() ? p.objectPosition.trim() : \"center\";\r\n const img=`<img src=\"${p.src}\" alt=\"${p.alt||\"\"}\" style=\"max-width:${p.width};width:${p.width||\"100%\"};display:inline-block;border-radius:${radiusPx(p.borderRadius)};object-fit:${of};object-position:${op};\"/>`;\r\n const shell = emailSurfaceBgCss(p);\r\n return `<div style=\"${pd(p.padding)};text-align:${p.align};${marginCss()}${shell}\">${imageLinkActive(p) ? `<a href=\"${escHtmlAttr(p.link)}\" target=\"${escHtmlAttr(p.linkTarget || \"_blank\")}\">${img}</a>` : img}</div>`;\r\n }\r\n case \"button\": {\r\n const bd = emailBackdropBgCss(p);\r\n return `<div class=\"email-btn-wrap\" style=\"${pd(p.padding)};text-align:${p.fullWidth ? \"center\" : p.align};${marginCss()}${bd}\"><a class=\"email-btn-cta\" href=\"${escHtmlAttr(p.href)}\" target=\"${escHtmlAttr(p.linkTarget || \"_blank\")}\" style=\"display:${p.fullWidth ? \"block\" : \"inline-block\"};background:${p.bgColor};color:${p.textColor};border-radius:${radiusPx(p.borderRadius)};padding:${p.paddingV || 11}px ${p.paddingH || 24}px;text-decoration:none;font-size:${lenPx(p.fontSize)};font-weight:${p.fontWeight || 600};font-family:sans-serif;border:${p.borderWidth || 0}px solid ${p.borderColor || \"transparent\"};${p.fullWidth ? \"width:100%;text-align:center;box-sizing:border-box;\" : \"\"}\">${escHtml(p.label)}</a></div>`;\r\n }\r\n case \"link\": {\r\n const dec = p.underline ? \"underline\" : \"none\";\r\n const fw = p.fontWeight ?? (p.bold ? 700 : 400);\r\n const shell = emailSurfaceBgCss(p);\r\n return `<div style=\"${pd(p.padding)};text-align:${p.align};${marginCss()}${shell}\"><a href=\"${escHtmlAttr(p.href)}\" target=\"${escHtmlAttr(p.linkTarget || \"_blank\")}\" rel=\"noopener noreferrer\" style=\"color:${p.color};font-size:${lenPx(p.fontSize)};font-weight:${fw};text-decoration:${dec};font-family:${p.fontFamily || \"Arial, Helvetica, sans-serif\"};\">${escHtml(p.label)}</a></div>`;\r\n }\r\n case \"divider\": {\r\n const shell = emailSurfaceBgCss(p);\r\n return `<div style=\"${pd(p.padding)};${marginCss()}${shell}\"><hr style=\"border:none;border-top:${p.thickness}px ${p.style || \"solid\"} ${p.color};margin:0;\"/></div>`;\r\n }\r\n case \"spacer\": {\r\n const shell = emailSurfaceBgCss(p);\r\n return `<div style=\"height:${p.height}px;line-height:${p.height}px;${pd(p.padding)};${marginCss()}${shell}\"> </div>`;\r\n }\r\n case \"social\": {\r\n const urls = p.socialUrls || {};\r\n const shell = emailSurfaceBgCss(p);\r\n return `<div class=\"email-social-row\" style=\"${pd(p.padding)};text-align:${p.align};${marginCss()}${shell}\">${(p.networks||[]).map(n=>{\r\n const raw = urls[n] && String(urls[n]).trim();\r\n const href = escHtmlAttr(raw || \"#\");\r\n const glyphPx = Math.round((p.iconSize || 24) * 0.56);\r\n const svg = socialIconSvgString(n, glyphPx);\r\n const tag = `<span style=\"display:inline-flex;align-items:center;justify-content:center;width:${p.iconSize}px;height:${p.iconSize}px;border-radius:${p.shape===\"square\"?\"4px\":\"50%\"};background:${SC[n]||\"#64748b\"};color:${n===\"snapchat\"?\"#000\":\"#fff\"};margin:0 ${p.gap||4}px;text-decoration:none;\">${svg}</span>`;\r\n return raw ? `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"display:inline-flex;text-decoration:none;\">${tag}</a>` : tag;\r\n }).join(\"\")}</div>`;\r\n }\r\n case \"video\": {\r\n const embedSrc = videoUrlToEmbedSrc(p.src);\r\n const shell = emailSurfaceBgCss(p);\r\n return `<div style=\"${pd(p.padding)};text-align:center;${marginCss()}${shell}\"><iframe src=\"${embedSrc}\" width=\"100%\" height=\"${p.height}\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen style=\"max-width:100%;border-radius:5px;display:block;\"></iframe></div>`;\r\n }\r\n case \"menu\": {\r\n const shell = emailSurfaceBgCss(p);\r\n return `<nav class=\"email-nav-menu\" style=\"${pd(p.padding)};text-align:${p.align};${marginCss()}${shell}\">${(p.items||[]).map(item=>`<a href=\"${item.href}\" style=\"font-size:${lenPx(p.fontSize)};color:${p.color};margin:0 ${p.gap||10}px;text-decoration:none;font-family:sans-serif;font-weight:600;\">${item.label}</a>`).join(\"\")}</nav>`;\r\n }\r\n case \"timer\": {\r\n const end=new Date(p.endDate).getTime(),now=Date.now(),diff=Math.max(0,end-now);\r\n const d=Math.floor(diff/86400000),h=Math.floor((diff%86400000)/3600000),m=Math.floor((diff%3600000)/60000),s=Math.floor((diff%60000)/1000);\r\n const cell=(val,lbl)=>`<td align=\"center\" style=\"background:${p.bgColor};color:${p.textColor};border-radius:${radiusPx(p.borderRadius)};padding:8px 14px;font-family:monospace;font-weight:700;font-size:20px;min-width:52px;text-align:center;\"><div>${String(val).padStart(2,\"0\")}</div>${p.showLabels?`<div style=\"font-size:9px;opacity:.75;letter-spacing:.08em;margin-top:3px;\">${lbl}</div>`:\"\"}</td>`;\r\n const bd = emailBackdropBgCss(p);\r\n return `<div class=\"email-timer-wrap\" style=\"${pd(p.padding)};text-align:${p.align};${marginCss()}${bd}\">${p.label?`<div style=\"font-size:12px;color:#64748b;margin-bottom:6px;font-family:sans-serif;\">${p.label}</div>`:\"\"}<table cellpadding=\"0\" cellspacing=\"6\" style=\"display:inline-table;max-width:100%;\"><tr>${cell(d,\"DAYS\")}${cell(h,\"HRS\")}${cell(m,\"MIN\")}${cell(s,\"SEC\")}</tr></table></div>`;\r\n }\r\n case \"table\": {\r\n const rows2 = p.data || [];\r\n const role = p.tableRole === \"presentation\" ? \"presentation\" : \"table\";\r\n const cellPaddingCss = (() => {\r\n const cp = p.cellPadding;\r\n if (cp && typeof cp === \"object\" && !Array.isArray(cp)) {\r\n return `padding:${boxPx(cp)}`;\r\n }\r\n const cellPadPx =\r\n typeof cp === \"number\" && Number.isFinite(cp)\r\n ? cp\r\n : typeof p.padding === \"number\" && Number.isFinite(p.padding)\r\n ? p.padding\r\n : numOr((p.padding as { top?: number })?.top, 8);\r\n return `padding:${cellPadPx}px`;\r\n })();\r\n const rowsHtml = rows2.map((row, ri) => {\r\n const isHeaderRow = !!p.header && ri === 0;\r\n const isStriped =\r\n p.striped &&\r\n (p.header ? ri > 1 && ri % 2 === 0 : ri > 0 && ri % 2 === 1);\r\n const cells = row\r\n .map((cell) => {\r\n const tag = isHeaderRow ? \"th\" : \"td\";\r\n const scope = isHeaderRow ? \" scope=\\\"col\\\"\" : \"\";\r\n const bg = isHeaderRow\r\n ? p.headerBg || \"#1a5fbe\"\r\n : isStriped\r\n ? p.stripedBg || \"#f4f8ff\"\r\n : p.cellBg || \"#ffffff\";\r\n const color = isHeaderRow ? p.headerColor || \"#ffffff\" : \"inherit\";\r\n const fw = isHeaderRow ? 700 : 400;\r\n return `<${tag}${scope} style=\"${cellPaddingCss};border:1px solid ${p.cellBorder || \"#d0dff0\"};background:${bg};color:${color};font-weight:${fw};font-size:${p.fontSize || 13}px;font-family:${p.fontFamily || \"sans-serif\"};text-align:left;word-break:break-word;\">${cell}</${tag}>`;\r\n })\r\n .join(\"\");\r\n return `<tr>${cells}</tr>`;\r\n }).join(\"\");\r\n const shell = emailSurfaceBgCss(p);\r\n return `<div style=\"${pd(p.padding)};overflow:auto;${marginCss()}${shell}\"><table role=\"${escHtmlAttr(role)}\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse:collapse;\">${rowsHtml}</table></div>`;\r\n }\r\n case \"layout\": {\r\n const pseudo = {\r\n id: \"\",\r\n type: \"layout\",\r\n cols: p.cols,\r\n ratios: p.ratios || [1],\r\n gap: p.gap ?? 12,\r\n padding: p.padding ?? 8,\r\n bgColor: p.bgColor || \"\",\r\n bgImage: p.bgImage || \"\",\r\n bgSize: p.bgSize || \"cover\",\r\n bgRepeat: p.bgRepeat || \"no-repeat\",\r\n bgPosition: typeof p.bgPosition === \"string\" ? p.bgPosition : \"center\",\r\n bgGradient: p.bgGradient ?? null,\r\n columns: getColumns(p),\r\n cells: p.cells || [],\r\n };\r\n return rowToHtml(pseudo);\r\n }\r\n default: return \"\";\r\n }\r\n}\r\nfunction rowToHtml(row) {\r\n const numOr = (v: unknown, fb: number) => (typeof v === \"number\" && Number.isFinite(v) ? v : fb);\r\n const shellBg = emailSurfaceBgCss(row);\r\n /** Multi-column layout row = horizontal flex (matches editor canvas). */\r\n const inner =\r\n row.cells.length === 1\r\n ? row.cells[0].map(blockToHtml).join(\"\")\r\n : `<div class=\"email-row-flex\" style=\"display:flex;flex-direction:row;flex-wrap:nowrap;align-items:flex-start;gap:${row.gap ?? 12}px;width:100%;max-width:100%;box-sizing:border-box;\">${row.cells\r\n .map((cell, i) => {\r\n const r = row.ratios[i] ?? 1;\r\n const cs = getColumnPropsAt(row, i);\r\n const colShell = emailSurfaceBgCss(cs);\r\n const pad =\r\n cs.padding && typeof cs.padding === \"object\" && !Array.isArray(cs.padding)\r\n ? `padding:${(() => {\r\n const o = cs.padding as Record<string, number>;\r\n const t = numOr(o.top, 0);\r\n const rgt = numOr(o.right, t);\r\n const b = numOr(o.bottom, t);\r\n const l = numOr(o.left, rgt);\r\n return `${t}px ${rgt}px ${b}px ${l}px`;\r\n })()};`\r\n : typeof cs.padding === \"number\" && Number.isFinite(cs.padding)\r\n ? `padding:${cs.padding}px;`\r\n : \"\";\r\n const rad =\r\n cs.borderRadius && typeof cs.borderRadius === \"object\" && !Array.isArray(cs.borderRadius)\r\n ? (() => {\r\n const x = cs.borderRadius as Record<string, number>;\r\n const tl = numOr(x.tl, 0);\r\n const tr = numOr(x.tr, tl);\r\n const br = numOr(x.br, tl);\r\n const bl = numOr(x.bl, tr);\r\n return `border-radius:${tl}px ${tr}px ${br}px ${bl}px;`;\r\n })()\r\n : typeof cs.borderRadius === \"number\" && Number.isFinite(cs.borderRadius)\r\n ? `border-radius:${cs.borderRadius}px;`\r\n : \"\";\r\n return `<div style=\"flex:${r} 1 0;min-width:0;box-sizing:border-box;${pad}${rad}${colShell}\">${cell.map(blockToHtml).join(\"\")}</div>`;\r\n })\r\n .join(\"\")}</div>`;\r\n const innerTrim = inner.replace(/>\\s+</g, \"><\").trim();\r\n /** Keep the row shell in HTML even when all columns/blocks are empty (email clients may still show padding/bg). */\r\n const body = innerTrim || \" \";\r\n return `<div class=\"email-row-shell\" style=\"padding:${row.padding}px;width:100%;max-width:100%;box-sizing:border-box;${shellBg}\">${body}</div>`;\r\n}\r\n\r\n/** Options passed to {@link designToHtml} and {@link jsonToHtml} (from `emailDesignJson`). */\r\nexport type EmailHtmlOptions = {\r\n /** Injected as a `<style>` block in the document `<head>`. */\r\n customCSS?: string;\r\n};\r\n\r\n/**\r\n * Full email HTML document: outer shell uses tables for width/centering; each layout row uses flex for columns.\r\n * {@code opts.customCSS} injects a {@code <style>} block in the head.\r\n */\r\n/** Injected so narrow viewports stack columns, shrink tables, and avoid horizontal scroll. */\r\nconst RESPONSIVE_EMAIL_CSS = `<style>\r\nhtml{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}\r\nbody{margin:0!important;padding:0;overflow-x:hidden;word-break:break-word;overflow-wrap:anywhere;-webkit-font-smoothing:antialiased;}\r\nimg,video,iframe{max-width:100%!important;height:auto!important;}\r\ntable{max-width:100%!important;}\r\ntable[role=\"presentation\"]{width:100%!important;}\r\ntable.email-shell-table{table-layout:fixed!important;}\r\ntable[role=\"presentation\"] td{min-width:0!important;word-break:break-word;}\r\n.email-row-shell{width:100%!important;max-width:100%!important;box-sizing:border-box!important;}\r\n@media screen and (max-width:600px){\r\n .email-row-flex{flex-wrap:wrap!important;align-items:stretch!important;}\r\n .email-row-flex>div{flex:1 1 100%!important;max-width:100%!important;min-width:0!important;width:100%!important;}\r\n .email-content-td{padding-left:max(12px,env(safe-area-inset-left))!important;padding-right:max(12px,env(safe-area-inset-right))!important;}\r\n .email-btn-cta{max-width:100%!important;box-sizing:border-box!important;}\r\n .email-nav-menu{display:flex!important;flex-direction:column!important;align-items:stretch!important;gap:10px!important;}\r\n .email-nav-menu a{display:block!important;margin:0!important;padding:6px 0!important;}\r\n .email-social-row a,.email-social-row span{margin:6px!important;}\r\n .email-timer-wrap table{display:block!important;width:100%!important;max-width:100%!important;}\r\n .email-timer-wrap tr{display:flex!important;flex-wrap:wrap!important;justify-content:center!important;gap:6px!important;}\r\n .email-timer-wrap td{display:inline-block!important;flex:0 0 auto!important;min-width:0!important;}\r\n}\r\n@media screen and (max-width:480px){\r\n .email-content-td{padding-left:max(10px,env(safe-area-inset-left))!important;padding-right:max(10px,env(safe-area-inset-right))!important;}\r\n}\r\n${RICH_HTML_CONTENT_CSS}\r\n</style>`;\r\n\r\n/**\r\n * Adjust email HTML for a preview iframe with a known CSS width so layout viewport\r\n * matches the iframe (fixes mobile/tablet where `width=device-width` stays too wide).\r\n */\r\nexport function previewEmailSrcDoc(html: string, viewportWidthPx: number): string {\r\n const viewportTag = `<meta name=\"viewport\" content=\"width=${viewportWidthPx},initial-scale=1\"/>`;\r\n let out = /<meta[^>]*\\bname\\s*=\\s*[\"']viewport[\"'][^>]*>/i.test(html)\r\n ? html.replace(/<meta[^>]*\\bname\\s*=\\s*[\"']viewport[\"'][^>]*>/i, viewportTag)\r\n : html.replace(/<head[^>]*>/i, (open) => `${open}${viewportTag}`);\r\n\r\n const previewFix = `<style data-email-preview-iframe=\"1\">\r\nhtml,body{overflow-x:hidden!important;max-width:100%!important;}\r\nhtml{height:100%;overflow-y:auto;-webkit-overflow-scrolling:touch;}\r\nbody{min-height:100%;overflow-y:auto!important;-webkit-overflow-scrolling:touch;}\r\ntable.email-shell-table{overflow:visible!important;}\r\n</style>`;\r\n if (/<\\/head>/i.test(out)) {\r\n out = out.replace(/<\\/head>/i, `${previewFix}</head>`);\r\n }\r\n return out;\r\n}\r\n\r\nexport function designToHtml(rows: any, settings: any, opts: EmailHtmlOptions = {}) {\r\n const css = opts.customCSS ? `<style>${opts.customCSS}</style>` : \"\";\r\n const cw = settings.contentWidth || 600;\r\n const contentBg = settings.contentBg || \"#fff\";\r\n const bgImgRaw =\r\n typeof settings.contentBgImage === \"string\" ? String(settings.contentBgImage).trim() : \"\";\r\n const contentShellStyle = [\r\n \"width:100%\",\r\n `max-width:${cw}px`,\r\n `background-color:${contentBg}`,\r\n `border-radius:${settings.borderRadius || 8}px`,\r\n \"overflow:hidden\",\r\n \"box-sizing:border-box\",\r\n ];\r\n if (bgImgRaw) {\r\n const u = bgImgRaw.replace(/'/g, \"%27\");\r\n const sz = typeof settings.contentBgSize === \"string\" && settings.contentBgSize.trim() ? settings.contentBgSize.trim() : \"cover\";\r\n const rep =\r\n typeof settings.contentBgRepeat === \"string\" && settings.contentBgRepeat.trim()\r\n ? settings.contentBgRepeat.trim()\r\n : \"no-repeat\";\r\n contentShellStyle.push(`background-image:url('${u}')`);\r\n contentShellStyle.push(`background-size:${sz}`);\r\n contentShellStyle.push(`background-position:${typeof settings.contentBgPosition === \"string\" && settings.contentBgPosition.trim() ? settings.contentBgPosition.trim() : \"center\"}`);\r\n contentShellStyle.push(`background-repeat:${rep}`);\r\n }\r\n\r\n const pagePos = typeof settings.bgPosition === \"string\" && settings.bgPosition.trim() ? settings.bgPosition.trim() : \"center\";\r\n const pageGrad = settings.bgGradient && typeof settings.bgGradient === \"object\" ? settings.bgGradient : null;\r\n const pageGradCss = (() => {\r\n if (!pageGrad || typeof pageGrad !== \"object\") return \"\";\r\n if (!Array.isArray((pageGrad as any).colors) || !Array.isArray((pageGrad as any).stops)) return \"\";\r\n const colors = (pageGrad as any).colors as any[];\r\n const stops = (pageGrad as any).stops as any[];\r\n if (colors.length < 2 || stops.length !== colors.length) return \"\";\r\n const angle = typeof (pageGrad as any).angle === \"number\" ? (pageGrad as any).angle : 135;\r\n const pairs = colors\r\n .map((c, i) => [String(c || \"\").trim(), Number(stops[i])] as const)\r\n .filter(([c, s]) => c && Number.isFinite(s))\r\n .map(([c, s]) => `${c} ${Math.max(0, Math.min(100, s))}%`);\r\n if (pairs.length < 2) return \"\";\r\n return `background-image:linear-gradient(${angle}deg, ${pairs.join(\", \")});background-repeat:no-repeat;background-position:${pagePos};background-size:cover;`;\r\n })();\r\n const pageBgImgRaw = typeof settings.bgImage === \"string\" ? String(settings.bgImage).trim() : \"\";\r\n const pageBgColorRaw = typeof settings.bgColor === \"string\" ? String(settings.bgColor).trim() : \"\";\r\n const pageBgColor = pageBgColorRaw ? pageBgColorRaw : \"transparent\";\r\n const pageBgImgCss =\r\n !pageGradCss && pageBgImgRaw\r\n ? `background-image:url('${pageBgImgRaw.replace(/'/g, \"%27\")}');background-size:${settings.bgSize||\"cover\"};background-repeat:${settings.bgRepeat||\"no-repeat\"};background-position:${pagePos};`\r\n : \"\";\r\n const contentPos =\r\n typeof settings.contentBgPosition === \"string\" && settings.contentBgPosition.trim()\r\n ? settings.contentBgPosition.trim()\r\n : \"center\";\r\n const contentGrad = settings.contentBgGradient && typeof settings.contentBgGradient === \"object\" ? settings.contentBgGradient : null;\r\n const contentGradCss = (() => {\r\n if (!contentGrad || typeof contentGrad !== \"object\") return \"\";\r\n if (!Array.isArray((contentGrad as any).colors) || !Array.isArray((contentGrad as any).stops)) return \"\";\r\n const colors = (contentGrad as any).colors as any[];\r\n const stops = (contentGrad as any).stops as any[];\r\n if (colors.length < 2 || stops.length !== colors.length) return \"\";\r\n const angle = typeof (contentGrad as any).angle === \"number\" ? (contentGrad as any).angle : 135;\r\n const pairs = colors\r\n .map((c, i) => [String(c || \"\").trim(), Number(stops[i])] as const)\r\n .filter(([c, s]) => c && Number.isFinite(s))\r\n .map(([c, s]) => `${c} ${Math.max(0, Math.min(100, s))}%`);\r\n if (pairs.length < 2) return \"\";\r\n return `background-image:linear-gradient(${angle}deg, ${pairs.join(\", \")});background-repeat:no-repeat;background-position:${contentPos};background-size:cover;`;\r\n })();\r\n\r\n if (contentGradCss) {\r\n contentShellStyle.push(contentGradCss);\r\n }\r\n\r\n return `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head><meta charset=\"UTF-8\"/><meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\"/>\r\n<title>Email</title>${RESPONSIVE_EMAIL_CSS}${css}\r\n</head>\r\n<body style=\"margin:0;padding:0;background:${pageBgColor};${pageGradCss||pageBgImgCss}\">\r\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"width:100%;max-width:100%;background-color:${pageBgColor};${pageGradCss||pageBgImgCss}\">\r\n<tr><td align=\"center\" style=\"padding:0;max-width:100%;\">\r\n<table class=\"email-shell-table\" role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\"\r\n style=\"${contentShellStyle.join(\";\")}\">\r\n<tr><td class=\"email-content-td\" style=\"${[\r\n `padding:${settings.padding || 24}px`,\r\n settings.pageFontFamily && `font-family:${settings.pageFontFamily}`,\r\n settings.pageTextColor && `color:${settings.pageTextColor}`,\r\n settings.pageFontSize && `font-size:${settings.pageFontSize}`,\r\n settings.pageFontWeight && `font-weight:${settings.pageFontWeight}`,\r\n settings.pageLineHeight && `line-height:${settings.pageLineHeight}`,\r\n ]\r\n .filter(Boolean)\r\n .join(\";\")}\">${rows.map(rowToHtml).filter(Boolean).join(\"\\n\")}</td></tr>\r\n</table></td></tr></table>\r\n</body></html>`;\r\n}\r\n","import { uid } from \"../lib/factories\";\r\n\r\nexport type Padding = {\r\n top?: number;\r\n right?: number;\r\n bottom?: number;\r\n left?: number;\r\n};\r\n\r\nexport type EmailDocumentSettings = {\r\n width?: number;\r\n backgroundColor?: string;\r\n backgroundImage?: string;\r\n backgroundRepeat?: string;\r\n backgroundSize?: string;\r\n backgroundPosition?: string;\r\n /** 3-stop linear gradient (editor-specific extension). */\r\n backgroundGradient?: {\r\n angle?: number;\r\n colors?: [string, string, string];\r\n stops?: [number, number, number];\r\n };\r\n contentBackgroundColor?: string;\r\n contentBackgroundImage?: string;\r\n contentBackgroundRepeat?: string;\r\n contentBackgroundSize?: string;\r\n contentBackgroundPosition?: string;\r\n /** 3-stop linear gradient (editor-specific extension). */\r\n contentBackgroundGradient?: {\r\n angle?: number;\r\n colors?: [string, string, string];\r\n stops?: [number, number, number];\r\n };\r\n fontFamily?: string;\r\n lineHeightBase?: number;\r\n color?: string;\r\n responsive?: boolean;\r\n rtl?: boolean;\r\n /** Content card inner padding (editor `settings.padding`). */\r\n contentPadding?: number;\r\n /** Content card corner radius (editor `settings.borderRadius`). */\r\n contentBorderRadius?: number;\r\n /** Studio snapshot for round-trip with the visual editor (settings + editor chrome). */\r\n _reactEmailStudio?: {\r\n contentPadding?: number;\r\n contentBorderRadius?: number;\r\n editorSettings?: Record<string, unknown>;\r\n };\r\n};\r\n\r\nexport type RowLayout = {\r\n columns?: number;\r\n gap?: number;\r\n stackOnMobile?: boolean;\r\n align?: \"left\" | \"center\" | \"right\";\r\n /** Editor layout preset key (e.g. `layout2`, `custom`) — optional on `email_document` rows. */\r\n preset?: string;\r\n /** Column width ratios; length should match `columns`. */\r\n ratios?: number[];\r\n};\r\n\r\n/** Row shell on `email_document` (editor field names). */\r\nexport type RowProps = {\r\n bgColor?: string;\r\n bgImage?: string;\r\n bgRepeat?: string;\r\n bgSize?: string;\r\n bgPosition?: string;\r\n bgGradient?: {\r\n angle?: number;\r\n colors?: [string, string, string];\r\n stops?: [number, number, number];\r\n } | null;\r\n padding?: Padding;\r\n borderRadius?: number;\r\n borderWidth?: number;\r\n borderColor?: string;\r\n textAlign?: \"left\" | \"center\" | \"right\" | \"justify\";\r\n};\r\n\r\n/** Legacy row shell (`backgroundColor`, …) — import only. */\r\nexport type RowStyles = {\r\n backgroundColor?: string;\r\n backgroundImage?: string;\r\n backgroundRepeat?: string;\r\n backgroundSize?: string;\r\n backgroundPosition?: string;\r\n backgroundGradient?: RowProps[\"bgGradient\"];\r\n padding?: Padding;\r\n borderRadius?: number;\r\n borderWidth?: number;\r\n borderColor?: string;\r\n textAlign?: \"left\" | \"center\" | \"right\" | \"justify\";\r\n};\r\n\r\nexport type ColumnLayout = {\r\n width?: string;\r\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\r\n mobileWidth?: string;\r\n};\r\n\r\nexport type ColumnBorderRadius =\r\n | number\r\n | {\r\n tl?: number;\r\n tr?: number;\r\n br?: number;\r\n bl?: number;\r\n };\r\n\r\n/** Column shell on `email_document` (editor field names). */\r\nexport type ColumnProps = {\r\n padding?: Padding;\r\n bgColor?: string;\r\n bgImage?: string;\r\n bgRepeat?: string;\r\n bgSize?: string;\r\n bgPosition?: string;\r\n bgGradient?: RowProps[\"bgGradient\"];\r\n borderRadius?: ColumnBorderRadius;\r\n};\r\n\r\n/** Legacy column shell — import only. */\r\nexport type ColumnStyles = {\r\n padding?: Padding;\r\n backgroundColor?: string;\r\n backgroundImage?: string;\r\n backgroundRepeat?: string;\r\n backgroundSize?: string;\r\n backgroundPosition?: string;\r\n backgroundGradient?: RowProps[\"bgGradient\"];\r\n borderRadius?: ColumnBorderRadius;\r\n};\r\n\r\nexport type BlockBase = {\r\n id?: string;\r\n type: string;\r\n /** Payload: object for most blocks; plain HTML string for `type: \"html\"`. */\r\n content?: Record<string, unknown> | string;\r\n /** Full editor block props (export + preferred import). */\r\n props?: Record<string, unknown>;\r\n /** Legacy block styling — import only when `props` is absent. */\r\n styles?: Record<string, unknown>;\r\n behavior?: Record<string, unknown>;\r\n responsive?: Record<string, unknown>;\r\n};\r\n\r\nexport type EmailDocumentColumn = {\r\n id?: string;\r\n layout?: ColumnLayout;\r\n /** Column surface (padding, backgrounds, radius). */\r\n props?: ColumnProps;\r\n /** Legacy column shell — import only. */\r\n styles?: ColumnStyles;\r\n blocks?: BlockBase[];\r\n};\r\n\r\nexport type EmailDocumentRow = {\r\n id?: string;\r\n type?: \"row\";\r\n layout?: RowLayout;\r\n /** Row shell (padding, backgrounds). */\r\n props?: RowProps;\r\n /** Legacy row shell — import only. */\r\n styles?: RowStyles;\r\n columns?: EmailDocumentColumn[];\r\n /** Editor row snapshot (`preset`, `ratios`, column props, …) for round-trip. */\r\n _reactEmailStudio?: {\r\n row?: Record<string, unknown>;\r\n };\r\n};\r\n\r\nexport type EmailDocument = {\r\n type: \"email_document\";\r\n settings?: EmailDocumentSettings;\r\n /** Flat root blocks (optional interchange; `rows` is the primary LMS/export shape). */\r\n blocks?: BlockBase[];\r\n /** Layout rows with `columns[].blocks[]` (primary import/export shape). */\r\n rows?: EmailDocumentRow[];\r\n globalStyles?: Record<string, unknown>;\r\n responsive?: Record<string, unknown>;\r\n};\r\n\r\nexport function normalizePadding(p?: unknown): Required<Padding> | undefined {\r\n if (!p || typeof p !== \"object\" || Array.isArray(p)) return undefined;\r\n const o = p as Padding;\r\n const top = typeof o.top === \"number\" ? o.top : 0;\r\n const right = typeof o.right === \"number\" ? o.right : top;\r\n const bottom = typeof o.bottom === \"number\" ? o.bottom : top;\r\n const left = typeof o.left === \"number\" ? o.left : right;\r\n return { top, right, bottom, left };\r\n}\r\n\r\nexport function paddingToUniform(p?: Padding, fallback = 0): number {\r\n const n = normalizePadding(p);\r\n if (!n) return fallback;\r\n return Math.round((n.top + n.right + n.bottom + n.left) / 4);\r\n}\r\n\r\nexport function ensureId(id: unknown, prefix: string): string {\r\n return typeof id === \"string\" && id.trim() ? id : `${prefix}_${uid()}`;\r\n}\r\n\r\nfunction normalizeDocBlock(b: unknown, prefix: string): BlockBase {\r\n const raw = b && typeof b === \"object\" && !Array.isArray(b) ? (b as BlockBase) : ({} as BlockBase);\r\n const base: BlockBase = {\r\n id: ensureId(raw.id, prefix),\r\n type: typeof raw.type === \"string\" ? raw.type : \"text\",\r\n content:\r\n typeof raw.content === \"string\"\r\n ? raw.content\r\n : raw.content && typeof raw.content === \"object\" && !Array.isArray(raw.content)\r\n ? raw.content\r\n : {},\r\n ...(raw.behavior && typeof raw.behavior === \"object\" && !Array.isArray(raw.behavior)\r\n ? { behavior: raw.behavior }\r\n : {}),\r\n ...(raw.responsive && typeof raw.responsive === \"object\" && !Array.isArray(raw.responsive)\r\n ? { responsive: raw.responsive }\r\n : {}),\r\n };\r\n if (raw.props && typeof raw.props === \"object\" && !Array.isArray(raw.props)) {\r\n base.props = { ...raw.props };\r\n } else if (raw.styles && typeof raw.styles === \"object\" && !Array.isArray(raw.styles)) {\r\n base.styles = { ...raw.styles };\r\n }\r\n return base;\r\n}\r\n\r\nfunction normalizeDocSettings(settings: unknown): EmailDocumentSettings {\r\n if (!settings || typeof settings !== \"object\" || Array.isArray(settings)) return {};\r\n const s = { ...(settings as EmailDocumentSettings) };\r\n delete (s as { _reactEmailStudio?: unknown })._reactEmailStudio;\r\n return s;\r\n}\r\n\r\nexport function normalizeEmailDocument(input: unknown): EmailDocument | null {\r\n if (input == null || typeof input !== \"object\" || Array.isArray(input)) return null;\r\n const doc = input as Partial<EmailDocument>;\r\n if (doc.type !== \"email_document\") return null;\r\n\r\n const rawBlocks = Array.isArray(doc.blocks) ? doc.blocks : [];\r\n const useBlocks = rawBlocks.length > 0;\r\n const rows = Array.isArray(doc.rows) ? doc.rows : [];\r\n\r\n const base: EmailDocument = {\r\n type: \"email_document\",\r\n settings: normalizeDocSettings(doc.settings),\r\n globalStyles:\r\n doc.globalStyles && typeof doc.globalStyles === \"object\" && !Array.isArray(doc.globalStyles)\r\n ? doc.globalStyles\r\n : undefined,\r\n responsive:\r\n doc.responsive && typeof doc.responsive === \"object\" && !Array.isArray(doc.responsive)\r\n ? doc.responsive\r\n : undefined,\r\n };\r\n\r\n if (useBlocks) {\r\n return {\r\n ...base,\r\n blocks: rawBlocks.map((b, bi) => normalizeDocBlock(b, `block${bi + 1}`)),\r\n };\r\n }\r\n\r\n return {\r\n ...base,\r\n rows: rows.map((r, ri) => {\r\n const columns = Array.isArray(r.columns) ? r.columns : [];\r\n const layoutColCount =\r\n typeof r.layout?.columns === \"number\" && r.layout.columns > 0\r\n ? Math.floor(r.layout.columns)\r\n : 0;\r\n const colCount = Math.max(1, columns.length, layoutColCount);\r\n const colsNormalized: EmailDocumentColumn[] = (() => {\r\n if (columns.length >= colCount) return columns;\r\n if (columns.length > 0) {\r\n return [\r\n ...columns,\r\n ...Array.from({ length: colCount - columns.length }).map(() => ({} as EmailDocumentColumn)),\r\n ];\r\n }\r\n return Array.from({ length: colCount }).map(() => ({} as EmailDocumentColumn));\r\n })();\r\n\r\n return {\r\n id: ensureId(r.id, `row${ri + 1}`),\r\n type: \"row\",\r\n layout: {\r\n columns: colCount,\r\n gap: typeof r.layout?.gap === \"number\" ? r.layout.gap : 0,\r\n stackOnMobile: r.layout?.stackOnMobile !== false,\r\n align: (r.layout?.align as any) || \"center\",\r\n ...(typeof r.layout?.preset === \"string\" && r.layout.preset.trim()\r\n ? { preset: r.layout.preset.trim() }\r\n : {}),\r\n ...(Array.isArray(r.layout?.ratios) && r.layout.ratios.length\r\n ? {\r\n ratios: r.layout.ratios.filter(\r\n (x) => typeof x === \"number\" && Number.isFinite(x),\r\n ) as number[],\r\n }\r\n : {}),\r\n },\r\n props: (() => {\r\n const p = r.props;\r\n if (p && typeof p === \"object\" && !Array.isArray(p)) return { ...p };\r\n const s = r.styles;\r\n if (s && typeof s === \"object\" && !Array.isArray(s)) {\r\n return {\r\n bgColor: typeof s.backgroundColor === \"string\" ? s.backgroundColor : \"\",\r\n bgImage: typeof s.backgroundImage === \"string\" ? s.backgroundImage : \"\",\r\n bgRepeat: s.backgroundRepeat || \"no-repeat\",\r\n bgSize: s.backgroundSize || \"cover\",\r\n bgPosition: s.backgroundPosition || \"center\",\r\n bgGradient: s.backgroundGradient ?? null,\r\n padding: s.padding,\r\n borderRadius: s.borderRadius,\r\n borderWidth: s.borderWidth,\r\n borderColor: s.borderColor,\r\n textAlign: s.textAlign,\r\n };\r\n }\r\n return {};\r\n })(),\r\n columns: colsNormalized.map((c, ci) => ({\r\n id: ensureId(c.id, `col${ri + 1}_${ci + 1}`),\r\n layout: (c.layout && typeof c.layout === \"object\" && !Array.isArray(c.layout)) ? c.layout : {},\r\n ...((): { props?: ColumnProps } => {\r\n const p = c.props;\r\n if (p && typeof p === \"object\" && !Array.isArray(p)) return { props: { ...p } };\r\n const s = c.styles;\r\n if (s && typeof s === \"object\" && !Array.isArray(s)) {\r\n return {\r\n props: {\r\n bgColor: typeof s.backgroundColor === \"string\" ? s.backgroundColor : \"\",\r\n bgImage: typeof s.backgroundImage === \"string\" ? s.backgroundImage : \"\",\r\n bgRepeat: s.backgroundRepeat || \"no-repeat\",\r\n bgSize: s.backgroundSize || \"cover\",\r\n bgPosition: s.backgroundPosition || \"center\",\r\n bgGradient: s.backgroundGradient ?? null,\r\n padding: s.padding,\r\n borderRadius: s.borderRadius,\r\n },\r\n };\r\n }\r\n return {};\r\n })(),\r\n blocks: Array.isArray(c.blocks)\r\n ? c.blocks.map((b, bi) => {\r\n const base: BlockBase = {\r\n id: ensureId(b?.id, `b${ri + 1}_${ci + 1}_${bi + 1}`),\r\n type: typeof b?.type === \"string\" ? b.type : \"text\",\r\n content:\r\n typeof b?.content === \"string\"\r\n ? b.content\r\n : b?.content && typeof b.content === \"object\" && !Array.isArray(b.content)\r\n ? b.content\r\n : {},\r\n ...(b?.behavior && typeof b.behavior === \"object\" && !Array.isArray(b.behavior)\r\n ? { behavior: b.behavior }\r\n : {}),\r\n ...(b?.responsive && typeof b.responsive === \"object\" && !Array.isArray(b.responsive)\r\n ? { responsive: b.responsive }\r\n : {}),\r\n };\r\n if (b?.props && typeof b.props === \"object\" && !Array.isArray(b.props)) {\r\n base.props = { ...b.props };\r\n } else if (b?.styles && typeof b.styles === \"object\" && !Array.isArray(b.styles)) {\r\n base.styles = { ...b.styles };\r\n }\r\n return base;\r\n })\r\n : [],\r\n })),\r\n };\r\n }),\r\n };\r\n}\r\n\r\n","import { uid, makeLayoutRow, makeContentBlock } from \"./factories\";\r\nimport {\r\n columnsFromLegacyMap,\r\n DEFAULT_COLUMN_PROPS,\r\n getColumns,\r\n type ColumnEntry,\r\n} from \"./columnProps\";\r\nimport { designToHtml, type EmailHtmlOptions } from \"./emailHtml\";\r\nimport { LAYOUT_PRESETS, pickPresetByColCount } from \"../constants\";\r\nimport { DEFAULT_BLOCK_PROPS, isKnownBlockType, type BlockPropKey } from \"../defaultBlockProps\";\r\nimport { normalizeRichHtmlForStorage } from \"./htmlUtils\";\r\nimport {\r\n normalizeEmailDocument,\r\n normalizePadding,\r\n paddingToUniform,\r\n type EmailDocument,\r\n type EmailDocumentSettings,\r\n type EmailDocumentRow,\r\n type EmailDocumentColumn,\r\n type BlockBase,\r\n type RowProps,\r\n type RowStyles,\r\n type ColumnProps,\r\n} from \"../schema/emailDocument\";\r\n\r\n/** Guard pathological or over-deep `layout` trees in JSON (stack safety). */\r\nconst MAX_LAYOUT_TREE_DEPTH = 32;\r\n\r\nfunction cloneJson<T>(v: T): T {\r\n try {\r\n return JSON.parse(JSON.stringify(v)) as T;\r\n } catch {\r\n return v;\r\n }\r\n}\r\n\r\nfunction legacyRowStylesToProps(s: RowStyles | undefined): RowProps {\r\n if (!s || typeof s !== \"object\" || Array.isArray(s)) return {};\r\n return {\r\n bgColor: typeof s.backgroundColor === \"string\" ? s.backgroundColor : \"\",\r\n bgImage: typeof s.backgroundImage === \"string\" ? s.backgroundImage : \"\",\r\n bgRepeat: s.backgroundRepeat || \"no-repeat\",\r\n bgSize: s.backgroundSize || \"cover\",\r\n bgPosition: s.backgroundPosition || \"center\",\r\n bgGradient: s.backgroundGradient ?? null,\r\n padding: s.padding,\r\n borderRadius: s.borderRadius,\r\n borderWidth: s.borderWidth,\r\n borderColor: s.borderColor,\r\n textAlign: s.textAlign,\r\n };\r\n}\r\n\r\nfunction rowPropsFromDocRow(r: EmailDocumentRow): RowProps {\r\n const p = r.props;\r\n if (p && typeof p === \"object\" && !Array.isArray(p)) {\r\n return { ...p };\r\n }\r\n return legacyRowStylesToProps(r.styles);\r\n}\r\n\r\nfunction applyRowPropsToEditorRow(row: Record<string, unknown>, r: EmailDocumentRow) {\r\n const p = rowPropsFromDocRow(r);\r\n if (p.padding !== undefined && p.padding !== null) {\r\n row.padding = paddingToUniform(p.padding, row.padding as number);\r\n }\r\n if (typeof p.bgColor === \"string\") row.bgColor = p.bgColor.trim();\r\n if (typeof p.bgImage === \"string\") row.bgImage = p.bgImage.trim();\r\n if (typeof p.bgRepeat === \"string\") row.bgRepeat = p.bgRepeat;\r\n if (typeof p.bgSize === \"string\") row.bgSize = p.bgSize;\r\n if (typeof p.bgPosition === \"string\") row.bgPosition = p.bgPosition;\r\n if (p.bgGradient !== undefined) row.bgGradient = p.bgGradient;\r\n}\r\n\r\nfunction editorRowToDocProps(r: Record<string, unknown>): RowProps {\r\n const rowPad =\r\n r.padding && typeof r.padding === \"object\" && !Array.isArray(r.padding)\r\n ? layoutColumnPaddingForDoc(r.padding)\r\n : (() => {\r\n const n = typeof r.padding === \"number\" && Number.isFinite(r.padding) ? r.padding : 0;\r\n return { top: n, right: n, bottom: n, left: n };\r\n })();\r\n return {\r\n bgColor: typeof r.bgColor === \"string\" ? r.bgColor : \"\",\r\n bgImage: typeof r.bgImage === \"string\" ? r.bgImage : \"\",\r\n bgRepeat: (r.bgRepeat as string) || \"no-repeat\",\r\n bgSize: (r.bgSize as string) || \"cover\",\r\n bgPosition: (r.bgPosition as string) || \"center\",\r\n bgGradient: (r.bgGradient as RowProps[\"bgGradient\"]) ?? null,\r\n padding: rowPad,\r\n borderRadius: 0,\r\n borderWidth: 0,\r\n borderColor: \"#e5e7eb\",\r\n textAlign: \"left\",\r\n };\r\n}\r\n\r\n/** Column padding for exported JSON (same shape as block padding). */\r\nfunction layoutColumnPaddingForDoc(p: unknown): { top: number; right: number; bottom: number; left: number } {\r\n if (typeof p === \"number\" && Number.isFinite(p)) {\r\n const n = Math.max(0, p);\r\n return { top: n, right: n, bottom: n, left: n };\r\n }\r\n return normalizePadding(p as any) ?? { top: 0, right: 0, bottom: 0, left: 0 };\r\n}\r\n\r\n/** Column border radius for exported JSON (scalar or per-corner). */\r\nfunction layoutColumnBorderRadiusForDoc(r: unknown): number | { tl: number; tr: number; br: number; bl: number } {\r\n if (typeof r === \"number\" && Number.isFinite(r)) return Math.max(0, r);\r\n if (r && typeof r === \"object\" && !Array.isArray(r)) {\r\n const o = r as Record<string, number>;\r\n const tl = typeof o.tl === \"number\" && Number.isFinite(o.tl) ? Math.max(0, o.tl) : 0;\r\n const tr = typeof o.tr === \"number\" && Number.isFinite(o.tr) ? Math.max(0, o.tr) : tl;\r\n const br = typeof o.br === \"number\" && Number.isFinite(o.br) ? Math.max(0, o.br) : tl;\r\n const bl = typeof o.bl === \"number\" && Number.isFinite(o.bl) ? Math.max(0, o.bl) : tr;\r\n return { tl, tr, br, bl };\r\n }\r\n return 0;\r\n}\r\n\r\nfunction normalizeLayoutContainerProps(props: Record<string, unknown>) {\r\n const columns = getColumns(props as Parameters<typeof getColumns>[0]);\r\n const { columnStyles: _drop, ...rest } = props;\r\n return { ...rest, columns };\r\n}\r\n\r\nfunction cloneColumns(cols: ColumnEntry[]): ColumnEntry[] {\r\n try {\r\n return JSON.parse(JSON.stringify(cols)) as ColumnEntry[];\r\n } catch {\r\n return cols;\r\n }\r\n}\r\n\r\nfunction mergeLayoutColumns(fromContent: unknown, fromHydrated: unknown): ColumnEntry[] | undefined {\r\n const norm = (x: unknown): ColumnEntry[] => {\r\n if (Array.isArray(x)) {\r\n return x.map((entry) => {\r\n const e = entry as { props?: Record<string, unknown> };\r\n const raw = e?.props && typeof e.props === \"object\" ? e.props : (entry as Record<string, unknown>);\r\n return { props: { ...DEFAULT_COLUMN_PROPS, ...raw } as ColumnEntry[\"props\"] };\r\n });\r\n }\r\n if (x && typeof x === \"object\" && !Array.isArray(x)) {\r\n return columnsFromLegacyMap(x, Object.keys(x as object).length);\r\n }\r\n return [];\r\n };\r\n const a = norm(fromContent);\r\n const b = norm(fromHydrated);\r\n const len = Math.max(a.length, b.length, 1);\r\n const out: ColumnEntry[] = [];\r\n for (let i = 0; i < len; i++) {\r\n out.push({\r\n props: { ...DEFAULT_COLUMN_PROPS, ...(a[i]?.props ?? {}), ...(b[i]?.props ?? {}) },\r\n });\r\n }\r\n return out.length ? out : undefined;\r\n}\r\n\r\nfunction columnPropsFromDocColumn(c: EmailDocumentColumn | undefined) {\r\n const p = c?.props;\r\n if (p && typeof p === \"object\" && !Array.isArray(p)) {\r\n return { ...DEFAULT_COLUMN_PROPS, ...p } as ColumnEntry[\"props\"];\r\n }\r\n const s = c?.styles;\r\n if (!s || typeof s !== \"object\" || Array.isArray(s)) {\r\n return { ...DEFAULT_COLUMN_PROPS };\r\n }\r\n const padding = layoutColumnPaddingForDoc(s.padding);\r\n const borderRadius = layoutColumnBorderRadiusForDoc(s.borderRadius);\r\n return {\r\n ...DEFAULT_COLUMN_PROPS,\r\n bgColor: typeof s.backgroundColor === \"string\" ? s.backgroundColor : \"\",\r\n bgImage: typeof (s as { backgroundImage?: string }).backgroundImage === \"string\"\r\n ? String((s as { backgroundImage?: string }).backgroundImage).trim()\r\n : \"\",\r\n bgRepeat: (s as { backgroundRepeat?: string }).backgroundRepeat || \"no-repeat\",\r\n bgSize: (s as { backgroundSize?: string }).backgroundSize || \"cover\",\r\n bgPosition: (s as { backgroundPosition?: string }).backgroundPosition || \"center\",\r\n bgGradient: (s as { backgroundGradient?: unknown }).backgroundGradient ?? null,\r\n padding,\r\n borderRadius,\r\n } as ColumnEntry[\"props\"];\r\n}\r\n\r\nfunction asNum(v: unknown): number | undefined {\r\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\r\n}\r\n\r\nfunction asStr(v: unknown): string | undefined {\r\n return typeof v === \"string\" ? v : undefined;\r\n}\r\n\r\nfunction numOr(v: unknown, fb: number) {\r\n return typeof v === \"number\" && Number.isFinite(v) ? v : fb;\r\n}\r\n\r\n/** Uniform fallback from default padding (number or box). */\r\nfunction uniformPadDefault(defPad: unknown): number {\r\n if (typeof defPad === \"number\" && Number.isFinite(defPad)) return Math.max(0, defPad);\r\n if (defPad && typeof defPad === \"object\" && !Array.isArray(defPad)) {\r\n return Math.max(0, numOr((defPad as { top?: number }).top, 0));\r\n }\r\n return 0;\r\n}\r\n\r\nfunction boxPad(v: unknown, uniformFallback: number) {\r\n if (typeof v === \"number\" && Number.isFinite(v)) {\r\n const n = Math.max(0, v);\r\n return { top: n, right: n, bottom: n, left: n };\r\n }\r\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\r\n const o = v as Record<string, unknown>;\r\n const t = numOr(o.top, uniformFallback);\r\n const r = numOr(o.right, t);\r\n const b = numOr(o.bottom, t);\r\n const l = numOr(o.left, r);\r\n return { top: t, right: r, bottom: b, left: l };\r\n }\r\n return { top: uniformFallback, right: uniformFallback, bottom: uniformFallback, left: uniformFallback };\r\n}\r\n\r\nfunction boxMargin(v: unknown) {\r\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\r\n const o = v as Record<string, unknown>;\r\n const t = numOr(o.top, 0);\r\n const r = numOr(o.right, t);\r\n const b = numOr(o.bottom, t);\r\n const l = numOr(o.left, r);\r\n return { top: t, right: r, bottom: b, left: l };\r\n }\r\n return { top: 0, right: 0, bottom: 0, left: 0 };\r\n}\r\n\r\n/** Coerce legacy numeric padding + ensure margin object for all content blocks (not nested `layout`). */\r\nfunction normalizeBoxStyles(props: any, t: BlockPropKey) {\r\n if (t === \"layout\") return;\r\n const def = DEFAULT_BLOCK_PROPS[t] as any;\r\n props.margin = boxMargin(props.margin ?? def?.margin);\r\n\r\n if (t === \"table\") {\r\n const defPad = uniformPadDefault(def?.padding);\r\n const defCellRaw = (def as { cellPadding?: unknown })?.cellPadding;\r\n const defCellUniform =\r\n typeof defCellRaw === \"number\" && Number.isFinite(defCellRaw)\r\n ? defCellRaw\r\n : uniformPadDefault(defCellRaw ?? 10);\r\n props.cellPadding = boxPad(props.cellPadding, defCellUniform);\r\n props.padding = boxPad(props.padding, defPad);\r\n return;\r\n }\r\n\r\n props.padding = boxPad(props.padding, uniformPadDefault(def?.padding));\r\n}\r\n\r\n/** Editor block → `email_document` block (matches fields read by {@link mapBlockToInternal}). */\r\nfunction internalBlockToEmailDoc(b: any, depth = 0): BlockBase {\r\n const p = b?.props && typeof b.props === \"object\" ? b.props : {};\r\n const id = typeof b?.id === \"string\" ? b.id : uid();\r\n const type = b?.type === \"nestedRow\" ? \"layout\" : b?.type;\r\n if (!isKnownBlockType(type)) {\r\n return { id, type: String(type || \"text\"), content: {}, styles: {} };\r\n }\r\n\r\n switch (type) {\r\n case \"heading\": {\r\n const fw =\r\n typeof p.fontWeight === \"number\"\r\n ? p.fontWeight\r\n : typeof p.fontWeight === \"string\"\r\n ? Number.parseInt(String(p.fontWeight), 10) || (p.bold ? 700 : 400)\r\n : p.bold\r\n ? 700\r\n : 400;\r\n const padUniform =\r\n typeof p.padding === \"number\" && Number.isFinite(p.padding)\r\n ? p.padding\r\n : uniformPadDefault(p.padding);\r\n return {\r\n id,\r\n type,\r\n content: { text: typeof p.content === \"string\" ? p.content : \"\", tag: p.level || \"h2\" },\r\n styles: {\r\n fontSize: p.fontSize,\r\n fontWeight: fw,\r\n color: p.color,\r\n lineHeight: p.lineHeight,\r\n textAlign: p.align,\r\n letterSpacing: p.letterSpacing,\r\n marginBottom: padUniform,\r\n },\r\n };\r\n }\r\n case \"text\":\r\n return {\r\n id,\r\n type,\r\n content: { html: typeof p.content === \"string\" ? p.content : \"\" },\r\n styles: {\r\n fontSize: p.fontSize,\r\n color: p.color,\r\n lineHeight: p.lineHeight,\r\n textAlign: p.align,\r\n ...(p.padding && typeof p.padding === \"object\" && !Array.isArray(p.padding)\r\n ? { padding: layoutColumnPaddingForDoc(p.padding) }\r\n : {}),\r\n },\r\n };\r\n case \"html\": {\r\n const body =\r\n typeof b.content === \"string\"\r\n ? b.content\r\n : typeof p.content === \"string\"\r\n ? p.content\r\n : \"\";\r\n return {\r\n id,\r\n type,\r\n content: { html: normalizeRichHtmlForStorage(body) },\r\n styles:\r\n p.padding && typeof p.padding === \"object\" && !Array.isArray(p.padding)\r\n ? { padding: layoutColumnPaddingForDoc(p.padding) }\r\n : {},\r\n };\r\n }\r\n case \"image\": {\r\n const br = p.borderRadius;\r\n const borderRadius =\r\n typeof br === \"number\" && Number.isFinite(br)\r\n ? br\r\n : br && typeof br === \"object\" && !Array.isArray(br)\r\n ? Math.round(\r\n (numOr((br as { tl?: number }).tl, 0) +\r\n numOr((br as { tr?: number }).tr, numOr((br as { tl?: number }).tl, 0)) +\r\n numOr((br as { br?: number }).br, numOr((br as { tl?: number }).tl, 0)) +\r\n numOr((br as { bl?: number }).bl, numOr((br as { tr?: number }).tr, 0))) /\r\n 4,\r\n )\r\n : 0;\r\n return {\r\n id,\r\n type,\r\n content: {\r\n src: p.src || \"\",\r\n alt: p.alt || \"\",\r\n link: p.link || \"\",\r\n },\r\n styles: {\r\n width: p.width,\r\n align: p.align,\r\n borderRadius,\r\n },\r\n ...(p.linkTarget === \"_blank\" ? { behavior: { openInNewTab: true } } : {}),\r\n };\r\n }\r\n case \"button\": {\r\n let borderRadiusOut: number | undefined;\r\n if (typeof p.borderRadius === \"number\" && Number.isFinite(p.borderRadius)) {\r\n borderRadiusOut = p.borderRadius;\r\n } else if (p.borderRadius && typeof p.borderRadius === \"object\" && !Array.isArray(p.borderRadius)) {\r\n const br = p.borderRadius as Record<string, number>;\r\n const tl = numOr(br.tl, 0);\r\n const tr = numOr(br.tr, tl);\r\n const brc = numOr(br.br, tl);\r\n const bl = numOr(br.bl, tr);\r\n borderRadiusOut =\r\n tl === tr && tr === brc && brc === bl ? tl : Math.round((tl + tr + brc + bl) / 4);\r\n }\r\n return {\r\n id,\r\n type,\r\n content: { text: p.label || \"\", href: p.href || \"#\" },\r\n styles: {\r\n backgroundColor: p.bgColor,\r\n color: p.textColor,\r\n fontSize: p.fontSize,\r\n fontWeight: p.fontWeight,\r\n ...(borderRadiusOut !== undefined ? { borderRadius: borderRadiusOut } : {}),\r\n textAlign: p.align,\r\n padding: {\r\n top: p.paddingV ?? 11,\r\n right: p.paddingH ?? 24,\r\n bottom: p.paddingV ?? 11,\r\n left: p.paddingH ?? 24,\r\n },\r\n },\r\n ...(p.linkTarget === \"_blank\" ? { behavior: { openInNewTab: true } } : {}),\r\n };\r\n }\r\n case \"divider\": {\r\n const padY =\r\n typeof p.padding === \"number\" && Number.isFinite(p.padding)\r\n ? p.padding\r\n : p.padding && typeof p.padding === \"object\" && !Array.isArray(p.padding)\r\n ? numOr((p.padding as { top?: number }).top, 12)\r\n : 12;\r\n return {\r\n id,\r\n type,\r\n content: {},\r\n styles: { color: p.color, thickness: p.thickness, paddingY: padY },\r\n };\r\n }\r\n case \"spacer\":\r\n return { id, type, content: {}, styles: { height: p.height } };\r\n case \"social\": {\r\n const urls = (\r\n p.socialUrls && typeof p.socialUrls === \"object\" && !Array.isArray(p.socialUrls)\r\n ? p.socialUrls\r\n : {}\r\n ) as Record<string, string>;\r\n const networks: Record<string, string> = {};\r\n const ordered =\r\n Array.isArray(p.networks) ? p.networks.filter((n): n is string => typeof n === \"string\" && !!n) : [];\r\n const seen = new Set<string>();\r\n for (const n of ordered) {\r\n const u = urls[n];\r\n networks[n] = typeof u === \"string\" && u.trim() ? u : \"\";\r\n seen.add(n);\r\n }\r\n for (const key of Object.keys(urls)) {\r\n if (seen.has(key)) continue;\r\n const v = urls[key];\r\n if (typeof v === \"string\" && v.trim()) {\r\n networks[key] = v;\r\n seen.add(key);\r\n }\r\n }\r\n const padStyles =\r\n p.padding != null\r\n ? typeof p.padding === \"number\" && Number.isFinite(p.padding)\r\n ? { padding: layoutColumnPaddingForDoc(p.padding) }\r\n : p.padding && typeof p.padding === \"object\" && !Array.isArray(p.padding)\r\n ? { padding: layoutColumnPaddingForDoc(p.padding) }\r\n : {}\r\n : {};\r\n return {\r\n id,\r\n type,\r\n content: { networks },\r\n styles: {\r\n iconSize: p.iconSize,\r\n gap: p.gap,\r\n shape: p.shape,\r\n align: p.align,\r\n ...padStyles,\r\n },\r\n };\r\n }\r\n case \"table\":\r\n return {\r\n id,\r\n type,\r\n content: { data: Array.isArray(p.data) ? p.data : [] },\r\n styles: {\r\n borderColor: p.cellBorder,\r\n cellPadding: p.cellPadding,\r\n headerBg: p.headerBg,\r\n striped: p.striped,\r\n },\r\n };\r\n case \"video\":\r\n return {\r\n id,\r\n type,\r\n content: { url: p.src || \"\" },\r\n styles: { height: p.height },\r\n };\r\n case \"timer\": {\r\n let timerBr: number | undefined;\r\n if (typeof p.borderRadius === \"number\" && Number.isFinite(p.borderRadius)) {\r\n timerBr = p.borderRadius;\r\n } else if (p.borderRadius && typeof p.borderRadius === \"object\" && !Array.isArray(p.borderRadius)) {\r\n const br = p.borderRadius as Record<string, number>;\r\n const tl = numOr(br.tl, 0);\r\n const tr = numOr(br.tr, tl);\r\n const brc = numOr(br.br, tl);\r\n const bl = numOr(br.bl, tr);\r\n timerBr = tl === tr && tr === brc && brc === bl ? tl : Math.round((tl + tr + brc + bl) / 4);\r\n }\r\n return {\r\n id,\r\n type,\r\n content: { endDate: p.endDate || \"\" },\r\n styles: {\r\n backgroundColor: p.bgColor,\r\n color: p.textColor,\r\n padding: typeof p.padding === \"number\" ? p.padding : uniformPadDefault(p.padding),\r\n ...(timerBr !== undefined ? { borderRadius: timerBr } : {}),\r\n textAlign: p.align,\r\n },\r\n };\r\n }\r\n case \"menu\":\r\n return {\r\n id,\r\n type,\r\n content: { items: Array.isArray(p.items) ? p.items : [] },\r\n styles: { fontSize: p.fontSize, color: p.color },\r\n };\r\n case \"link\":\r\n return {\r\n id,\r\n type,\r\n content: { text: p.label || \"\", href: p.href || \"#\" },\r\n styles: { color: p.color, fontSize: p.fontSize, textAlign: p.align },\r\n ...(p.linkTarget === \"_blank\" ? { behavior: { openInNewTab: true } } : {}),\r\n };\r\n case \"layout\": {\r\n const ratios = Array.isArray(p.ratios) ? [...p.ratios] : [1];\r\n const emptyCells = ratios.map(() => [] as BlockBase[]);\r\n const rawCells = Array.isArray(p.cells) ? p.cells : [];\r\n const cellsOut =\r\n depth >= MAX_LAYOUT_TREE_DEPTH\r\n ? emptyCells\r\n : ratios.map((_, i) => {\r\n const col = rawCells[i];\r\n return Array.isArray(col) ? col.map((child) => internalBlockToEmailDoc(child, depth + 1)) : [];\r\n });\r\n return {\r\n id,\r\n type,\r\n content: {\r\n preset: p.preset,\r\n cols: p.cols,\r\n ratios,\r\n gap: p.gap,\r\n padding: p.padding,\r\n bgColor: p.bgColor,\r\n bgImage: p.bgImage,\r\n bgSize: p.bgSize,\r\n bgRepeat: p.bgRepeat,\r\n bgPosition: p.bgPosition,\r\n bgGradient: p.bgGradient ?? null,\r\n columns: getColumns(p).map((col) => ({ props: cloneJson(col.props) })),\r\n cells: cellsOut,\r\n },\r\n styles: {},\r\n };\r\n }\r\n default:\r\n return { id, type, content: {}, styles: {} };\r\n }\r\n}\r\n\r\nfunction mapBlockToInternal(b: BlockBase, layoutDepth = 0) {\r\n const t = b.type;\r\n if (!isKnownBlockType(t)) return null;\r\n const block = makeContentBlock(t);\r\n block.id = typeof b.id === \"string\" ? b.id : uid();\r\n\r\n const c = (b.content || {}) as any;\r\n const s = (b.styles || {}) as any;\r\n const beh = (b.behavior || {}) as any;\r\n\r\n switch (t) {\r\n case \"heading\":\r\n block.props.content = asStr(c.text) ?? block.props.content;\r\n block.props.level = asStr(c.tag) ?? block.props.level;\r\n if (asNum(s.fontSize) != null) block.props.fontSize = s.fontSize;\r\n if (asNum(s.fontWeight) != null) block.props.bold = s.fontWeight >= 600;\r\n if (asStr(s.color)) block.props.color = s.color;\r\n if (asNum(s.lineHeight) != null) block.props.lineHeight = s.lineHeight;\r\n if (asStr(s.textAlign)) block.props.align = s.textAlign;\r\n if (asNum(s.letterSpacing) != null) block.props.letterSpacing = s.letterSpacing;\r\n if (asNum(s.marginBottom) != null) block.props.padding = Math.max(0, Math.round(s.marginBottom));\r\n break;\r\n case \"text\":\r\n block.props.content = asStr(c.html) ?? asStr(c.text) ?? block.props.content;\r\n if (asNum(s.fontSize) != null) block.props.fontSize = s.fontSize;\r\n if (asStr(s.color)) block.props.color = s.color;\r\n if (asNum(s.lineHeight) != null) block.props.lineHeight = s.lineHeight;\r\n if (asStr(s.textAlign)) block.props.align = s.textAlign;\r\n if (s.padding && typeof s.padding === \"object\") {\r\n block.props.padding = paddingToUniform(s.padding as any, block.props.padding);\r\n }\r\n break;\r\n case \"html\": {\r\n const br = b as unknown as { content?: unknown; props?: { content?: unknown } };\r\n const fromDoc = asStr(c.html);\r\n const fromRoot = typeof br.content === \"string\" ? String(br.content) : undefined;\r\n const fromLegacyProps =\r\n br.props && typeof br.props.content === \"string\" ? String(br.props.content) : undefined;\r\n const htmlNorm = normalizeRichHtmlForStorage(fromDoc ?? fromRoot ?? fromLegacyProps ?? \"\");\r\n (block as { content: string }).content = htmlNorm;\r\n (block.props as { content?: string }).content = htmlNorm;\r\n if (s.padding && typeof s.padding === \"object\") {\r\n block.props.padding = paddingToUniform(s.padding as any, block.props.padding);\r\n }\r\n break;\r\n }\r\n case \"image\":\r\n block.props.src = asStr(c.src) ?? block.props.src;\r\n if (asStr(c.alt)) block.props.alt = c.alt;\r\n if (asStr(c.link)) {\r\n block.props.link = c.link;\r\n block.props.linkEnabled = true;\r\n }\r\n if (beh.openInNewTab === true) block.props.linkTarget = \"_blank\";\r\n if (asStr(s.width)) block.props.width = s.width;\r\n if (asStr(s.align)) block.props.align = s.align;\r\n if (asNum(s.borderRadius) != null) block.props.borderRadius = s.borderRadius;\r\n break;\r\n case \"button\":\r\n block.props.label = asStr(c.text) ?? block.props.label;\r\n block.props.href = asStr(c.href) ?? block.props.href;\r\n if (beh.openInNewTab === true) block.props.linkTarget = \"_blank\";\r\n if (asStr(s.backgroundColor)) block.props.bgColor = s.backgroundColor;\r\n if (asStr(s.color)) block.props.textColor = s.color;\r\n if (asNum(s.fontSize) != null) block.props.fontSize = s.fontSize;\r\n if (asNum(s.fontWeight) != null) block.props.fontWeight = s.fontWeight;\r\n if (asNum(s.borderRadius) != null) block.props.borderRadius = s.borderRadius;\r\n if (s.padding && typeof s.padding === \"object\") {\r\n const pad = s.padding as any;\r\n block.props.paddingV = asNum(pad.top) ?? block.props.paddingV;\r\n block.props.paddingH = asNum(pad.right) ?? block.props.paddingH;\r\n }\r\n if (asStr(s.textAlign)) block.props.align = s.textAlign;\r\n break;\r\n case \"divider\":\r\n if (asStr(s.color)) block.props.color = s.color;\r\n if (asNum(s.thickness) != null) block.props.thickness = s.thickness;\r\n if (asNum(s.paddingY) != null) block.props.padding = s.paddingY;\r\n break;\r\n case \"spacer\":\r\n if (asNum(s.height) != null) block.props.height = s.height;\r\n break;\r\n case \"social\": {\r\n const networksRaw = c.networks;\r\n let networksObj: Record<string, string> = {};\r\n\r\n if (Array.isArray(networksRaw)) {\r\n const urlMap =\r\n c.socialUrls && typeof c.socialUrls === \"object\" && !Array.isArray(c.socialUrls)\r\n ? (c.socialUrls as Record<string, unknown>)\r\n : {};\r\n for (const n of networksRaw) {\r\n if (typeof n !== \"string\" || !n) continue;\r\n const u = urlMap[n];\r\n networksObj[n] = typeof u === \"string\" ? u : \"\";\r\n }\r\n for (const key of Object.keys(urlMap)) {\r\n if (key in networksObj) continue;\r\n const u = urlMap[key];\r\n if (typeof u === \"string\" && u.trim()) networksObj[key] = u;\r\n }\r\n } else if (networksRaw && typeof networksRaw === \"object\" && !Array.isArray(networksRaw)) {\r\n networksObj = { ...(networksRaw as Record<string, unknown>) } as Record<string, string>;\r\n for (const k of Object.keys(networksObj)) {\r\n const v = networksObj[k];\r\n networksObj[k] = typeof v === \"string\" ? v : \"\";\r\n }\r\n }\r\n\r\n const keys = Object.keys(networksObj);\r\n if (keys.length) {\r\n block.props.networks = keys;\r\n block.props.socialUrls = networksObj;\r\n }\r\n if (asNum(s.iconSize) != null) block.props.iconSize = s.iconSize;\r\n if (asNum(s.gap) != null) block.props.gap = s.gap;\r\n if (asStr(s.shape)) block.props.shape = s.shape;\r\n if (asStr(s.align)) block.props.align = s.align;\r\n if (s.padding != null) {\r\n if (typeof s.padding === \"number\" && Number.isFinite(s.padding)) {\r\n block.props.padding = s.padding;\r\n } else if (s.padding && typeof s.padding === \"object\" && !Array.isArray(s.padding)) {\r\n block.props.padding = layoutColumnPaddingForDoc(s.padding);\r\n }\r\n }\r\n break;\r\n }\r\n case \"table\":\r\n if (Array.isArray(c.data)) block.props.data = c.data;\r\n if (asStr(s.borderColor)) block.props.cellBorder = s.borderColor;\r\n if (s.cellPadding != null) {\r\n if (typeof s.cellPadding === \"number\" && Number.isFinite(s.cellPadding)) {\r\n block.props.cellPadding = s.cellPadding;\r\n } else if (s.cellPadding && typeof s.cellPadding === \"object\" && !Array.isArray(s.cellPadding)) {\r\n block.props.cellPadding = s.cellPadding as typeof block.props.cellPadding;\r\n }\r\n }\r\n if (asStr(s.headerBg)) block.props.headerBg = s.headerBg;\r\n if (s.striped === true || s.striped === false) block.props.striped = !!s.striped;\r\n break;\r\n case \"video\":\r\n block.props.src = asStr(c.url) ?? block.props.src;\r\n if (asNum(s.height) != null) block.props.height = s.height;\r\n break;\r\n case \"timer\":\r\n block.props.endDate = asStr(c.endDate) ?? block.props.endDate;\r\n if (asStr(s.backgroundColor)) block.props.bgColor = s.backgroundColor;\r\n if (asStr(s.color)) block.props.textColor = s.color;\r\n if (asNum(s.padding) != null) block.props.padding = s.padding;\r\n if (asNum(s.borderRadius) != null) block.props.borderRadius = s.borderRadius;\r\n if (asStr(s.textAlign)) block.props.align = s.textAlign;\r\n break;\r\n case \"menu\":\r\n if (Array.isArray(c.items)) block.props.items = c.items;\r\n if (asNum(s.fontSize) != null) block.props.fontSize = s.fontSize;\r\n if (asStr(s.color)) block.props.color = s.color;\r\n break;\r\n case \"link\":\r\n block.props.label = asStr(c.text) ?? block.props.label;\r\n block.props.href = asStr(c.href) ?? block.props.href;\r\n if (beh.openInNewTab === true) block.props.linkTarget = \"_blank\";\r\n if (asStr(s.color)) block.props.color = s.color;\r\n if (asNum(s.fontSize) != null) block.props.fontSize = s.fontSize;\r\n if (asStr(s.textAlign)) block.props.align = s.textAlign;\r\n break;\r\n case \"layout\": {\r\n if (Array.isArray(c.cells)) {\r\n const d = DEFAULT_BLOCK_PROPS.layout;\r\n block.props.preset = asStr(c.preset) ?? block.props.preset;\r\n if (typeof c.cols === \"number\") block.props.cols = c.cols;\r\n if (Array.isArray(c.ratios)) block.props.ratios = [...c.ratios];\r\n if (typeof c.gap === \"number\") block.props.gap = c.gap;\r\n if (c.padding !== undefined && c.padding !== null) block.props.padding = c.padding;\r\n if (typeof c.bgColor === \"string\") block.props.bgColor = c.bgColor;\r\n if (typeof c.bgImage === \"string\") block.props.bgImage = c.bgImage;\r\n if (typeof c.bgSize === \"string\") block.props.bgSize = c.bgSize;\r\n if (typeof c.bgRepeat === \"string\") block.props.bgRepeat = c.bgRepeat;\r\n if (typeof c.bgPosition === \"string\") block.props.bgPosition = c.bgPosition;\r\n if (c.bgGradient !== undefined) block.props.bgGradient = c.bgGradient;\r\n if (c.bgGradient !== undefined) block.props.bgGradient = c.bgGradient;\r\n if (Array.isArray(c.columns)) {\r\n block.props.columns = c.columns.map((col: { props?: Record<string, unknown> }) => ({\r\n props: {\r\n ...DEFAULT_COLUMN_PROPS,\r\n ...(col?.props && typeof col.props === \"object\" ? col.props : {}),\r\n },\r\n }));\r\n } else if (c.columnStyles && typeof c.columnStyles === \"object\" && !Array.isArray(c.columnStyles)) {\r\n const ratios = Array.isArray(c.ratios) ? c.ratios : [1];\r\n block.props.columns = columnsFromLegacyMap(c.columnStyles, ratios.length);\r\n }\r\n block.props.cells = c.cells.map((col: unknown[]) =>\r\n Array.isArray(col)\r\n ? col.map((raw) => mapEmbeddedLayoutCellBlock(raw, layoutDepth + 1)).filter((x) => x != null)\r\n : [],\r\n );\r\n } else {\r\n block.props.preset = asStr(c.preset) ?? block.props.preset;\r\n }\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n\r\n const styleObj = s && typeof s === \"object\" && !Array.isArray(s) ? s : {};\r\n const hasDocStyles = Object.keys(styleObj).some((k) => {\r\n const v = (styleObj as any)[k];\r\n return v !== undefined && v !== null && v !== \"\";\r\n });\r\n /** Keys in `content` that map from document schema — do not treat as internal props when merging legacy flat `content`. */\r\n const skipContentMergeKeys: Partial<Record<BlockPropKey, Set<string>>> = {\r\n heading: new Set([\"text\", \"tag\"]),\r\n text: new Set([\"html\", \"text\"]),\r\n html: new Set([\"html\"]),\r\n image: new Set([\"src\", \"alt\", \"link\"]),\r\n button: new Set([\"text\", \"href\"]),\r\n link: new Set([\"text\", \"href\"]),\r\n social: new Set([\"networks\", \"socialUrls\"]),\r\n table: new Set([\"data\"]),\r\n menu: new Set([\"items\"]),\r\n video: new Set([\"url\"]),\r\n timer: new Set([\"endDate\"]),\r\n };\r\n if (!hasDocStyles && c && typeof c === \"object\" && t !== \"layout\") {\r\n const known = DEFAULT_BLOCK_PROPS[t as BlockPropKey];\r\n const skip = skipContentMergeKeys[t as BlockPropKey];\r\n if (known && typeof known === \"object\" && !Array.isArray(known)) {\r\n for (const key of Object.keys(known)) {\r\n if (skip?.has(key)) continue;\r\n if (key in c && (c as any)[key] !== undefined) {\r\n (block.props as any)[key] = (c as any)[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n applyImportedEditorPropsFromDoc(block, t as BlockPropKey, b, layoutDepth);\r\n if (t === \"image\") {\r\n const link = asStr(block.props.link);\r\n if (link && block.props.linkEnabled == null) block.props.linkEnabled = true;\r\n }\r\n return block;\r\n}\r\n\r\nfunction rowToInternal(r: EmailDocumentRow) {\r\n const columns: EmailDocumentColumn[] = Array.isArray(r.columns) ? r.columns : [];\r\n const layoutColCount =\r\n typeof r.layout?.columns === \"number\" && r.layout.columns > 0 ? Math.floor(r.layout.columns) : 0;\r\n const cols = Math.max(1, columns.length, layoutColCount);\r\n const colList: EmailDocumentColumn[] = (() => {\r\n if (columns.length >= cols) return columns;\r\n if (columns.length > 0) {\r\n return [\r\n ...columns,\r\n ...Array.from({ length: cols - columns.length }).map(() => ({} as EmailDocumentColumn)),\r\n ];\r\n }\r\n return Array.from({ length: cols }).map(() => ({} as EmailDocumentColumn));\r\n })();\r\n const preset = pickPresetByColCount(cols) || LAYOUT_PRESETS[0];\r\n const row: any = makeLayoutRow(preset);\r\n row.id = typeof r.id === \"string\" ? r.id : uid();\r\n row.cols = cols;\r\n row.gap = typeof r.layout?.gap === \"number\" ? r.layout.gap : row.gap;\r\n applyRowPropsToEditorRow(row, r);\r\n\r\n const lay = r.layout as Record<string, unknown> | undefined;\r\n if (lay && typeof lay === \"object\" && !Array.isArray(lay)) {\r\n if (typeof lay.preset === \"string\" && lay.preset.trim()) row.preset = lay.preset.trim();\r\n if (Array.isArray(lay.ratios) && lay.ratios.length) {\r\n const rr = lay.ratios.filter((x) => typeof x === \"number\" && Number.isFinite(x)) as number[];\r\n if (rr.length) row.ratios = rr;\r\n }\r\n }\r\n\r\n row.cells = colList.map((c) => {\r\n const blocks = Array.isArray(c.blocks) ? c.blocks : [];\r\n return blocks.map((blk) => mapBlockToInternal(blk, 0)).filter((x) => x != null);\r\n });\r\n\r\n const studio = (r as any)._reactEmailStudio;\r\n const snap = studio?.row;\r\n const columnsFromDoc: ColumnEntry[] = colList.map((c) => ({\r\n props: columnPropsFromDocColumn(c),\r\n }));\r\n\r\n if (snap && typeof snap === \"object\" && !Array.isArray(snap)) {\r\n const {\r\n cells: _omitCells,\r\n columnStyles: legacyCs,\r\n columns: snapCols,\r\n ...rest\r\n } = snap as Record<string, unknown> & { columnStyles?: unknown; columns?: unknown };\r\n Object.assign(row, rest);\r\n const fromSnap = Array.isArray(snapCols)\r\n ? (snapCols as ColumnEntry[]).map((col) => ({\r\n props: {\r\n ...DEFAULT_COLUMN_PROPS,\r\n ...(col?.props && typeof col.props === \"object\" ? col.props : {}),\r\n },\r\n }))\r\n : columnsFromLegacyMap(legacyCs, cols);\r\n row.columns = mergeLayoutColumns(fromSnap, columnsFromDoc) ?? columnsFromDoc;\r\n delete row.columnStyles;\r\n } else {\r\n row.columns = columnsFromDoc;\r\n }\r\n\r\n return row;\r\n}\r\n\r\n/** Coerce fragment / array input into `email_document` before normalize. */\r\nexport function coerceEmailDocumentInput(input: unknown): unknown {\r\n if (input == null) return input;\r\n if (Array.isArray(input)) {\r\n if (input.length === 0) return input;\r\n return { type: \"email_document\", settings: {}, blocks: input };\r\n }\r\n if (typeof input !== \"object\") return input;\r\n const o = input as Record<string, unknown>;\r\n if (o.type === \"email_document\") return input;\r\n if (Array.isArray(o.blocks)) {\r\n return {\r\n type: \"email_document\",\r\n settings: o.settings && typeof o.settings === \"object\" ? o.settings : {},\r\n blocks: o.blocks,\r\n };\r\n }\r\n return input;\r\n}\r\n\r\nfunction rootLayoutBlockToDocRow(block: BlockBase): EmailDocumentRow {\r\n const p = block.props && typeof block.props === \"object\" ? block.props : {};\r\n const c =\r\n block.content && typeof block.content === \"object\" && !Array.isArray(block.content)\r\n ? (block.content as Record<string, unknown>)\r\n : {};\r\n const cols = Math.max(\r\n 1,\r\n typeof p.cols === \"number\" && p.cols > 0 ? Math.floor(p.cols) : 0,\r\n typeof c.cols === \"number\" && c.cols > 0 ? Math.floor(c.cols as number) : 0,\r\n Array.isArray(p.cells) ? p.cells.length : 0,\r\n Array.isArray(c.cells) ? (c.cells as unknown[]).length : 0,\r\n );\r\n const rawCells = Array.isArray(c.cells)\r\n ? (c.cells as unknown[])\r\n : Array.isArray(p.cells)\r\n ? (p.cells as unknown[])\r\n : [];\r\n const contentColumns = Array.isArray(c.columns) ? (c.columns as { props?: ColumnProps }[]) : [];\r\n const propsColumns = getColumns(p as Parameters<typeof getColumns>[0]);\r\n const columns: EmailDocumentColumn[] = Array.from({ length: cols }, (_, ci) => {\r\n const cellRaw = rawCells[ci];\r\n const blocks: BlockBase[] = Array.isArray(cellRaw)\r\n ? cellRaw\r\n .filter((x) => x && typeof x === \"object\")\r\n .map((x, bi) => {\r\n const blk = x as BlockBase;\r\n return {\r\n id: ensureBlockId(blk.id, `b_${ci}_${bi}`),\r\n type: typeof blk.type === \"string\" ? blk.type : \"text\",\r\n content: blk.content,\r\n ...(blk.props ? { props: blk.props } : {}),\r\n ...(blk.styles ? { styles: blk.styles } : {}),\r\n ...(blk.behavior ? { behavior: blk.behavior } : {}),\r\n };\r\n })\r\n : [];\r\n const colProps = {\r\n ...DEFAULT_COLUMN_PROPS,\r\n ...(propsColumns[ci]?.props ?? contentColumns[ci]?.props ?? {}),\r\n } as ColumnProps;\r\n return {\r\n id: `col_${ci + 1}`,\r\n layout: { width: \"100%\", verticalAlign: \"top\" as const, mobileWidth: \"100%\" },\r\n props: cloneJson(colProps) as ColumnProps,\r\n blocks,\r\n };\r\n });\r\n const rowProps: RowProps = {\r\n bgColor: typeof p.bgColor === \"string\" ? p.bgColor : \"\",\r\n bgImage: typeof p.bgImage === \"string\" ? p.bgImage : \"\",\r\n bgRepeat: (p.bgRepeat as string) || \"no-repeat\",\r\n bgSize: (p.bgSize as string) || \"cover\",\r\n bgPosition: (p.bgPosition as string) || \"center\",\r\n bgGradient: (p.bgGradient as RowProps[\"bgGradient\"]) ?? null,\r\n padding:\r\n typeof p.padding === \"number\"\r\n ? { top: p.padding, right: p.padding, bottom: p.padding, left: p.padding }\r\n : normalizePadding(p.padding),\r\n };\r\n const ratios = Array.isArray(p.ratios)\r\n ? (p.ratios as number[])\r\n : Array.isArray(c.ratios)\r\n ? (c.ratios as number[])\r\n : undefined;\r\n return {\r\n id: typeof block.id === \"string\" ? block.id : uid(),\r\n type: \"row\",\r\n layout: {\r\n columns: cols,\r\n gap: typeof p.gap === \"number\" ? p.gap : typeof c.gap === \"number\" ? (c.gap as number) : 0,\r\n stackOnMobile: true,\r\n align: \"center\",\r\n ...(typeof p.preset === \"string\" && p.preset.trim()\r\n ? { preset: p.preset.trim() }\r\n : typeof c.preset === \"string\" && (c.preset as string).trim()\r\n ? { preset: (c.preset as string).trim() }\r\n : {}),\r\n ...(ratios?.length ? { ratios: [...ratios] } : {}),\r\n },\r\n props: rowProps,\r\n columns,\r\n };\r\n}\r\n\r\nfunction ensureBlockId(id: unknown, prefix: string): string {\r\n return typeof id === \"string\" && id.trim() ? id : `${prefix}_${uid()}`;\r\n}\r\n\r\nfunction wrapRootContentBlock(block: BlockBase) {\r\n const row = makeLayoutRow(pickPresetByColCount(1));\r\n const internal = mapBlockToInternal(block, 0);\r\n if (internal) row.cells[0] = [internal];\r\n return row;\r\n}\r\n\r\nfunction rootBlockToEditorRow(block: BlockBase) {\r\n const t = block.type === \"nestedRow\" ? \"layout\" : block.type;\r\n if (t === \"layout\") {\r\n return rowToInternal(rootLayoutBlockToDocRow(block));\r\n }\r\n return wrapRootContentBlock(block);\r\n}\r\n\r\nfunction blocksToEditorRows(blocks: BlockBase[]) {\r\n return blocks.map(rootBlockToEditorRow);\r\n}\r\n\r\nfunction editorRowToRootBlock(row: Record<string, unknown>): BlockBase {\r\n const cellArrays = Array.isArray(row.cells) ? (row.cells as unknown[][]) : [];\r\n const declaredCols = typeof row.cols === \"number\" && row.cols > 0 ? row.cols : 0;\r\n const cols = Math.max(1, cellArrays.length, declaredCols);\r\n const rowColumns = getColumns(row as Parameters<typeof getColumns>[0]);\r\n const ratios =\r\n Array.isArray(row.ratios) && row.ratios.length\r\n ? [...(row.ratios as number[])]\r\n : Array.from({ length: cols }, () => 1);\r\n const layoutBlock = {\r\n id: typeof row.id === \"string\" ? row.id : uid(),\r\n type: \"layout\",\r\n props: {\r\n preset: row.preset,\r\n cols,\r\n ratios,\r\n gap: row.gap ?? 12,\r\n padding: row.padding ?? 8,\r\n bgColor: row.bgColor ?? \"\",\r\n bgImage: row.bgImage ?? \"\",\r\n bgSize: row.bgSize ?? \"cover\",\r\n bgRepeat: row.bgRepeat ?? \"no-repeat\",\r\n bgPosition: row.bgPosition ?? \"center\",\r\n bgGradient: row.bgGradient ?? null,\r\n columns: rowColumns,\r\n cells: cellArrays,\r\n },\r\n };\r\n return exportEmailDocBlock(layoutBlock);\r\n}\r\n\r\nfunction isSingleContentBlockRow(row: Record<string, unknown>): boolean {\r\n const cells = row.cells;\r\n if (!Array.isArray(cells) || cells.length !== 1) return false;\r\n const col = cells[0];\r\n if (!Array.isArray(col) || col.length !== 1) return false;\r\n const b = col[0] as { type?: string } | null;\r\n return !!b && typeof b.type === \"string\" && b.type !== \"layout\" && b.type !== \"nestedRow\";\r\n}\r\n\r\nfunction editorRowsToBlocks(rows: Record<string, unknown>[]) {\r\n const out: BlockBase[] = [];\r\n for (const row of rows) {\r\n if (isSingleContentBlockRow(row)) {\r\n const child = (row.cells as unknown[][])[0][0];\r\n out.push(exportEmailDocBlock(child));\r\n } else {\r\n out.push(editorRowToRootBlock(row));\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nfunction rowPropsToLegacyStyles(p: RowProps): RowStyles {\r\n return {\r\n backgroundColor: p.bgColor ?? \"\",\r\n backgroundImage: p.bgImage ?? \"\",\r\n backgroundRepeat: p.bgRepeat ?? \"no-repeat\",\r\n backgroundSize: p.bgSize ?? \"cover\",\r\n backgroundPosition: p.bgPosition ?? \"center\",\r\n backgroundGradient: p.bgGradient ?? null,\r\n padding: p.padding,\r\n borderRadius: p.borderRadius ?? 0,\r\n borderWidth: p.borderWidth ?? 0,\r\n borderColor: p.borderColor ?? \"#e5e7eb\",\r\n textAlign: p.textAlign ?? \"left\",\r\n };\r\n}\r\n\r\nfunction columnPropsToLegacyStyles(cp: ColumnEntry[\"props\"]) {\r\n return {\r\n padding: layoutColumnPaddingForDoc(cp.padding),\r\n backgroundColor: cp.bgColor ?? \"\",\r\n backgroundImage: cp.bgImage ?? \"\",\r\n backgroundRepeat: cp.bgRepeat ?? \"no-repeat\",\r\n backgroundSize: cp.bgSize ?? \"cover\",\r\n backgroundPosition: cp.bgPosition ?? \"center\",\r\n backgroundGradient: cp.bgGradient ?? null,\r\n borderRadius: layoutColumnBorderRadiusForDoc(cp.borderRadius),\r\n };\r\n}\r\n\r\nfunction editorRowStudioSnapshot(r: Record<string, unknown>) {\r\n const p = editorRowToDocProps(r);\r\n const columns = getColumns(r).map((col) => ({\r\n props: cloneJson(col.props ?? DEFAULT_COLUMN_PROPS),\r\n }));\r\n return {\r\n id: r.id,\r\n type: \"layout\",\r\n preset: r.preset,\r\n cols: r.cols,\r\n ratios: Array.isArray(r.ratios) ? [...(r.ratios as number[])] : [1],\r\n gap: typeof r.gap === \"number\" ? r.gap : 0,\r\n padding: p.padding,\r\n bgColor: p.bgColor ?? \"\",\r\n bgImage: p.bgImage ?? \"\",\r\n bgSize: p.bgSize ?? \"cover\",\r\n bgRepeat: p.bgRepeat ?? \"no-repeat\",\r\n bgPosition: p.bgPosition ?? \"center\",\r\n bgGradient: p.bgGradient ?? null,\r\n columns,\r\n };\r\n}\r\n\r\n/** Block in `rows[].columns[].blocks[]` — `content`, `props`, and optional `behavior` (no block `styles` on export). */\r\nfunction exportBlockForLegacyRow(b: any, depth = 0): BlockBase {\r\n if (!b || typeof b !== \"object\") {\r\n return { id: uid(), type: \"text\", content: {}, props: {} };\r\n }\r\n const rawProps =\r\n b.props && typeof b.props === \"object\" && !Array.isArray(b.props)\r\n ? (cloneJson(b.props) as Record<string, unknown>)\r\n : {};\r\n\r\n if (b.type === \"layout\" && Array.isArray(b.props?.cells)) {\r\n rawProps.cells = (b.props.cells as any[][]).map((col) =>\r\n Array.isArray(col) ? col.map((child) => exportBlockForLegacyRow(child, depth + 1)) : [],\r\n );\r\n }\r\n\r\n if (b.type === \"html\") {\r\n const body =\r\n typeof b.content === \"string\"\r\n ? b.content\r\n : typeof rawProps.content === \"string\"\r\n ? rawProps.content\r\n : \"\";\r\n const html = normalizeRichHtmlForStorage(body);\r\n rawProps.content = html;\r\n return {\r\n id: typeof b.id === \"string\" ? b.id : uid(),\r\n type: \"html\",\r\n content: { html },\r\n props: rawProps,\r\n };\r\n }\r\n\r\n const doc = internalBlockToEmailDoc(b, depth);\r\n const out: BlockBase = {\r\n id: doc.id!,\r\n type: doc.type!,\r\n content: doc.content ?? {},\r\n props: rawProps,\r\n };\r\n if (doc.behavior) out.behavior = doc.behavior;\r\n return out;\r\n}\r\n\r\nfunction editorRowToEmailDocumentRow(r: Record<string, unknown>, rowIndex: number): EmailDocumentRow {\r\n const rowProps = editorRowToDocProps(r);\r\n const cellArrays = Array.isArray(r.cells) ? (r.cells as unknown[][]) : [];\r\n const declaredCols = typeof r.cols === \"number\" && r.cols > 0 ? Math.floor(r.cols) : 0;\r\n const colCount = Math.max(1, cellArrays.length, declaredCols);\r\n const rowColumns = getColumns(r);\r\n\r\n const columns: EmailDocumentColumn[] = Array.from({ length: colCount }, (_, ci) => {\r\n const cp = {\r\n ...DEFAULT_COLUMN_PROPS,\r\n ...(rowColumns[ci]?.props ?? {}),\r\n } as ColumnEntry[\"props\"];\r\n const cellBlocks = cellArrays[ci];\r\n const blocks = Array.isArray(cellBlocks)\r\n ? cellBlocks.map((blk) => exportBlockForLegacyRow(blk)).filter((x) => x != null)\r\n : [];\r\n return {\r\n id: `col_${rowIndex + 1}_${ci + 1}`,\r\n layout: { width: \"100%\", verticalAlign: \"top\" as const, mobileWidth: \"100%\" },\r\n styles: columnPropsToLegacyStyles(cp),\r\n props: cloneJson(cp) as ColumnProps,\r\n blocks,\r\n } as EmailDocumentColumn;\r\n });\r\n\r\n const ratios = Array.isArray(r.ratios) ? [...(r.ratios as number[])] : undefined;\r\n return {\r\n id: typeof r.id === \"string\" ? r.id : uid(),\r\n type: \"row\",\r\n _reactEmailStudio: { row: editorRowStudioSnapshot(r) },\r\n layout: {\r\n columns: colCount,\r\n gap: typeof r.gap === \"number\" ? r.gap : 0,\r\n stackOnMobile: true,\r\n align: \"center\",\r\n ...(typeof r.preset === \"string\" && r.preset.trim() ? { preset: r.preset.trim() } : {}),\r\n ...(ratios?.length ? { ratios } : {}),\r\n },\r\n props: rowProps,\r\n styles: rowPropsToLegacyStyles(rowProps),\r\n columns,\r\n };\r\n}\r\n\r\nfunction buildExportSettingsWithStudio(settings: Record<string, unknown>): EmailDocument[\"settings\"] {\r\n const base = buildExportSettings(settings) ?? {};\r\n const editorSettings = cloneJson(settings) as Record<string, unknown>;\r\n return {\r\n ...base,\r\n _reactEmailStudio: {\r\n contentPadding: base.contentPadding ?? 24,\r\n contentBorderRadius: base.contentBorderRadius ?? 8,\r\n editorSettings,\r\n },\r\n };\r\n}\r\n\r\nfunction editorSettingStr(settings: Record<string, unknown>, key: string, fallback = \"\"): string {\r\n const v = settings[key];\r\n return typeof v === \"string\" ? v : fallback;\r\n}\r\n\r\nfunction buildExportSettings(settings: Record<string, unknown>): EmailDocument[\"settings\"] {\r\n const contentWidth =\r\n typeof settings.contentWidth === \"number\" ? settings.contentWidth : 600;\r\n const bgGradient = settings.bgGradient;\r\n const contentBgGradient = settings.contentBgGradient;\r\n return {\r\n width: contentWidth,\r\n backgroundColor: editorSettingStr(settings, \"bgColor\", \"#f1f5f9\"),\r\n backgroundImage: editorSettingStr(settings, \"bgImage\"),\r\n backgroundRepeat: editorSettingStr(settings, \"bgRepeat\", \"no-repeat\"),\r\n backgroundSize: editorSettingStr(settings, \"bgSize\", \"cover\"),\r\n backgroundPosition: editorSettingStr(settings, \"bgPosition\", \"center\"),\r\n backgroundGradient:\r\n bgGradient && typeof bgGradient === \"object\" && !Array.isArray(bgGradient)\r\n ? (bgGradient as EmailDocumentSettings[\"backgroundGradient\"])\r\n : undefined,\r\n contentBackgroundColor: editorSettingStr(settings, \"contentBg\", \"#ffffff\"),\r\n contentBackgroundImage: editorSettingStr(settings, \"contentBgImage\"),\r\n contentBackgroundRepeat: editorSettingStr(settings, \"contentBgRepeat\", \"no-repeat\"),\r\n contentBackgroundSize: editorSettingStr(settings, \"contentBgSize\", \"cover\"),\r\n contentBackgroundPosition: editorSettingStr(settings, \"contentBgPosition\", \"center\"),\r\n contentBackgroundGradient:\r\n contentBgGradient &&\r\n typeof contentBgGradient === \"object\" &&\r\n !Array.isArray(contentBgGradient)\r\n ? (contentBgGradient as EmailDocumentSettings[\"contentBackgroundGradient\"])\r\n : undefined,\r\n fontFamily:\r\n editorSettingStr(settings, \"fontFamily\") ||\r\n editorSettingStr(settings, \"pageFontFamily\", \"Arial, Helvetica, sans-serif\"),\r\n lineHeightBase:\r\n settings.pageLineHeight != null && settings.pageLineHeight !== \"\"\r\n ? Number(settings.pageLineHeight)\r\n : 1.6,\r\n color: editorSettingStr(settings, \"pageTextColor\", \"#111827\"),\r\n responsive: typeof settings.pageResponsive === \"boolean\" ? settings.pageResponsive : true,\r\n rtl: !!settings.pageRtl,\r\n contentPadding: typeof settings.padding === \"number\" ? settings.padding : 24,\r\n contentBorderRadius: typeof settings.borderRadius === \"number\" ? settings.borderRadius : 8,\r\n };\r\n}\r\n\r\nfunction editorSettingsFromDoc(\r\n s: EmailDocumentSettings,\r\n rawSettings?: EmailDocumentSettings | null,\r\n): Record<string, unknown> {\r\n const studioSettings = rawSettings?._reactEmailStudio;\r\n const settings: Record<string, unknown> = {};\r\n if (\r\n studioSettings?.editorSettings &&\r\n typeof studioSettings.editorSettings === \"object\" &&\r\n !Array.isArray(studioSettings.editorSettings)\r\n ) {\r\n Object.assign(settings, cloneJson(studioSettings.editorSettings));\r\n }\r\n const pageRtlFromEditor = settings.pageRtl;\r\n const contentPadding =\r\n typeof s.contentPadding === \"number\"\r\n ? s.contentPadding\r\n : typeof studioSettings?.contentPadding === \"number\"\r\n ? studioSettings.contentPadding\r\n : undefined;\r\n const contentBorderRadius =\r\n typeof s.contentBorderRadius === \"number\"\r\n ? s.contentBorderRadius\r\n : typeof studioSettings?.contentBorderRadius === \"number\"\r\n ? studioSettings.contentBorderRadius\r\n : undefined;\r\n\r\n Object.assign(settings, {\r\n bgColor: s.backgroundColor || \"#f1f5f9\",\r\n bgImage: s.backgroundImage || \"\",\r\n bgRepeat: s.backgroundRepeat || \"no-repeat\",\r\n bgSize: s.backgroundSize || \"cover\",\r\n bgPosition: s.backgroundPosition || \"center\",\r\n bgGradient: s.backgroundGradient || null,\r\n contentBg: s.contentBackgroundColor || \"#ffffff\",\r\n contentBgImage: s.contentBackgroundImage || \"\",\r\n contentBgRepeat: s.contentBackgroundRepeat || \"no-repeat\",\r\n contentBgSize: s.contentBackgroundSize || \"cover\",\r\n contentBgPosition: s.contentBackgroundPosition || \"center\",\r\n contentBgGradient: s.contentBackgroundGradient || null,\r\n contentWidth: typeof s.width === \"number\" ? s.width : 600,\r\n padding:\r\n contentPadding ??\r\n (typeof settings.padding === \"number\" ? settings.padding : 24),\r\n borderRadius:\r\n contentBorderRadius ??\r\n (typeof settings.borderRadius === \"number\" ? settings.borderRadius : 8),\r\n pageFontFamily: s.fontFamily,\r\n pageTextColor: s.color,\r\n pageLineHeight: s.lineHeightBase != null ? String(s.lineHeightBase) : undefined,\r\n pageResponsive: s.responsive,\r\n pageRtl: typeof s.rtl === \"boolean\" ? s.rtl : pageRtlFromEditor,\r\n fontFamily: s.fontFamily,\r\n });\r\n return settings;\r\n}\r\n\r\nexport function normalizeEmailDesignInput(input: unknown) {\r\n const coerced = coerceEmailDocumentInput(input);\r\n const doc = normalizeEmailDocument(coerced);\r\n if (!doc) return null;\r\n\r\n const rawDoc =\r\n input && typeof input === \"object\" && !Array.isArray(input)\r\n ? (input as Partial<EmailDocument>)\r\n : null;\r\n const rawSettings =\r\n rawDoc?.settings && typeof rawDoc.settings === \"object\" && !Array.isArray(rawDoc.settings)\r\n ? rawDoc.settings\r\n : null;\r\n\r\n const settings = editorSettingsFromDoc(doc.settings || {}, rawSettings);\r\n\r\n let rows: ReturnType<typeof rowToInternal>[];\r\n if (doc.blocks?.length) {\r\n rows = blocksToEditorRows(doc.blocks);\r\n } else {\r\n const rawRows = rawDoc && Array.isArray(rawDoc.rows) ? rawDoc.rows : [];\r\n rows = (doc.rows || []).map((r, i) => {\r\n const legacy = rawRows[i]?._reactEmailStudio;\r\n if (legacy) {\r\n return rowToInternal({ ...r, _reactEmailStudio: legacy } as EmailDocumentRow);\r\n }\r\n return rowToInternal(r);\r\n });\r\n }\r\n\r\n return withHydratedRows({ rows, settings, __emailDocument: doc } as any);\r\n}\r\n\r\n/** Rows from a design input without full editor settings merge (for append). */\r\nexport function emailDocumentToEditorRows(input: unknown) {\r\n const coerced = coerceEmailDocumentInput(input);\r\n const doc = normalizeEmailDocument(coerced);\r\n if (!doc) return null;\r\n\r\n const rawDoc =\r\n input && typeof input === \"object\" && !Array.isArray(input)\r\n ? (input as Partial<EmailDocument>)\r\n : null;\r\n\r\n if (doc.blocks?.length) {\r\n return blocksToEditorRows(doc.blocks);\r\n }\r\n\r\n const rawRows = rawDoc && Array.isArray(rawDoc.rows) ? rawDoc.rows : [];\r\n return (doc.rows || []).map((r, i) => {\r\n const legacy = rawRows[i]?._reactEmailStudio;\r\n if (legacy) {\r\n return rowToInternal({ ...r, _reactEmailStudio: legacy } as EmailDocumentRow);\r\n }\r\n return rowToInternal(r);\r\n });\r\n}\r\n\r\nexport function designToEmailDocument(rows: any[], settings: any): EmailDocument {\r\n return {\r\n type: \"email_document\",\r\n settings: buildExportSettingsWithStudio(settings),\r\n rows: rows.map((r, i) => editorRowToEmailDocumentRow(r, i)),\r\n };\r\n}\r\n\r\n/** Normalize input and return `email_document` in LMS/export shape (`rows[]` + `_reactEmailStudio`). */\r\nexport function canonicalizeEmailDocument(input: unknown): EmailDocument | null {\r\n const loaded = normalizeEmailDesignInput(coerceEmailDocumentInput(input) ?? input);\r\n if (!loaded?.rows) return null;\r\n return designToEmailDocument(loaded.rows, loaded.settings);\r\n}\r\n\r\n/**\r\n * Deep-merge block props with defaults and ensure ids. Unknown `type` values are dropped (not shown).\r\n * @param depth Nesting level for `layout` → `cells` recursion (capped at {@link MAX_LAYOUT_TREE_DEPTH}).\r\n */\r\nfunction hydrateBlock(b, depth = 0) {\r\n if (!b || typeof b !== \"object\") return null;\r\n const t = b.type === \"nestedRow\" ? \"layout\" : b.type;\r\n if (!isKnownBlockType(t)) return null;\r\n\r\n if (t === \"layout\" && b.props && Array.isArray(b.props.cells)) {\r\n const defaults = DEFAULT_BLOCK_PROPS.layout;\r\n if (depth >= MAX_LAYOUT_TREE_DEPTH) {\r\n const ratios = Array.isArray(b.props.ratios) && b.props.ratios.length ? [...b.props.ratios] : [1];\r\n return {\r\n ...b,\r\n type: \"layout\",\r\n id: typeof b.id === \"string\" && b.id ? b.id : uid(),\r\n props: normalizeLayoutContainerProps({\r\n ...defaults,\r\n ...b.props,\r\n bgSize: b.props.bgSize ?? defaults.bgSize,\r\n bgRepeat: b.props.bgRepeat ?? defaults.bgRepeat,\r\n cells: ratios.map(() => []),\r\n }),\r\n };\r\n }\r\n const cells = b.props.cells.map((col) =>\r\n Array.isArray(col) ? col.map((x) => hydrateBlock(x, depth + 1)).filter((x) => x != null) : [],\r\n );\r\n return {\r\n ...b,\r\n type: \"layout\",\r\n id: typeof b.id === \"string\" && b.id ? b.id : uid(),\r\n props: normalizeLayoutContainerProps({\r\n ...defaults,\r\n ...b.props,\r\n bgSize: b.props.bgSize ?? defaults.bgSize,\r\n bgRepeat: b.props.bgRepeat ?? defaults.bgRepeat,\r\n cells,\r\n }),\r\n };\r\n }\r\n\r\n const defaults = DEFAULT_BLOCK_PROPS[t];\r\n if (typeof defaults !== \"object\" || defaults == null || Array.isArray(defaults)) return null;\r\n\r\n if (t === \"html\") {\r\n const rawProps = b.props && typeof b.props === \"object\" && !Array.isArray(b.props) ? (b.props as Record<string, unknown>) : {};\r\n const { content: legacyPropContent, ...restProps } = rawProps;\r\n const merged = { ...defaults, ...restProps };\r\n normalizeBoxStyles(merged, t);\r\n const src =\r\n typeof (b as { content?: unknown }).content === \"string\"\r\n ? String((b as { content: string }).content)\r\n : typeof legacyPropContent === \"string\"\r\n ? legacyPropContent\r\n : \"\";\r\n const htmlNorm = normalizeRichHtmlForStorage(src);\r\n (merged as { content?: string }).content = htmlNorm;\r\n return {\r\n ...b,\r\n id: typeof b.id === \"string\" && b.id ? b.id : uid(),\r\n content: htmlNorm,\r\n props: merged,\r\n };\r\n }\r\n\r\n const merged = { ...defaults, ...(b.props && typeof b.props === \"object\" ? b.props : {}) };\r\n\r\n normalizeBoxStyles(merged, t);\r\n\r\n return {\r\n ...b,\r\n id: typeof b.id === \"string\" && b.id ? b.id : uid(),\r\n props: merged,\r\n };\r\n}\r\n\r\n/** Nested layout cell: document block or legacy `{ type, props }` editor shape. */\r\nfunction mapEmbeddedLayoutCellBlock(raw: unknown, layoutDepth = 0) {\r\n if (!raw || typeof raw !== \"object\") return null;\r\n const r = raw as any;\r\n if (r.props && typeof r.props === \"object\" && typeof r.type === \"string\" && !(\"styles\" in r)) {\r\n return hydrateBlock(r, layoutDepth);\r\n }\r\n return mapBlockToInternal(r as BlockBase, layoutDepth);\r\n}\r\n\r\n/** Deep-merge layout `columns` arrays. Hydrated props often omit columns filled only in `content`. */\r\nfunction applyImportedEditorPropsFromDoc(block: any, t: BlockPropKey, b: BlockBase, layoutDepth = 0) {\r\n const exp = (b as any).props as Record<string, unknown> | undefined;\r\n if (!exp || typeof exp !== \"object\" || Array.isArray(exp)) {\r\n if (t === \"html\" && typeof block.content === \"string\") {\r\n block.content = normalizeRichHtmlForStorage(block.content);\r\n block.props.content = block.content;\r\n }\r\n return;\r\n }\r\n if (t === \"layout\" && Array.isArray((exp as any).cells)) {\r\n const columnsFromContent = block.props.columns ?? block.props.columnStyles;\r\n const expHasColumns =\r\n Array.isArray((exp as any).columns) ||\r\n ((exp as any).columnStyles &&\r\n typeof (exp as any).columnStyles === \"object\" &&\r\n !Array.isArray((exp as any).columnStyles));\r\n const hb = hydrateBlock({ type: \"layout\", id: block.id, props: exp }, layoutDepth);\r\n if (hb) {\r\n block.props = hb.props;\r\n const merged = mergeLayoutColumns(\r\n columnsFromContent,\r\n expHasColumns ? block.props.columns : undefined,\r\n );\r\n if (merged) block.props.columns = merged;\r\n else delete block.props.columns;\r\n delete block.props.columnStyles;\r\n if (typeof hb.id === \"string\" && hb.id) block.id = hb.id;\r\n }\r\n return;\r\n }\r\n if (t === \"html\") {\r\n const { content: expContent, ...expRest } = exp;\r\n Object.assign(block.props, expRest);\r\n normalizeBoxStyles(block.props, t);\r\n if (typeof expContent === \"string\") {\r\n block.content = normalizeRichHtmlForStorage(expContent);\r\n } else if (typeof block.content === \"string\") {\r\n block.content = normalizeRichHtmlForStorage(block.content);\r\n }\r\n block.props.content = typeof block.content === \"string\" ? block.content : \"\";\r\n return;\r\n }\r\n Object.assign(block.props, exp);\r\n normalizeBoxStyles(block.props, t);\r\n if (t === \"text\") {\r\n block.props.content = normalizeRichHtmlForStorage(String(block.props.content ?? \"\"));\r\n }\r\n}\r\n\r\n/** Export block payload (`content`) + full `props`; styling lives in `props` only (no `styles`). */\r\nfunction exportEmailDocBlock(b: any, depth = 0): BlockBase {\r\n if (!b || typeof b !== \"object\") return { id: uid(), type: \"text\", content: {} };\r\n const doc = internalBlockToEmailDoc(b, depth) as BlockBase & { content?: Record<string, unknown> };\r\n const out: BlockBase & { content?: Record<string, unknown>; props?: Record<string, unknown> } = { ...doc };\r\n delete out.styles;\r\n if (b.props && typeof b.props === \"object\" && !Array.isArray(b.props)) {\r\n const raw = cloneJson(b.props) as Record<string, unknown>;\r\n if (b.type === \"html\" && raw && typeof raw === \"object\" && \"content\" in raw) {\r\n const { content: _drop, ...rest } = raw;\r\n out.props = rest;\r\n } else {\r\n out.props = raw;\r\n }\r\n }\r\n if (b.type === \"html\") {\r\n const body =\r\n typeof b.content === \"string\"\r\n ? b.content\r\n : typeof (b.props as { content?: unknown })?.content === \"string\"\r\n ? String((b.props as { content: string }).content)\r\n : typeof (doc.content as { html?: string })?.html === \"string\"\r\n ? (doc.content as { html: string }).html\r\n : \"\";\r\n (out as BlockBase).content = normalizeRichHtmlForStorage(body);\r\n }\r\n if (b.type === \"layout\" && Array.isArray(b.props?.cells)) {\r\n const baseContent = typeof doc.content === \"object\" && doc.content ? doc.content : {};\r\n if (depth >= MAX_LAYOUT_TREE_DEPTH) {\r\n const ratios = Array.isArray(b.props.ratios) && b.props.ratios.length ? b.props.ratios : [1];\r\n out.content = { ...baseContent, cells: ratios.map(() => []) };\r\n } else {\r\n out.content = {\r\n ...baseContent,\r\n cells: (b.props.cells as any[][]).map((col: any[]) =>\r\n Array.isArray(col) ? col.map((child) => exportEmailDocBlock(child, depth + 1)) : [],\r\n ),\r\n };\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nfunction hydrateLayoutRow(row) {\r\n if (!row || typeof row !== \"object\") return row;\r\n const cells = (row.cells || []).map((col) =>\r\n Array.isArray(col) ? col.map(hydrateBlock).filter((x) => x != null) : col,\r\n );\r\n return {\r\n ...row,\r\n id: typeof row.id === \"string\" && row.id ? row.id : uid(),\r\n gap: row.gap ?? 12,\r\n padding: row.padding !== undefined && row.padding !== null ? row.padding : 8,\r\n bgSize: row.bgSize ?? \"cover\",\r\n bgRepeat: row.bgRepeat ?? \"no-repeat\",\r\n cells,\r\n };\r\n}\r\n\r\nfunction hydrateDesignRows(rows) {\r\n if (!Array.isArray(rows)) return rows;\r\n return rows.map(hydrateLayoutRow);\r\n}\r\n\r\nfunction withHydratedRows(result) {\r\n if (!result || !Array.isArray(result.rows)) return result;\r\n return {\r\n ...result,\r\n rows: hydrateDesignRows(result.rows),\r\n };\r\n}\r\n\r\n// Note: `normalizeEmailDesignInput` is defined above for the new `email_document` schema.\r\n\r\n/** Re-export for consumers typing `jsonToHtml` options. */\r\nexport type JsonToHtmlOptions = EmailHtmlOptions;\r\n\r\n/**\r\n * Design object or JSON string → full HTML email document (preview / send).\r\n * Strings are parsed with `JSON.parse` then normalized; invalid JSON returns `\"\"`.\r\n */\r\nexport function jsonToHtml(designInput: unknown, opts: JsonToHtmlOptions = {}): string {\r\n let raw = designInput;\r\n if (typeof raw === \"string\") {\r\n const t = raw.trim();\r\n if (!t) return \"\";\r\n try {\r\n raw = JSON.parse(t);\r\n } catch {\r\n return \"\";\r\n }\r\n }\r\n const d = normalizeEmailDesignInput(raw);\r\n if (!d?.rows?.length) return \"\";\r\n return designToHtml(d.rows, d.settings, opts);\r\n}\r\n","import { DEFAULT_BLOCK_PROPS } from \"../defaultBlockProps\";\r\nimport { normalizeRichHtmlForStorage } from \"./htmlUtils\";\r\nimport type { EmailDocument } from \"../schema/emailDocument\";\r\n\r\nconst pad = (n: number) => ({ top: n, right: n, bottom: n, left: n });\r\n\r\n/**\r\n * Pull usable HTML from a full document (`<!DOCTYPE` / `<html>`) or a fragment string.\r\n */\r\nexport function extractHtmlForDesign(html: string): string {\r\n const t = String(html ?? \"\").trim();\r\n if (!t) return \"\";\r\n const head = t.slice(0, 800).toLowerCase();\r\n if (!head.includes(\"<html\") && !head.includes(\"<!doctype\")) {\r\n return normalizeRichHtmlForStorage(t);\r\n }\r\n try {\r\n const doc = new DOMParser().parseFromString(t, \"text/html\");\r\n const body = doc.body;\r\n if (!body) return normalizeRichHtmlForStorage(t);\r\n return normalizeRichHtmlForStorage(body.innerHTML);\r\n } catch {\r\n return normalizeRichHtmlForStorage(t);\r\n }\r\n}\r\n\r\n/**\r\n * Wrap HTML (fragment or full email/page document) in a minimal `email_document`\r\n * with one row, one column, and a single **html** block — suitable for `loadJson`.\r\n *\r\n * @returns `null` when there is no non-empty HTML after extraction/normalization.\r\n */\r\nexport function htmlToEmailDesignTemplate(html: string): EmailDocument | null {\r\n const inner = extractHtmlForDesign(html);\r\n if (!inner) return null;\r\n\r\n const doc: EmailDocument = {\r\n type: \"email_document\",\r\n settings: {\r\n width: 600,\r\n backgroundColor: \"#f1f5f9\",\r\n contentBackgroundColor: \"#ffffff\",\r\n fontFamily: \"Arial, Helvetica, sans-serif\",\r\n lineHeightBase: 1.6,\r\n color: \"#111827\",\r\n responsive: true,\r\n rtl: false,\r\n },\r\n rows: [\r\n {\r\n id: \"row_html_import\",\r\n type: \"row\",\r\n layout: { columns: 1, gap: 0, stackOnMobile: true, align: \"center\" },\r\n styles: {\r\n backgroundColor: \"#ffffff\",\r\n backgroundRepeat: \"no-repeat\",\r\n backgroundSize: \"cover\",\r\n padding: pad(24),\r\n textAlign: \"left\",\r\n },\r\n columns: [\r\n {\r\n id: \"col_html_import\",\r\n layout: { width: \"100%\", verticalAlign: \"top\", mobileWidth: \"100%\" },\r\n styles: { padding: pad(0), backgroundColor: \"\" },\r\n blocks: [\r\n {\r\n id: \"block_html_import\",\r\n type: \"html\",\r\n content: inner,\r\n props: { ...DEFAULT_BLOCK_PROPS.html },\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n\r\n return doc;\r\n}\r\n\r\n/**\r\n * HTML fragment or full document → `email_document` JSON string (for `loadJson` / storage).\r\n * Returns `\"\"` when there is no non-empty HTML after extraction.\r\n */\r\nexport function htmlToJson(html: string, pretty = false): string {\r\n const doc = htmlToEmailDesignTemplate(html);\r\n if (!doc) return \"\";\r\n return pretty ? JSON.stringify(doc, null, 2) : JSON.stringify(doc);\r\n}\r\n","import {\r\n useState,\r\n useRef,\r\n useCallback,\r\n useEffect,\r\n Fragment,\r\n type CSSProperties,\r\n type DragEvent,\r\n type FC,\r\n} from \"react\";\r\nimport { SocialGlyph } from \"../../socialIcons\";\r\nimport { SC } from \"../../constants\";\r\nimport { videoUrlToEmbedSrc } from \"../../lib/htmlUtils\";\r\nimport { getColumnPropsAt } from \"../../lib/columnProps\";\r\nimport { isRootContentRow, isSplitLayoutBlock } from \"../../lib/columnPath\";\r\nimport { imageLinkActive } from \"../../defaultBlockProps\";\r\nimport { isEffectivelyEmptyRichHtml, RICH_HTML_CONTENT_CSS } from \"../../lib/htmlUtils\";\r\nimport { backdropLayerStyle, backgroundLayerStyle } from \"../../lib/blockBackground\";\r\n\r\nfunction useLiveCountdown(endDate: string) {\r\n const [diff, setDiff] = useState(0);\r\n useEffect(() => {\r\n const update = () => setDiff(Math.max(0, new Date(endDate).getTime() - Date.now()));\r\n update();\r\n const id = setInterval(update, 1000);\r\n return () => clearInterval(id);\r\n }, [endDate]);\r\n const d = Math.floor(diff / 86400000);\r\n const h = Math.floor((diff % 86400000) / 3600000);\r\n const m = Math.floor((diff % 3600000) / 60000);\r\n const s = Math.floor((diff % 60000) / 1000);\r\n return [d, h, m, s] as const;\r\n}\r\n\r\n/** Light dotted frame for split `layout` blocks in edit mode (not preview). */\r\nfunction layoutSplitChromeBorder(_C: { border: string }, preview: boolean): CSSProperties {\r\n if (preview) return {};\r\n return {\r\n border: \"1px dotted rgba(148, 163, 184, 0.5)\",\r\n boxSizing: \"border-box\",\r\n };\r\n}\r\n\r\n/** Same stroke as layout chrome; used for non-layout blocks on hover only. */\r\nconst CONTENT_BLOCK_HOVER_BORDER = \"1px dotted rgba(148, 163, 184, 0.5)\";\r\n\r\n/** Empty-cell “Drop here” row height in edit mode (px). */\r\nconst DROP_HERE_HEIGHT_PX = 45;\r\n\r\n/** Stop in-canvas navigation for `<a href>` in edit mode (rich text + button/link/image/menu/social). */\r\nfunction blockLinkCaptureHandler(preview, e) {\r\n if (preview) return;\r\n const t = e.target;\r\n if (!(t instanceof Element)) return;\r\n if (t.closest(\"a[href]\")) e.preventDefault();\r\n}\r\n\r\nconst numOrLayout = (v: unknown, fb: number) => (typeof v === \"number\" && Number.isFinite(v) ? v : fb);\r\nfunction boxPxLayout(v: any) {\r\n const top = numOrLayout(v?.top, 0);\r\n const right = numOrLayout(v?.right, top);\r\n const bottom = numOrLayout(v?.bottom, top);\r\n const left = numOrLayout(v?.left, right);\r\n return `${top}px ${right}px ${bottom}px ${left}px`;\r\n}\r\n/** Padding for layout columns (number or same box shape as block padding). */\r\nfunction paddingCssLayout(v: any) {\r\n if (typeof v === \"number\") return `${numOrLayout(v, 0)}px`;\r\n if (v && typeof v === \"object\" && !Array.isArray(v)) return boxPxLayout(v);\r\n return \"0px\";\r\n}\r\n/** Border radius for layout columns (number or per-corner like blocks). */\r\nfunction radiusCssLayout(v: any) {\r\n if (typeof v === \"number\") return `${numOrLayout(v, 0)}px`;\r\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\r\n const tl = numOrLayout(v.tl, 0);\r\n const tr = numOrLayout(v.tr, tl);\r\n const br = numOrLayout(v.br, tl);\r\n const bl = numOrLayout(v.bl, tr);\r\n return `${tl}px ${tr}px ${br}px ${bl}px`;\r\n }\r\n return \"0px\";\r\n}\r\n\r\nfunction ContentBlock({ block, selected, onClick, preview, C }) {\r\n const [hover, setHover] = useState(false);\r\n const { type, props:p } = block;\r\n\r\n const numOr = (v: unknown, fb: number) => (typeof v === \"number\" && Number.isFinite(v) ? v : fb);\r\n const boxPx = (v: any) => {\r\n const top = numOr(v?.top, 0);\r\n const right = numOr(v?.right, top);\r\n const bottom = numOr(v?.bottom, top);\r\n const left = numOr(v?.left, right);\r\n return `${top}px ${right}px ${bottom}px ${left}px`;\r\n };\r\n const paddingCss = (v: any) => {\r\n if (typeof v === \"number\") return `${numOr(v, 0)}px`;\r\n if (v && typeof v === \"object\" && !Array.isArray(v)) return boxPx(v);\r\n return \"0px\";\r\n };\r\n const marginCss = (v: any) => {\r\n if (!v || typeof v !== \"object\" || Array.isArray(v)) return \"0px\";\r\n return boxPx(v);\r\n };\r\n const radiusCss = (v: any) => {\r\n if (typeof v === \"number\") return `${numOr(v, 0)}px`;\r\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\r\n const tl = numOr(v.tl, 0);\r\n const tr = numOr(v.tr, tl);\r\n const br = numOr(v.br, tl);\r\n const bl = numOr(v.bl, tr);\r\n return `${tl}px ${tr}px ${br}px ${bl}px`;\r\n }\r\n return \"0px\";\r\n };\r\n\r\n const shellBg =\r\n type === \"button\" || type === \"timer\"\r\n ? backdropLayerStyle(p)\r\n : backgroundLayerStyle({\r\n bgColor: p.bgColor,\r\n bgImage: p.bgImage,\r\n bgSize: p.bgSize,\r\n bgRepeat: p.bgRepeat,\r\n bgPosition: p.bgPosition,\r\n bgGradient: p.bgGradient,\r\n });\r\n\r\n const wrap = (children) => (\r\n <div\r\n onClick={preview ? undefined : (onClick || undefined)}\r\n onClickCapture={(e) => blockLinkCaptureHandler(preview, e)}\r\n onAuxClickCapture={(e) => blockLinkCaptureHandler(preview, e)}\r\n onMouseEnter={preview ? undefined : () => setHover(true)}\r\n onMouseLeave={preview ? undefined : () => setHover(false)}\r\n style={{\r\n cursor: preview ? \"default\" : onClick ? \"pointer\" : \"default\",\r\n outline: selected && !preview ? `2px solid ${C.accent}` : \"2px solid transparent\",\r\n outlineOffset: 1,\r\n borderRadius: 3,\r\n transition: \"outline .12s, border-color .12s\",\r\n position: \"relative\",\r\n ...(preview\r\n ? {}\r\n : {\r\n border: hover ? CONTENT_BLOCK_HOVER_BORDER : \"1px solid transparent\",\r\n boxSizing: \"border-box\",\r\n }),\r\n ...shellBg,\r\n padding: paddingCss(p.padding),\r\n margin: marginCss(p.margin),\r\n }}\r\n >\r\n {children}\r\n </div>\r\n );\r\n\r\n if (type===\"heading\") return wrap(\r\n <div style={{fontSize:p.fontSize,color:p.color,textAlign:p.align,fontWeight:(p.fontWeight|| (p.bold?700:400)) as any,letterSpacing:`${p.letterSpacing||0}px`,lineHeight:p.lineHeight||1.2,fontFamily:p.fontFamily||\"Georgia,serif\"}}\r\n dangerouslySetInnerHTML={{__html:`<${p.level||\"h2\"} style=\"margin:0\">${p.content}</${p.level||\"h2\"}`}}/>\r\n );\r\n if (type===\"text\") return wrap(\r\n <div style={{fontSize:p.fontSize,color:p.color,textAlign:p.align,fontWeight:(p.fontWeight|| (p.bold?700:400)) as any,fontStyle:p.italic?\"italic\":\"normal\",textDecoration:p.underline?\"underline\":\"none\",lineHeight:p.lineHeight||1.65,letterSpacing:`${p.letterSpacing||0}px`,fontFamily:p.fontFamily||\"Georgia,serif\"}}\r\n dangerouslySetInnerHTML={{__html:p.content}}/>\r\n );\r\n if (type===\"html\") {\r\n const richHtml = typeof block.content === \"string\" ? block.content : (p as { content?: string }).content;\r\n const emptyRich = isEffectivelyEmptyRichHtml(richHtml);\r\n return wrap(\r\n <div style={{ position: \"relative\", minHeight: emptyRich && !preview ? \"2.75em\" : undefined }}>\r\n <style>{RICH_HTML_CONTENT_CSS}</style>\r\n <div\r\n className=\"email-editor-rich-canvas email-rich-html-content\"\r\n style={{\r\n fontSize: p.fontSize,\r\n color: p.color,\r\n textAlign: p.align,\r\n lineHeight: p.lineHeight || 1.65,\r\n letterSpacing: `${p.letterSpacing || 0}px`,\r\n fontFamily: p.fontFamily || \"Georgia,serif\",\r\n wordBreak: \"break-word\",\r\n minHeight: emptyRich && !preview ? \"2.75em\" : undefined,\r\n }}\r\n dangerouslySetInnerHTML={{ __html: richHtml || \"<p></p>\" }}\r\n />\r\n {emptyRich && !preview ? (\r\n <span\r\n aria-hidden\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n fontSize: p.fontSize,\r\n lineHeight: p.lineHeight || 1.65,\r\n letterSpacing: `${p.letterSpacing || 0}px`,\r\n fontFamily: p.fontFamily || \"Georgia,serif\",\r\n textAlign: (p.align as CSSProperties[\"textAlign\"]) || \"left\",\r\n color: C.muted,\r\n fontStyle: \"italic\",\r\n pointerEvents: \"none\",\r\n paddingTop: 2,\r\n zIndex: 1,\r\n }}\r\n >\r\n Empty rich text — edit in the sidebar\r\n </span>\r\n ) : null}\r\n </div>\r\n );\r\n }\r\n if (type===\"image\") {\r\n const img = (\r\n <img\r\n src={p.src}\r\n alt={p.alt||\"\"}\r\n style={{\r\n maxWidth: p.width || \"100%\",\r\n width: p.width && p.width !== \"100%\" ? p.width : undefined,\r\n height: \"auto\",\r\n display: \"block\",\r\n marginLeft: p.align === \"center\" ? \"auto\" : undefined,\r\n marginRight: p.align === \"center\" ? \"auto\" : undefined,\r\n borderRadius: radiusCss(p.borderRadius),\r\n objectFit: p.objectFit || \"cover\",\r\n objectPosition: p.objectPosition || \"center\",\r\n }}\r\n />\r\n );\r\n return wrap(<div style={{textAlign:p.align}}>{imageLinkActive(p) ? <a href={p.link} target={p.linkTarget||\"_blank\"} rel=\"noopener\">{img}</a> : img}</div>);\r\n }\r\n if (type===\"button\") return wrap(\r\n <div style={{textAlign:p.fullWidth?\"center\":p.align}}>\r\n <a href={p.href} target={p.linkTarget||\"_blank\"} rel=\"noopener\"\r\n style={{display:p.fullWidth?\"block\":\"inline-block\",backgroundColor:p.bgColor,color:p.textColor,borderRadius:radiusCss(p.borderRadius),padding:`${p.paddingV||11}px ${p.paddingH||24}px`,textDecoration:\"none\",fontSize:p.fontSize,fontWeight:p.fontWeight||600,fontFamily:\"sans-serif\",border:`${p.borderWidth||0}px solid ${p.borderColor||\"transparent\"}`,width:p.fullWidth?\"100%\":undefined,textAlign:\"center\",boxSizing:\"border-box\"}}>\r\n {p.label}\r\n </a>\r\n </div>\r\n );\r\n if (type===\"link\") return wrap(\r\n <div style={{textAlign:p.align}}>\r\n <a href={p.href} target={p.linkTarget||\"_blank\"} rel=\"noopener noreferrer\"\r\n style={{color:p.color,fontSize:p.fontSize,fontWeight:(p.fontWeight|| (p.bold?700:400)) as any,textDecoration:p.underline?\"underline\":\"none\",fontFamily:p.fontFamily||\"Arial, Helvetica, sans-serif\"}}>\r\n {p.label}\r\n </a>\r\n </div>\r\n );\r\n if (type===\"divider\") return wrap(<hr style={{border:\"none\",borderTop:`${p.thickness}px ${p.style||\"solid\"} ${p.color}`,margin:0}}/>);\r\n if (type===\"spacer\") return wrap(<div style={{height:p.height,background:selected&&!preview?\"rgba(99,102,241,.05)\":\"transparent\"}}/>);\r\n if (type===\"social\") {\r\n const urls = p.socialUrls || {};\r\n return wrap(\r\n <div style={{textAlign:p.align}}>\r\n {(p.networks||[]).map(n=>{\r\n const href = (urls[n] && String(urls[n]).trim()) || \"#\";\r\n const glyphPx = Math.round((p.iconSize || 24) * 0.56);\r\n const inner = (\r\n <span style={{display:\"inline-flex\",alignItems:\"center\",justifyContent:\"center\",width:p.iconSize,height:p.iconSize,borderRadius:p.shape===\"square\"?\"4px\":\"50%\",background:SC[n]||\"#64748b\",color:n===\"snapchat\"?\"#000\":\"#fff\"}}>\r\n <SocialGlyph network={n} size={glyphPx} />\r\n </span>\r\n );\r\n return href === \"#\" ? (\r\n <span key={n} title={n} style={{display:\"inline-flex\",margin:`0 ${p.gap||4}px`,cursor:\"default\"}}>{inner}</span>\r\n ) : (\r\n <a key={n} href={href} title={n} target=\"_blank\" rel=\"noopener noreferrer\" style={{display:\"inline-flex\",margin:`0 ${p.gap||4}px`,textDecoration:\"none\"}}>\r\n {inner}\r\n </a>\r\n );\r\n })}\r\n </div>\r\n );\r\n }\r\n if (type===\"video\") {\r\n const embedSrc = videoUrlToEmbedSrc(p.src);\r\n return wrap(\r\n <div style={{textAlign:\"center\"}}>\r\n {embedSrc ? (\r\n <iframe src={embedSrc} width=\"100%\" height={p.height} frameBorder=\"0\"\r\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\r\n allowFullScreen style={{maxWidth:\"100%\",borderRadius:5,display:\"block\"}} title=\"video\"/>\r\n ) : (\r\n <div style={{width:\"100%\",height:p.height,background:\"#f4f8ff\",borderRadius:5,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",flexDirection:\"column\",gap:8,border:\"2px dashed #d0dff0\"}}>\r\n <span style={{fontSize:32}}>▶</span>\r\n <span style={{fontSize:12,color:\"#5a7a9a\"}}>Paste a YouTube or Vimeo URL</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n if (type===\"menu\") return wrap(\r\n <nav style={{textAlign:p.align}}>\r\n {(p.items||[]).map((item,i)=>(\r\n <a key={i} href={item.href} style={{fontSize:p.fontSize,color:p.color,margin:`0 ${p.gap||10}px`,textDecoration:\"none\",fontFamily:\"sans-serif\",fontWeight:600}}>{item.label}</a>\r\n ))}\r\n </nav>\r\n );\r\n if (type===\"timer\") {\r\n // eslint-disable-next-line react-hooks/rules-of-hooks\r\n const [d,h,m,s] = useLiveCountdown(p.endDate);\r\n return wrap(\r\n <div style={{textAlign:p.align}}>\r\n {p.label&&<div style={{fontSize:12,color:\"#64748b\",marginBottom:6,fontFamily:\"sans-serif\"}}>{p.label}</div>}\r\n <div style={{display:\"inline-flex\",gap:6}}>\r\n {[[d,\"Days\"],[h,\"Hrs\"],[m,\"Min\"],[s,\"Sec\"]].map(([val,lbl])=>(\r\n <div key={lbl} style={{background:p.bgColor,color:p.textColor,borderRadius:p.borderRadius,padding:\"8px 14px\",fontFamily:\"monospace\",fontWeight:700,fontSize:20,minWidth:52,textAlign:\"center\",lineHeight:1}}>\r\n <div>{String(val).padStart(2,\"0\")}</div>\r\n {p.showLabels&&<div style={{fontSize:9,opacity:.75,letterSpacing:\".08em\",marginTop:3}}>{String(lbl).toUpperCase()}</div>}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n }\r\n if (type===\"table\") {\r\n const data = p.data || [];\r\n const role = p.tableRole === \"presentation\" ? \"presentation\" : \"table\";\r\n const cellPaddingStyle = (() => {\r\n const cp = p.cellPadding;\r\n if (cp && typeof cp === \"object\" && !Array.isArray(cp)) {\r\n return boxPx(cp);\r\n }\r\n const cellPadPx =\r\n typeof cp === \"number\" && Number.isFinite(cp)\r\n ? cp\r\n : typeof p.padding === \"number\" && Number.isFinite(p.padding)\r\n ? p.padding\r\n : numOr((p.padding as { top?: number })?.top, 8);\r\n return cellPadPx;\r\n })();\r\n return wrap(\r\n <div style={{overflowX:\"auto\"}}>\r\n <table\r\n role={role}\r\n style={{width:\"100%\",borderCollapse:\"collapse\",fontSize:p.fontSize||13,fontFamily:p.fontFamily||\"sans-serif\",tableLayout:\"fixed\"}}\r\n >\r\n <tbody>\r\n {data.map((row, ri) => {\r\n const isHeaderRow = !!p.header && ri === 0;\r\n const isStriped =\r\n p.striped &&\r\n (p.header ? ri > 1 && ri % 2 === 0 : ri > 0 && ri % 2 === 1);\r\n return (\r\n <tr key={ri}>\r\n {row.map((cell, ci) => {\r\n const CellTag = isHeaderRow ? \"th\" : \"td\";\r\n return (\r\n <CellTag\r\n key={ci}\r\n scope={isHeaderRow ? \"col\" : undefined}\r\n style={{\r\n padding: typeof cellPaddingStyle === \"string\" ? cellPaddingStyle : `${cellPaddingStyle}px`,\r\n background: isHeaderRow ? (p.headerBg||\"#1a5fbe\") : isStriped ? (p.stripedBg||\"#f4f8ff\") : (p.cellBg||\"#ffffff\"),\r\n color: isHeaderRow ? (p.headerColor||\"#ffffff\") : \"inherit\",\r\n border:`1px solid ${p.cellBorder||\"#d0dff0\"}`,\r\n fontWeight: isHeaderRow ? 700 : 400,\r\n textAlign:\"left\",\r\n wordBreak:\"break-word\",\r\n }}\r\n >\r\n {cell}\r\n </CellTag>\r\n );\r\n })}\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n }\r\n return null;\r\n}\r\n\r\n// ─── NESTED LAYOUT (columns inside a column) ─────────────────────────────────\r\nfunction NestedRowBlock({\r\n block,\r\n rowId,\r\n cellIdx,\r\n parentBlockIdx,\r\n /** When this layout sits inside another layout column, meta uses `contentIdx` + `inner` like other nested blocks. */\r\n selectionInner,\r\n editorId,\r\n selectedKey,\r\n selContentMeta,\r\n onSelectContent,\r\n onDropContent,\r\n onDeleteContent,\r\n onContextMenu,\r\n preview,\r\n C,\r\n}) {\r\n const p = block.props;\r\n const rowSelected =\r\n !preview &&\r\n selContentMeta &&\r\n selContentMeta.rowId === rowId &&\r\n selContentMeta.cellIdx === cellIdx &&\r\n selectedKey === block.id &&\r\n (selectionInner == null\r\n ? selContentMeta.contentIdx === parentBlockIdx && !selContentMeta.inner\r\n : selContentMeta.contentIdx === parentBlockIdx &&\r\n selContentMeta.inner &&\r\n selContentMeta.inner.cellIdx === selectionInner.cellIdx &&\r\n selContentMeta.inner.contentIdx === selectionInner.contentIdx);\r\n const rowStyle: CSSProperties = {\r\n padding: p.padding ?? 8,\r\n position: \"relative\",\r\n borderRadius: 4,\r\n outline: rowSelected ? `2px solid ${C.accent}` : \"2px solid transparent\",\r\n outlineOffset: 1,\r\n transition: \"outline .12s\",\r\n ...layoutSplitChromeBorder(C, preview),\r\n ...backgroundLayerStyle({\r\n bgColor: p.bgColor,\r\n bgImage: p.bgImage,\r\n bgSize: p.bgSize,\r\n bgRepeat: p.bgRepeat,\r\n bgPosition: p.bgPosition,\r\n bgGradient: p.bgGradient,\r\n }),\r\n };\r\n return (\r\n <div\r\n style={rowStyle}\r\n onClick={\r\n preview\r\n ? undefined\r\n : (e) => {\r\n e.stopPropagation();\r\n onSelectContent(\r\n block.id,\r\n rowId,\r\n cellIdx,\r\n parentBlockIdx,\r\n selectionInner ?? null,\r\n );\r\n }\r\n }\r\n >\r\n <div style={{ display: \"flex\", gap: p.gap ?? 12 }}>\r\n {(p.cells || []).map((innerBlocks, ici) => {\r\n const cS = getColumnPropsAt(p, ici);\r\n return (\r\n <div\r\n key={ici}\r\n style={{\r\n flex: p.ratios?.[ici] ?? 1,\r\n minWidth: 0,\r\n minHeight: preview ? undefined : DROP_HERE_HEIGHT_PX,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n ...layoutSplitChromeBorder(C, preview),\r\n ...backgroundLayerStyle(cS),\r\n padding: paddingCssLayout(cS.padding),\r\n borderRadius: radiusCssLayout(cS.borderRadius),\r\n position: \"relative\",\r\n }}\r\n >\r\n <Cell\r\n editorId={editorId}\r\n rowId={rowId}\r\n cellIdx={cellIdx}\r\n nest={{ parentBlockIdx }}\r\n innerCellIdx={ici}\r\n blocks={innerBlocks}\r\n selectedKey={selectedKey}\r\n selContentMeta={selContentMeta}\r\n onSelectContent={onSelectContent}\r\n onDropContent={onDropContent}\r\n onDeleteContent={onDeleteContent}\r\n onContextMenu={onContextMenu}\r\n preview={preview}\r\n C={C}\r\n />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── BLOCK ITEM — pointer-down selects; drag block surface to reorder / move ──\r\nfunction BlockItem({\r\n editorId,\r\n cb,\r\n ci,\r\n rowId,\r\n cellIdx,\r\n nest,\r\n innerCellIdx = 0,\r\n selectedKey,\r\n selContentMeta,\r\n onSelectContent,\r\n onDropContent,\r\n onDeleteContent,\r\n onContextMenu,\r\n preview,\r\n C,\r\n Line,\r\n dragAsRow = false,\r\n beginRowDrag,\r\n}) {\r\n const wrapperRef = useRef(null);\r\n const bid = editorId ? `${editorId}-block-${cb.id}` : undefined;\r\n\r\n const selectThisBlock = (e) => {\r\n if (!onSelectContent) return;\r\n e.stopPropagation();\r\n if (isSplitLayoutBlock(cb)) {\r\n onSelectContent(\r\n cb.id,\r\n rowId,\r\n cellIdx,\r\n nest ? nest.parentBlockIdx : ci,\r\n nest ? { cellIdx: innerCellIdx, contentIdx: ci } : null,\r\n );\r\n } else {\r\n onSelectContent(\r\n cb.id,\r\n rowId,\r\n cellIdx,\r\n nest ? nest.parentBlockIdx : ci,\r\n nest ? { cellIdx: innerCellIdx, contentIdx: ci } : null,\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n id={bid}\r\n ref={wrapperRef}\r\n style={{ position:\"relative\" }}\r\n onContextMenu={e => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onContextMenu && onContextMenu(\r\n e,\r\n rowId,\r\n cellIdx,\r\n ci,\r\n nest ? { parentBlockIdx: nest.parentBlockIdx, cellIdx: innerCellIdx, contentIdx: ci } : null,\r\n );\r\n }}\r\n >\r\n <div\r\n data-bidx={ci}\r\n draggable={!preview}\r\n title={\r\n preview\r\n ? undefined\r\n : dragAsRow\r\n ? \"Click to select · drag to reorder section\"\r\n : \"Click to select · drag to reorder or move\"\r\n }\r\n onPointerDown={(e) => {\r\n if (preview || e.button !== 0) return;\r\n selectThisBlock(e);\r\n }}\r\n onDragStart={(e) => {\r\n if (preview) return;\r\n e.stopPropagation();\r\n if (dragAsRow && beginRowDrag) {\r\n beginRowDrag(e);\r\n return;\r\n }\r\n e.dataTransfer.effectAllowed = \"move\";\r\n e.dataTransfer.setData(\r\n \"application/json\",\r\n JSON.stringify({\r\n moveContent: {\r\n fromRow: rowId,\r\n fromCell: cellIdx,\r\n fromIdx: ci,\r\n fromNested: nest ? { parentBlockIdx: nest.parentBlockIdx, innerCellIdx } : undefined,\r\n },\r\n }),\r\n );\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n style={{\r\n position: \"relative\",\r\n width: \"100%\",\r\n minWidth: 0,\r\n cursor: preview ? \"default\" : \"grab\",\r\n paddingLeft: 0,\r\n boxSizing: \"border-box\",\r\n }}\r\n >\r\n {isSplitLayoutBlock(cb) ? (\r\n <NestedRowBlock\r\n block={cb}\r\n rowId={rowId}\r\n cellIdx={cellIdx}\r\n parentBlockIdx={nest ? nest.parentBlockIdx : ci}\r\n selectionInner={nest ? { cellIdx: innerCellIdx, contentIdx: ci } : null}\r\n editorId={editorId}\r\n selectedKey={selectedKey}\r\n selContentMeta={selContentMeta}\r\n onSelectContent={onSelectContent}\r\n onDropContent={onDropContent}\r\n onDeleteContent={onDeleteContent}\r\n onContextMenu={onContextMenu}\r\n preview={preview}\r\n C={C}\r\n />\r\n ) : (\r\n <ContentBlock\r\n block={cb}\r\n selected={selectedKey === cb.id}\r\n onClick={undefined}\r\n preview={preview}\r\n C={C}\r\n />\r\n )}\r\n </div>\r\n\r\n <Line idx={ci + 1} />\r\n </div>\r\n );\r\n}\r\n\r\n// ─── CELL (positional drag-and-drop) ─────────────────────────────────────────\r\nfunction Cell({\r\n editorId,\r\n rowId,\r\n cellIdx,\r\n nest = undefined,\r\n innerCellIdx = 0,\r\n blocks,\r\n selectedKey,\r\n selContentMeta,\r\n onSelectContent,\r\n onDropContent,\r\n onDeleteContent,\r\n onContextMenu,\r\n preview,\r\n C,\r\n dragAsRow = false,\r\n beginRowDrag,\r\n}) {\r\n const [insertAt, setInsertAt] = useState(null);\r\n const cellRef = useRef(null);\r\n\r\n const calcIdx = useCallback((clientY) => {\r\n if (!cellRef.current) return blocks.length;\r\n const els = cellRef.current.querySelectorAll(\"[data-bidx]\");\r\n if (!els.length) return 0;\r\n for (let i=0; i<els.length; i++) {\r\n const r = els[i].getBoundingClientRect();\r\n if (clientY < r.top + r.height/2) return i;\r\n }\r\n return els.length;\r\n },[blocks.length]);\r\n\r\n const handleDragOver = (e) => {\r\n try {\r\n const raw = e.dataTransfer.getData(\"application/json\");\r\n if (raw) {\r\n const data = JSON.parse(raw);\r\n if (data.moveRowId) return;\r\n }\r\n } catch {\r\n /* types may be unavailable until drop in some browsers */\r\n }\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setInsertAt(calcIdx(e.clientY));\r\n };\r\n const handleDragLeave = (e) => { if (!cellRef.current?.contains(e.relatedTarget)) setInsertAt(null); };\r\n const nestedPayload = nest ? { parentBlockIdx: nest.parentBlockIdx, innerCellIdx } : undefined;\r\n\r\n const handleDrop = (e) => {\r\n e.preventDefault(); e.stopPropagation();\r\n const idx = calcIdx(e.clientY); setInsertAt(null);\r\n try {\r\n const data = JSON.parse(e.dataTransfer.getData(\"application/json\")||\"{}\");\r\n if (data.moveRowId) return;\r\n if (data.contentType) {\r\n onDropContent(rowId, cellIdx, { kind: \"new\", contentType: data.contentType, insertAt: idx, nested: nestedPayload });\r\n } else if (data.moveContent) {\r\n onDropContent(rowId, cellIdx, { kind: \"move\", ...data.moveContent, insertAt: idx, nested: nestedPayload });\r\n }\r\n } catch {}\r\n };\r\n\r\n const Line = ({idx}) => insertAt===idx ? (\r\n <div style={{position:\"relative\",height:3,margin:\"2px 0\",background:C.accent,borderRadius:2,zIndex:50,pointerEvents:\"none\"}}>\r\n <div style={{position:\"absolute\",left:-4,top:\"50%\",transform:\"translateY(-50%)\",width:8,height:8,borderRadius:\"50%\",background:C.accent}}/>\r\n <div style={{position:\"absolute\",right:-4,top:\"50%\",transform:\"translateY(-50%)\",width:8,height:8,borderRadius:\"50%\",background:C.accent}}/>\r\n </div>\r\n ) : null;\r\n\r\n const cellEmpty = !preview && blocks.length === 0;\r\n\r\n return (\r\n <div\r\n id={editorId ? `${editorId}-cell-${rowId}-${cellIdx}` : undefined}\r\n ref={cellRef} onDragOver={handleDragOver} onDragLeave={handleDragLeave} onDrop={handleDrop}\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n minHeight: preview ? undefined : cellEmpty ? DROP_HERE_HEIGHT_PX : 44,\r\n borderRadius: 4,\r\n ...(preview\r\n ? {}\r\n : insertAt !== null && !cellEmpty\r\n ? { border: `1px dotted ${C.accent}`, background: `${C.accent}0a` }\r\n : {}),\r\n background: insertAt !== null && !cellEmpty ? `${C.accent}0a` : \"transparent\",\r\n transition: \"border-color .15s,background .15s\",\r\n padding: preview ? 0 : 0,\r\n position: \"relative\",\r\n }}\r\n >\r\n {cellEmpty && (\r\n <div\r\n style={{\r\n height: DROP_HERE_HEIGHT_PX,\r\n minHeight: DROP_HERE_HEIGHT_PX,\r\n maxHeight: DROP_HERE_HEIGHT_PX,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n margin: 0,\r\n borderRadius: 6,\r\n boxSizing: \"border-box\",\r\n textAlign: \"center\",\r\n userSelect: \"none\",\r\n transition: \"color .15s, border-color .15s, background .15s, box-shadow .15s\",\r\n border:\r\n insertAt !== null\r\n ? `2px dashed ${C.accent}`\r\n : `2px dashed ${C.border}`,\r\n background: insertAt !== null ? `${C.accent}14` : `${C.canvas}`,\r\n boxShadow:\r\n insertAt !== null\r\n ? `inset 0 0 0 1px ${C.accent}22`\r\n : `inset 0 0 0 1px ${C.border}99`,\r\n color: insertAt !== null ? C.accent2 : C.muted,\r\n fontSize: 10,\r\n fontWeight: insertAt !== null ? 700 : 500,\r\n letterSpacing: \"0.02em\",\r\n }}\r\n >\r\n {insertAt !== null ? \"Release to drop\" : \"Drop here\"}\r\n </div>\r\n )}\r\n <Line idx={0}/>\r\n {blocks.map((cb, ci) => (\r\n <Fragment key={cb.id}>\r\n <BlockItem\r\n editorId={editorId}\r\n cb={cb}\r\n ci={ci}\r\n rowId={rowId}\r\n cellIdx={cellIdx}\r\n nest={nest}\r\n innerCellIdx={innerCellIdx}\r\n selectedKey={selectedKey}\r\n selContentMeta={selContentMeta}\r\n onSelectContent={onSelectContent}\r\n onDropContent={onDropContent}\r\n onDeleteContent={onDeleteContent}\r\n onContextMenu={onContextMenu}\r\n preview={preview}\r\n C={C}\r\n Line={Line}\r\n dragAsRow={dragAsRow && blocks.length === 1 && ci === 0}\r\n beginRowDrag={beginRowDrag}\r\n />\r\n </Fragment>\r\n ))}\r\n\r\n </div>\r\n );\r\n}\r\n\r\n// ─── LAYOUT ROW ──────────────────────────────────────────────────────────────\r\nfunction LayoutRow({\r\n editorId,\r\n row,\r\n selected,\r\n onClick,\r\n selectedContentKey,\r\n selContentMeta,\r\n onSelectContent,\r\n onDropContent,\r\n onDeleteContent,\r\n onContextMenu,\r\n onLayoutContextMenu,\r\n setSelectedRowId,\r\n preview = false,\r\n rootContentRow = false,\r\n beginRowDrag,\r\n C,\r\n}) {\r\n const rowStyle: CSSProperties = {\r\n outline: selected&&!preview ? `2px solid ${C.accent}` : \"2px solid transparent\",\r\n outlineOffset:2, borderRadius:5, transition:\"outline .12s\",\r\n padding:row.padding, position:\"relative\",\r\n ...backgroundLayerStyle({\r\n bgColor: row.bgColor,\r\n bgImage: row.bgImage,\r\n bgSize: row.bgSize,\r\n bgRepeat: row.bgRepeat,\r\n bgPosition: row.bgPosition,\r\n bgGradient: row.bgGradient,\r\n }),\r\n };\r\n return (\r\n <div\r\n id={editorId ? `${editorId}-layout-${row.id}` : undefined}\r\n onClick={preview ? undefined : onClick}\r\n onPointerDown={\r\n preview || !onClick\r\n ? undefined\r\n : (e) => {\r\n if (e.button !== 0) return;\r\n /** Row shell only — columns/cells stop propagation. Draggable rows often omit `click`; pointerdown still fires. */\r\n if (e.target !== e.currentTarget) return;\r\n onClick();\r\n }\r\n }\r\n onContextMenu={\r\n preview || !onLayoutContextMenu\r\n ? undefined\r\n : (e) => {\r\n onLayoutContextMenu(e, row.id);\r\n }\r\n }\r\n style={rowStyle}\r\n >\r\n <div style={{display:\"flex\",gap:row.gap}}>\r\n {row.cells.map((cellBlocks,ci)=>{\r\n const cS = getColumnPropsAt(row, ci);\r\n return (\r\n <div key={ci} id={editorId ? `${editorId}-col-${row.id}-${ci}` : undefined} \r\n style={{\r\n flex:row.ratios[ci]??1,\r\n minHeight: preview ? 50 : DROP_HERE_HEIGHT_PX,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n ...backgroundLayerStyle(cS),\r\n padding: paddingCssLayout(cS.padding),\r\n borderRadius: radiusCssLayout(cS.borderRadius),\r\n transition: \"all 0.2s\",\r\n position: \"relative\",\r\n }}\r\n onClick={(e) => {\r\n if(preview) return;\r\n e.stopPropagation();\r\n // Select row AND column simultaneously\r\n setSelectedRowId(row.id);\r\n onSelectContent(null, row.id, ci, -1, null);\r\n }}\r\n >\r\n <Cell\r\n editorId={editorId}\r\n rowId={row.id}\r\n cellIdx={ci}\r\n blocks={cellBlocks}\r\n selectedKey={selectedContentKey}\r\n selContentMeta={selContentMeta}\r\n onSelectContent={onSelectContent}\r\n onDropContent={onDropContent}\r\n onDeleteContent={onDeleteContent}\r\n onContextMenu={onContextMenu}\r\n preview={preview}\r\n C={C}\r\n dragAsRow={rootContentRow && ci === 0}\r\n beginRowDrag={beginRowDrag}\r\n />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── CANVAS ROW ───────────────────────────────────────────────────────────────\r\nexport type CanvasRowProps = {\r\n editorId: string;\r\n row: any;\r\n ri: number;\r\n selectedRowId: any;\r\n selContentMeta: any;\r\n dragOver: any;\r\n draggingRowId: string | null;\r\n C: any;\r\n setDragOver: (v: any) => void;\r\n handleRowDrop: (ri: number, e: any) => void;\r\n setRowDrag: (id: string | null) => void;\r\n setSelectedRowId: (v: any) => void;\r\n setSelContentId: (v: any) => void;\r\n setSelMeta: (v: any) => void;\r\n selectContent: (...args: any[]) => void;\r\n dropContent: (...args: any[]) => void;\r\n deleteContent: (...args: any[]) => void;\r\n handleContextMenu: (...args: any[]) => void;\r\n handleLayoutContextMenu: (...args: any[]) => void;\r\n selContentId: any;\r\n};\r\n\r\nconst CanvasRow: FC<CanvasRowProps> = ({\r\n editorId,\r\n row,\r\n ri,\r\n selectedRowId,\r\n selContentMeta: rowSelContentMeta,\r\n dragOver,\r\n draggingRowId,\r\n C,\r\n setDragOver,\r\n handleRowDrop,\r\n setRowDrag,\r\n setSelectedRowId,\r\n setSelContentId,\r\n setSelMeta,\r\n selectContent,\r\n dropContent,\r\n deleteContent,\r\n handleContextMenu,\r\n handleLayoutContextMenu,\r\n selContentId,\r\n}) => {\r\n const rowSelected = selectedRowId === row.id;\r\n const rid = (s) => (editorId ? `${editorId}-${s}` : undefined);\r\n const dropH = dragOver === ri || dragOver === ri + 1 ? 28 : 10;\r\n const rowBodyRef = useRef<HTMLDivElement>(null);\r\n const rootContentRow = isRootContentRow(row);\r\n\r\n const beginRowDrag = useCallback(\r\n (e: DragEvent) => {\r\n e.stopPropagation();\r\n e.dataTransfer.effectAllowed = \"move\";\r\n e.dataTransfer.setData(\r\n \"application/json\",\r\n JSON.stringify({ moveRowId: row.id }),\r\n );\r\n setRowDrag(row.id);\r\n },\r\n [row.id, setRowDrag],\r\n );\r\n\r\n const rowDragOver = useCallback(\r\n (e: DragEvent) => {\r\n if (!draggingRowId || draggingRowId === row.id) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const el = rowBodyRef.current;\r\n if (!el) {\r\n setDragOver(ri);\r\n return;\r\n }\r\n const rect = el.getBoundingClientRect();\r\n setDragOver(e.clientY < rect.top + rect.height / 2 ? ri : ri + 1);\r\n },\r\n [draggingRowId, row.id, ri, setDragOver],\r\n );\r\n\r\n const rowDrop = useCallback(\r\n (e: DragEvent) => {\r\n if (!draggingRowId) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const el = rowBodyRef.current;\r\n let targetIdx = ri;\r\n if (el) {\r\n const rect = el.getBoundingClientRect();\r\n targetIdx = e.clientY < rect.top + rect.height / 2 ? ri : ri + 1;\r\n }\r\n handleRowDrop(targetIdx, e);\r\n },\r\n [draggingRowId, ri, handleRowDrop],\r\n );\r\n\r\n return (\r\n <div\r\n id={rid(`canvas-row-${row.id}`)}\r\n style={{ display: \"flex\", alignItems: \"stretch\", gap: 0, margin: \"2px 0\" }}\r\n >\r\n <div\r\n draggable\r\n title=\"Drag to reorder section\"\r\n onDragStart={beginRowDrag}\r\n onDragEnd={() => setRowDrag(null)}\r\n onPointerDown={(e) => e.stopPropagation()}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setSelectedRowId(row.id);\r\n setSelContentId(null);\r\n setSelMeta(null);\r\n }}\r\n onContextMenu={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n handleLayoutContextMenu(e, row.id);\r\n }}\r\n style={{\r\n width: 20,\r\n flexShrink: 0,\r\n cursor: \"grab\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n color: rowSelected ? C.accent : C.muted,\r\n fontSize: 12,\r\n fontWeight: 700,\r\n letterSpacing: -3,\r\n userSelect: \"none\",\r\n opacity: rowSelected ? 1 : 0.5,\r\n }}\r\n >\r\n ⋮⋮\r\n </div>\r\n\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div\r\n id={rid(`row-drop-before-${ri}`)}\r\n onDragOver={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setDragOver(ri);\r\n }}\r\n onDragLeave={() => setDragOver(null)}\r\n onDrop={(e) => handleRowDrop(ri, e)}\r\n style={{\r\n height: dropH,\r\n background: dragOver === ri ? `${C.accent}25` : \"transparent\",\r\n border: dragOver === ri ? `2px dashed ${C.accent}` : \"2px solid transparent\",\r\n borderRadius: 4,\r\n transition: \"all .12s\",\r\n boxSizing: \"border-box\",\r\n }}\r\n />\r\n\r\n <div\r\n ref={rowBodyRef}\r\n id={rid(`row-body-${row.id}`)}\r\n onDragOver={rowDragOver}\r\n onDrop={rowDrop}\r\n style={{\r\n position: \"relative\",\r\n width: \"100%\",\r\n minWidth: 0,\r\n boxSizing: \"border-box\",\r\n outline:\r\n draggingRowId && draggingRowId !== row.id && (dragOver === ri || dragOver === ri + 1)\r\n ? `2px dashed ${C.accent}`\r\n : undefined,\r\n outlineOffset: 2,\r\n borderRadius: 6,\r\n }}\r\n >\r\n <div id={rid(`row-layout-wrap-${row.id}`)} style={{ width: \"100%\", minWidth: 0 }}>\r\n <LayoutRow\r\n editorId={editorId}\r\n row={row}\r\n selected={rowSelected}\r\n setSelectedRowId={setSelectedRowId}\r\n onClick={() => {\r\n setSelectedRowId(row.id);\r\n setSelContentId(null);\r\n setSelMeta(null);\r\n }}\r\n selectedContentKey={selContentId}\r\n selContentMeta={rowSelContentMeta}\r\n onSelectContent={selectContent}\r\n onDropContent={dropContent}\r\n onDeleteContent={deleteContent}\r\n onContextMenu={handleContextMenu}\r\n onLayoutContextMenu={handleLayoutContextMenu}\r\n rootContentRow={rootContentRow}\r\n beginRowDrag={beginRowDrag}\r\n C={C}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport { CanvasRow };\r\n","import { useRef, useState, useEffect, useMemo, Fragment, type CSSProperties, type FC, type ReactNode } from \"react\";\nimport {\n AlignCenter,\n AlignJustify,\n AlignLeft,\n AlignRight,\n Image as ImageIcon,\n Upload as UploadIcon,\n Droplets as SolidIcon,\n Blend as GradientIcon,\n Scaling,\n Crosshair,\n} from \"lucide-react\";\nimport { ALL_NETWORKS } from \"../../constants\";\nimport { videoSrcForEditorDisplay } from \"../../lib/htmlUtils\";\nimport { TextRichEditor } from \"./TextRichEditor\";\nimport { normalizeRichHtmlForStorage } from \"../../lib/htmlUtils\";\nimport {\n getColumnPropsAt,\n getColumns,\n patchColumnPropsAt,\n withColumnsOnly,\n} from \"../../lib/columnProps\";\nimport { ColorSwatchGrid } from \"./ColorSwatchGrid\";\n\n/** UI label (internal key stays `twitter` for saved designs). */\nfunction socialNetworkLabel(network) {\n return network === \"twitter\" ? \"X\" : network;\n}\n\nconst pad2 = (n: number) => String(n).padStart(2, \"0\");\n\n/** Timer `endDate`: ISO string or legacy `YYYY-MM-DD` (local midnight). */\nfunction parseTimerEndDate(value: string | undefined): Date {\n const s = (value || \"\").trim();\n if (!s) return new Date(Date.now() + 7 * 864e5);\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) {\n const [y, m, d] = s.split(\"-\").map(Number);\n return new Date(y, m - 1, d, 0, 0, 0, 0);\n }\n const t = Date.parse(s);\n if (!Number.isNaN(t)) return new Date(t);\n return new Date(Date.now() + 7 * 864e5);\n}\n\nfunction formatDateInputLocal(d: Date): string {\n return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\nfunction formatTimeInputLocal(d: Date): string {\n return `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\n/** Persist as UTC ISO so countdown / export stay consistent. */\nfunction combineLocalDateTime(dateStr: string, timeStr: string): string {\n const [y, m, d] = dateStr.split(\"-\").map(Number);\n const parts = (timeStr || \"00:00\").split(\":\");\n const hh = Number(parts[0]) || 0;\n const mm = Number(parts[1]) || 0;\n const dt = new Date(y, (m || 1) - 1, d || 1, hh, mm, 0, 0);\n return dt.toISOString();\n}\n\nconst PR: FC<{ label: ReactNode; children: ReactNode; C: Record<string, string> }> = ({ label, children, C }) => (\n <div style={{ marginBottom: 11 }}>\n <label\n style={{\n display: \"block\",\n fontSize: 10,\n fontWeight: 700,\n color: C.muted,\n textTransform: \"uppercase\",\n letterSpacing: \".07em\",\n marginBottom: 3,\n }}\n >\n {label}\n </label>\n {children}\n </div>\n);\nfunction useIS(C) {\n return {\n IS:{width:\"100%\",padding:\"6px 8px\",border:`1px solid ${C.border}`,borderRadius:5,background:C.inputBg,color:C.text,fontSize:13,boxSizing:\"border-box\" as const,outline:\"none\"},\n CI:{padding:\"2px 4px\",height:28,cursor:\"pointer\",border:`1px solid ${C.border}`,borderRadius:5,background:C.inputBg},\n };\n}\n\nfunction ColorField({\n label,\n value,\n onChange,\n placeholder,\n emptyAsTransparent = false,\n C,\n}: {\n label: ReactNode;\n value: string | undefined;\n onChange: (next: string) => void;\n placeholder?: string;\n emptyAsTransparent?: boolean;\n C: any;\n}) {\n const { IS, CI } = useIS(C);\n const v = (value || \"\").trim();\n const normColorForInput = v || \"#000000\";\n return (\n <PR label={label} C={C}>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\n <ColorSwatchGrid\n value={v}\n C={C}\n compact\n onPick={(hex) => onChange(emptyAsTransparent && hex.toLowerCase() === \"#ffffff\" ? \"\" : hex)}\n />\n <div style={{ display: \"flex\", gap: 5, flex: \"0 0 auto\", alignItems: \"center\" }}>\n <input\n type=\"color\"\n style={CI}\n value={normColorForInput}\n onChange={(e) => onChange(emptyAsTransparent && e.target.value.toLowerCase() === \"#ffffff\" ? \"\" : e.target.value)}\n />\n <input\n type=\"text\"\n style={{ ...IS, width: 140 }}\n placeholder={placeholder}\n value={v}\n onChange={(e) => onChange(e.target.value)}\n />\n </div>\n </div>\n </PR>\n );\n}\n\nfunction ImageUrlUploadField({\n label,\n value,\n onChange,\n onUpload,\n accept = \"image/*\",\n buttonLabel = \"Upload\",\n inputId,\n C,\n}: {\n label: ReactNode;\n value: string;\n onChange: (next: string) => void;\n onUpload?: (file: File) => Promise<string>;\n accept?: string;\n buttonLabel?: ReactNode;\n inputId: string;\n C: any;\n}) {\n const { IS } = useIS(C);\n return (\n <PR label={label} C={C}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n <input\n type=\"text\"\n style={IS}\n placeholder=\"https://…\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n />\n {onUpload ? (\n <>\n <input\n id={inputId}\n type=\"file\"\n accept={accept}\n style={{ display: \"none\" }}\n onChange={async (e) => {\n const file = e.target.files?.[0];\n if (!file) return;\n try {\n const url = await onUpload(file);\n onChange(url);\n } catch (err) {\n console.error(\"Upload failed\", err);\n alert(\"Upload failed\");\n }\n e.target.value = \"\";\n }}\n />\n <button\n type=\"button\"\n onClick={() => document.getElementById(inputId)?.click()}\n style={{\n background: C.surface,\n border: `1px solid ${C.border}`,\n color: C.accent,\n borderRadius: 5,\n cursor: \"pointer\",\n fontSize: 11,\n padding: \"4px 10px\",\n width: \"100%\",\n fontWeight: 600,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n <UploadIcon size={14} strokeWidth={2.25} aria-hidden />\n <span>{buttonLabel}</span>\n </button>\n </>\n ) : null}\n </div>\n </PR>\n );\n}\n\nfunction DynamicGradientField({\n label,\n value,\n onChange,\n defaults,\n C,\n}: {\n label: ReactNode;\n value: any;\n onChange: (next: any) => void;\n defaults: { colors: string[] };\n C: any;\n}) {\n const { IS, CI } = useIS(C);\n\n const normalize = (g: any) => {\n const angle = typeof g?.angle === \"number\" ? g.angle : 135;\n const colorsRaw = Array.isArray(g?.colors) ? g.colors.map((x: any) => String(x || \"\").trim()).filter(Boolean) : [];\n const stopsRaw = Array.isArray(g?.stops) ? g.stops.map((x: any) => Number(x)) : [];\n let colors = colorsRaw.length >= 2 ? colorsRaw : defaults.colors.slice(0, Math.max(2, defaults.colors.length));\n colors = colors.slice(0, 8);\n let stops =\n stopsRaw.length === colors.length\n ? stopsRaw\n : colors.map((_, i) => Math.round((i / Math.max(1, colors.length - 1)) * 100));\n stops = stops.map((n) => (Number.isFinite(n) ? Math.max(0, Math.min(100, n)) : 0));\n\n // Sort by stop\n const pairs = colors.map((c, i) => ({ c, s: stops[i] })).sort((a, b) => a.s - b.s);\n return { angle, colors: pairs.map((p) => p.c), stops: pairs.map((p) => p.s) };\n };\n\n const g = normalize(value || {});\n const canRemove = g.colors.length > 2;\n const canAdd = g.colors.length < 8;\n\n const setStop = (idx: number, nextStop: number) => {\n const stops = [...g.stops];\n stops[idx] = Math.max(0, Math.min(100, Math.round(nextStop)));\n onChange(normalize({ ...g, stops }));\n };\n const setColor = (idx: number, next: string) => {\n const colors = [...g.colors];\n colors[idx] = next;\n onChange(normalize({ ...g, colors }));\n };\n const removeStop = (idx: number) => {\n if (!canRemove) return;\n const colors = g.colors.filter((_, i) => i !== idx);\n const stops = g.stops.filter((_, i) => i !== idx);\n onChange(normalize({ ...g, colors, stops }));\n };\n const addStop = () => {\n if (!canAdd) return;\n const colors = [...g.colors, g.colors[g.colors.length - 1] || \"#ffffff\"];\n const stops = [...g.stops, 100];\n onChange(normalize({ ...g, colors, stops }));\n };\n\n const preview = `linear-gradient(${g.angle}deg, ${g.colors.map((c, i) => `${c} ${g.stops[i]}%`).join(\", \")})`;\n\n return (\n <PR label={label} C={C}>\n <div style={{ height: 28, borderRadius: 8, border: `1px solid ${C.border}`, background: preview, marginBottom: 10 }} />\n\n <PR label=\"Angle\" C={C}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input\n type=\"range\"\n min={0}\n max={360}\n step={1}\n value={g.angle}\n onChange={(e) => onChange({ ...g, angle: +e.target.value })}\n style={{ width: \"100%\" }}\n />\n <input type=\"number\" style={IS} min={0} max={360} step={1} value={g.angle} onChange={(e) => onChange({ ...g, angle: +e.target.value })} />\n <div style={{ fontSize: 11, fontWeight: 800, color: C.muted, textAlign: \"center\" }}>°</div>\n </div>\n </PR>\n\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 6 }}>\n <div style={{ fontSize: 10, fontWeight: 800, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".06em\" }}>Stops</div>\n <button\n type=\"button\"\n onClick={addStop}\n disabled={!canAdd}\n style={{\n background: C.surface,\n border: `1px solid ${C.border}`,\n color: canAdd ? C.accent : C.muted,\n borderRadius: 6,\n cursor: canAdd ? \"pointer\" : \"not-allowed\",\n fontSize: 11,\n padding: \"6px 10px\",\n fontWeight: 700,\n opacity: canAdd ? 1 : 0.6,\n }}\n >\n + Add stop\n </button>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n {g.colors.map((c, i) => (\n <div key={i} style={{ border: `1px solid ${C.border}`, borderRadius: 10, background: C.surface, padding: 10 }}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"28px 1fr 78px 28px 28px\", gap: 6, alignItems: \"center\" }}>\n <input type=\"color\" style={CI} value={c} onChange={(e) => setColor(i, e.target.value)} />\n <input type=\"text\" style={IS} value={c} onChange={(e) => setColor(i, e.target.value)} />\n <input type=\"number\" style={IS} min={0} max={100} step={1} value={g.stops[i]} onChange={(e) => setStop(i, +e.target.value)} />\n <div style={{ fontSize: 11, fontWeight: 800, color: C.muted, textAlign: \"center\" }}>%</div>\n <button\n type=\"button\"\n onClick={() => removeStop(i)}\n disabled={!canRemove}\n title=\"Remove stop\"\n aria-label=\"Remove stop\"\n style={{\n width: 28,\n height: 28,\n borderRadius: 8,\n border: `1px solid ${canRemove ? C.border : \"transparent\"}`,\n background: canRemove ? \"transparent\" : \"transparent\",\n color: canRemove ? C.danger : C.muted,\n cursor: canRemove ? \"pointer\" : \"not-allowed\",\n fontWeight: 900,\n }}\n >\n ×\n </button>\n </div>\n <div style={{ marginTop: 8 }}>\n <input type=\"range\" min={0} max={100} step={1} value={g.stops[i]} onChange={(e) => setStop(i, +e.target.value)} style={{ width: \"100%\" }} />\n </div>\n </div>\n ))}\n </div>\n\n <div style={{ display: \"flex\", gap: 6, marginTop: 10 }}>\n <button\n type=\"button\"\n onClick={() => onChange(null)}\n style={{\n background: C.surface,\n border: `1px solid ${C.border}`,\n color: C.muted,\n borderRadius: 6,\n cursor: \"pointer\",\n fontSize: 11,\n padding: \"6px 10px\",\n width: \"100%\",\n }}\n >\n Disable gradient\n </button>\n </div>\n </PR>\n );\n}\n\nconst ALIGN_ICON_SIZE = 15;\nfunction AlignButtons({\n value,\n onChange,\n options,\n C,\n}: {\n value: string | undefined;\n onChange: (next: string) => void;\n options: Array<\"left\" | \"center\" | \"right\" | \"justify\">;\n C: any;\n}) {\n const current = (value || \"left\") as string;\n const btnStyle = (active: boolean) => ({\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 32,\n height: 30,\n borderRadius: 6,\n border: `1px solid ${active ? C.accent : C.border}`,\n background: active ? `${C.accent}18` : C.surface,\n color: active ? C.accent : C.text,\n cursor: \"pointer\",\n padding: 0,\n });\n const items: Array<[ \"left\" | \"center\" | \"right\" | \"justify\", any, string ]> = [\n [\"left\", AlignLeft, \"Align left\"],\n [\"center\", AlignCenter, \"Align center\"],\n [\"right\", AlignRight, \"Align right\"],\n [\"justify\", AlignJustify, \"Justify\"],\n ];\n return (\n <PR label=\"Alignment\" C={C}>\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\" }}>\n {items\n .filter(([k]) => options.includes(k))\n .map(([k, Icon, title]) => (\n <button\n key={k}\n type=\"button\"\n title={title}\n aria-label={title}\n onClick={() => onChange(k)}\n style={btnStyle(current === k)}\n >\n <Icon size={ALIGN_ICON_SIZE} strokeWidth={2.25} aria-hidden />\n </button>\n ))}\n </div>\n </PR>\n );\n}\n\nfunction clampNum(n: number, mn?: number, mx?: number) {\n if (Number.isNaN(n) || !Number.isFinite(n)) return mn ?? 0;\n if (typeof mn === \"number\" && n < mn) return mn;\n if (typeof mx === \"number\" && n > mx) return mx;\n return n;\n}\n\nfunction NumRangePx({\n label,\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n C,\n}: {\n label: string;\n value: number;\n onChange: (nextValue: number) => void;\n min?: number;\n max?: number;\n step?: number;\n C: any;\n}) {\n const { IS } = useIS(C);\n const v = clampNum(typeof value === \"number\" ? value : 0, min, max);\n return (\n <PR label={label} C={C}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={v}\n onChange={(e) => onChange(clampNum(+e.target.value, min, max))}\n style={{ width: \"100%\" }}\n />\n <input\n type=\"number\"\n style={{ ...IS, padding: \"6px 8px\" }}\n min={min}\n max={max}\n step={step}\n value={v}\n onChange={(e) => onChange(clampNum(+e.target.value, min, max))}\n />\n </div>\n </PR>\n );\n}\n\nfunction DividerStyleButtons({\n value,\n onChange,\n C,\n}: {\n value: \"solid\" | \"dashed\" | \"dotted\" | string | undefined;\n onChange: (next: \"solid\" | \"dashed\" | \"dotted\") => void;\n C: any;\n}) {\n const cur = value === \"dashed\" || value === \"dotted\" || value === \"solid\" ? value : \"solid\";\n const btn = (active: boolean) => ({\n flex: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 32,\n borderRadius: 8,\n border: `1px solid ${active ? C.accent : C.border}`,\n background: active ? `${C.accent}18` : C.surface,\n cursor: \"pointer\",\n padding: 0,\n });\n const line = (style: \"solid\" | \"dashed\" | \"dotted\", active: boolean) => ({\n width: 28,\n height: 0,\n borderTop: `3px ${style} ${active ? C.accent : C.muted}`,\n });\n return (\n <PR label=\"Border style\" C={C}>\n <div style={{ display: \"flex\", gap: 6 }}>\n {([\"solid\", \"dashed\", \"dotted\"] as const).map((s) => (\n <button key={s} type=\"button\" onClick={() => onChange(s)} title={s} aria-label={s} style={btn(cur === s)}>\n <span style={line(s, cur === s)} />\n </button>\n ))}\n </div>\n </PR>\n );\n}\n\nfunction MarginEditor({\n value,\n onChange,\n C,\n}: {\n value: { top: number; right: number; bottom: number; left: number } | undefined;\n onChange: (next: { top: number; right: number; bottom: number; left: number }) => void;\n C: any;\n}) {\n const v = value || { top: 0, right: 0, bottom: 0, left: 0 };\n const [linked, setLinked] = useState(true);\n const setAll = (n: number) => onChange({ top: n, right: n, bottom: n, left: n });\n const setSide = (k: \"top\" | \"right\" | \"bottom\" | \"left\", n: number) => {\n if (linked) setAll(n);\n else onChange({ ...v, [k]: n });\n };\n const allSame = v.top === v.right && v.top === v.bottom && v.top === v.left;\n return (\n <PR label=\"Margin\" C={C}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 6 }}>\n <span style={{ color: C.muted, fontSize: 12 }}>{linked ? \"All sides together\" : \"Edit sides individually\"}</span>\n <label style={{ display: \"inline-flex\", alignItems: \"center\", gap: 7, cursor: \"pointer\" }} title=\"Toggle all/individual\">\n <span style={{ fontSize: 10, fontWeight: 800, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".06em\" }}>\n {linked ? \"All\" : \"Sides\"}\n </span>\n <input type=\"checkbox\" checked={linked} onChange={(e) => setLinked(e.target.checked)} style={{ width: 15, height: 15, accentColor: C.accent }} />\n </label>\n </div>\n\n {linked ? (\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input\n type=\"range\"\n min={0}\n max={160}\n step={1}\n value={allSame ? v.top : 0}\n onChange={(e) => setAll(+e.target.value)}\n style={{ width: \"100%\" }}\n />\n <input\n type=\"number\"\n style={useIS(C).IS}\n min={0}\n max={400}\n step={1}\n value={allSame ? v.top : 0}\n onChange={(e) => setAll(+e.target.value)}\n />\n </div>\n ) : (\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 8 }}>\n {(\n [\n [\"top\", \"Top\"],\n [\"right\", \"Right\"],\n [\"bottom\", \"Bottom\"],\n [\"left\", \"Left\"],\n ] as const\n ).map(([k, lbl]) => (\n <div key={k} style={{ border: `1px solid ${C.border}`, borderRadius: 8, padding: 8, background: C.surface }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".07em\", marginBottom: 6 }}>\n {lbl}\n </div>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input type=\"range\" min={0} max={160} step={1} value={v[k]} onChange={(e) => setSide(k, +e.target.value)} style={{ width: \"100%\" }} />\n <input type=\"number\" style={useIS(C).IS} min={0} max={400} step={1} value={v[k]} onChange={(e) => setSide(k, +e.target.value)} />\n </div>\n </div>\n ))}\n </div>\n )}\n </PR>\n );\n}\n\nfunction PaddingEditor({\n label = \"Padding\",\n value,\n onChange,\n C,\n}: {\n label?: ReactNode;\n value: number | { top: number; right: number; bottom: number; left: number } | undefined;\n onChange: (next: { top: number; right: number; bottom: number; left: number } | number) => void;\n C: any;\n}) {\n const { IS } = useIS(C);\n const vObj =\n typeof value === \"number\"\n ? { top: value, right: value, bottom: value, left: value }\n : value || { top: 0, right: 0, bottom: 0, left: 0 };\n const [linked, setLinked] = useState(true);\n const setAll = (n: number) => onChange({ top: n, right: n, bottom: n, left: n });\n const setSide = (k: \"top\" | \"right\" | \"bottom\" | \"left\", n: number) => {\n if (linked) setAll(n);\n else onChange({ ...vObj, [k]: n });\n };\n const allSame = vObj.top === vObj.right && vObj.top === vObj.bottom && vObj.top === vObj.left;\n return (\n <PR label={label} C={C}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 6 }}>\n <span style={{ color: C.muted, fontSize: 12 }}>{linked ? \"All sides together\" : \"Edit sides individually\"}</span>\n <label style={{ display: \"inline-flex\", alignItems: \"center\", gap: 7, cursor: \"pointer\" }} title=\"Toggle all/individual\">\n <span style={{ fontSize: 10, fontWeight: 800, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".06em\" }}>\n {linked ? \"All\" : \"Sides\"}\n </span>\n <input type=\"checkbox\" checked={linked} onChange={(e) => setLinked(e.target.checked)} style={{ width: 15, height: 15, accentColor: C.accent }} />\n </label>\n </div>\n\n {linked ? (\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input type=\"range\" min={0} max={160} step={1} value={allSame ? vObj.top : 0} onChange={(e) => setAll(+e.target.value)} style={{ width: \"100%\" }} />\n <input type=\"number\" style={IS} min={0} max={400} step={1} value={allSame ? vObj.top : 0} onChange={(e) => setAll(+e.target.value)} />\n </div>\n ) : (\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 8 }}>\n {(\n [\n [\"top\", \"Top\"],\n [\"right\", \"Right\"],\n [\"bottom\", \"Bottom\"],\n [\"left\", \"Left\"],\n ] as const\n ).map(([k, lbl]) => (\n <div key={k} style={{ border: `1px solid ${C.border}`, borderRadius: 8, padding: 8, background: C.surface }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".07em\", marginBottom: 6 }}>\n {lbl}\n </div>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input type=\"range\" min={0} max={160} step={1} value={vObj[k]} onChange={(e) => setSide(k, +e.target.value)} style={{ width: \"100%\" }} />\n <input type=\"number\" style={IS} min={0} max={400} step={1} value={vObj[k]} onChange={(e) => setSide(k, +e.target.value)} />\n </div>\n </div>\n ))}\n </div>\n )}\n </PR>\n );\n}\n\nfunction BorderRadiusEditor({\n label = \"Border Radius\",\n value,\n onChange,\n C,\n}: {\n label?: ReactNode;\n value: number | { tl: number; tr: number; br: number; bl: number } | undefined;\n onChange: (next: { tl: number; tr: number; br: number; bl: number } | number) => void;\n C: any;\n}) {\n const { IS } = useIS(C);\n const vObj =\n typeof value === \"number\"\n ? { tl: value, tr: value, br: value, bl: value }\n : value || { tl: 0, tr: 0, br: 0, bl: 0 };\n const [linked, setLinked] = useState(true);\n const setAll = (n: number) => onChange({ tl: n, tr: n, br: n, bl: n });\n const setCorner = (k: \"tl\" | \"tr\" | \"br\" | \"bl\", n: number) => {\n if (linked) setAll(n);\n else onChange({ ...vObj, [k]: n });\n };\n const allSame = vObj.tl === vObj.tr && vObj.tl === vObj.br && vObj.tl === vObj.bl;\n const rangeMax = 80;\n return (\n <PR label={label} C={C}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 6 }}>\n <span style={{ color: C.muted, fontSize: 12 }}>{linked ? \"All corners together\" : \"Edit corners individually\"}</span>\n <label style={{ display: \"inline-flex\", alignItems: \"center\", gap: 7, cursor: \"pointer\" }} title=\"Toggle all/individual\">\n <span style={{ fontSize: 10, fontWeight: 800, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".06em\" }}>\n {linked ? \"All\" : \"Corners\"}\n </span>\n <input type=\"checkbox\" checked={linked} onChange={(e) => setLinked(e.target.checked)} style={{ width: 15, height: 15, accentColor: C.accent }} />\n </label>\n </div>\n\n {linked ? (\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input type=\"range\" min={0} max={rangeMax} step={1} value={allSame ? vObj.tl : 0} onChange={(e) => setAll(+e.target.value)} style={{ width: \"100%\" }} />\n <input type=\"number\" style={IS} min={0} max={400} step={1} value={allSame ? vObj.tl : 0} onChange={(e) => setAll(+e.target.value)} />\n </div>\n ) : (\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 8 }}>\n {(\n [\n [\"tl\", \"Top left\"],\n [\"tr\", \"Top right\"],\n [\"br\", \"Bottom right\"],\n [\"bl\", \"Bottom left\"],\n ] as const\n ).map(([k, lbl]) => (\n <div key={k} style={{ border: `1px solid ${C.border}`, borderRadius: 8, padding: 8, background: C.surface }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".07em\", marginBottom: 6 }}>\n {lbl}\n </div>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input type=\"range\" min={0} max={rangeMax} step={1} value={vObj[k]} onChange={(e) => setCorner(k, +e.target.value)} style={{ width: \"100%\" }} />\n <input type=\"number\" style={IS} min={0} max={400} step={1} value={vObj[k]} onChange={(e) => setCorner(k, +e.target.value)} />\n </div>\n </div>\n ))}\n </div>\n )}\n </PR>\n );\n}\n\nfunction BgModeButtons({\n value,\n onChange,\n C,\n}: {\n /** `null` = no type chosen yet — no option appears selected. */\n value: \"solid\" | \"image\" | \"gradient\" | null;\n onChange: (next: \"solid\" | \"image\" | \"gradient\") => void;\n C: any;\n}) {\n const btn = (active: boolean) => ({\n flex: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 34,\n borderRadius: 10,\n border: `1px solid ${active ? C.accent : C.border}`,\n background: active ? `${C.accent}18` : C.surface,\n color: active ? C.accent : C.muted,\n cursor: \"pointer\",\n gap: 8,\n fontSize: 12,\n fontWeight: 700,\n });\n const item = (k: \"solid\" | \"image\" | \"gradient\", Icon: any, label: string) => (\n <button key={k} type=\"button\" onClick={() => onChange(k)} style={btn(value != null && value === k)} title={label} aria-label={label}>\n <Icon size={16} strokeWidth={2.25} aria-hidden />\n <span>{label}</span>\n </button>\n );\n return (\n <PR label=\"Background type\" C={C}>\n <div style={{ display: \"flex\", gap: 8 }}>\n {item(\"solid\", SolidIcon, \"Color\")}\n {item(\"gradient\", GradientIcon, \"Gradient\")}\n {item(\"image\", ImageIcon, \"Image\")}\n </div>\n </PR>\n );\n}\n\nfunction blockBgKeys(variant: \"surface\" | \"backdrop\") {\n if (variant === \"surface\") {\n return {\n color: \"bgColor\",\n image: \"bgImage\",\n gradient: \"bgGradient\",\n size: \"bgSize\",\n repeat: \"bgRepeat\",\n position: \"bgPosition\",\n } as const;\n }\n return {\n color: \"backdropColor\",\n image: \"backdropImage\",\n gradient: \"backdropGradient\",\n size: \"backdropSize\",\n repeat: \"backdropRepeat\",\n position: \"backdropPosition\",\n } as const;\n}\n\n/** Solid / gradient / image behind block content (or backdrop behind button/timer). */\nfunction BlockSurfaceBgInspector({\n variant,\n p,\n set,\n C,\n onUpload,\n syncKey,\n}: {\n variant: \"surface\" | \"backdrop\";\n p: Record<string, unknown>;\n set: (k: string, v: unknown) => void;\n C: Record<string, string>;\n onUpload?: (file: File) => Promise<string>;\n syncKey: string;\n}) {\n const K = blockBgKeys(variant);\n const { IS, CI } = useIS(C);\n const POS_OPTS = [\"center\", \"top\", \"bottom\", \"left\", \"right\", \"top left\", \"top right\", \"bottom left\", \"bottom right\"];\n const [uiStep, setUiStep] = useState<null | \"solid\" | \"image\" | \"gradient\">(null);\n\n useEffect(() => {\n const g = p[K.gradient];\n if (g && typeof g === \"object\") {\n setUiStep(\"gradient\");\n return;\n }\n if (String(p[K.image] ?? \"\").trim()) {\n setUiStep(\"image\");\n return;\n }\n if (String(p[K.color] ?? \"\").trim()) {\n setUiStep(\"solid\");\n return;\n }\n setUiStep(null);\n }, [syncKey]);\n\n const setMode = (mode: \"solid\" | \"image\" | \"gradient\") => {\n setUiStep(mode);\n if (mode === \"solid\") {\n set(K.gradient, null);\n set(K.image, \"\");\n return;\n }\n if (mode === \"image\") {\n set(K.gradient, null);\n return;\n }\n set(K.image, \"\");\n const g = p[K.gradient];\n if (!g || typeof g !== \"object\") {\n set(K.gradient, { angle: 135, colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"], stops: [0, 50, 100] });\n }\n };\n\n const title = variant === \"backdrop\" ? \"Section backdrop\" : \"Block background\";\n const uploadId = `blk-surf-${variant}-${syncKey}`;\n\n return (\n <div style={{ marginBottom: 14, paddingBottom: 12, borderBottom: `1px solid ${C.border}` }}>\n <div\n style={{\n fontSize: 10,\n fontWeight: 700,\n color: C.muted,\n textTransform: \"uppercase\",\n letterSpacing: \".07em\",\n marginBottom: 8,\n }}\n >\n {title}\n </div>\n <BgModeButtons value={uiStep} onChange={setMode} C={C} />\n {uiStep === null ? (\n <div style={{ fontSize: 11, color: C.muted, marginTop: 8, lineHeight: 1.45 }}>\n Optional — color, gradient, or image fills behind this block.\n </div>\n ) : null}\n {uiStep === \"solid\" ? (\n <PR label=\"Background color\" C={C}>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\n <ColorSwatchGrid\n value={p[K.color] as string}\n C={C}\n compact\n onPick={(hex) => set(K.color, hex === \"#ffffff\" ? \"\" : hex)}\n />\n <div style={{ display: \"flex\", gap: 5, alignItems: \"center\" }}>\n <input\n type=\"color\"\n style={CI}\n value={(p[K.color] as string) || \"#ffffff\"}\n onChange={(e) => set(K.color, e.target.value === \"#ffffff\" ? \"\" : e.target.value)}\n />\n <input\n type=\"text\"\n style={{ ...IS, width: 120 }}\n placeholder=\"transparent\"\n value={(p[K.color] as string) || \"\"}\n onChange={(e) => set(K.color, e.target.value)}\n />\n </div>\n </div>\n </PR>\n ) : null}\n {uiStep === \"image\" ? (\n <>\n <PR\n label={\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n <ImageIcon size={13} strokeWidth={2.25} aria-hidden />\n Background image\n </span>\n }\n C={C}\n >\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <input\n type=\"text\"\n style={IS}\n placeholder=\"https://…\"\n value={(p[K.image] as string) || \"\"}\n onChange={(e) => set(K.image, e.target.value)}\n />\n {onUpload ? (\n <div style={{ marginTop: 0 }}>\n <input\n id={uploadId}\n type=\"file\"\n style={{ display: \"none\" }}\n accept=\"image/*\"\n onChange={async (e) => {\n const file = e.target.files?.[0];\n if (!file) return;\n try {\n const url = await onUpload(file);\n set(K.image, url);\n } catch (err) {\n console.error(\"Upload failed\", err);\n alert(\"Background upload failed\");\n }\n }}\n />\n <button\n type=\"button\"\n onClick={() => document.getElementById(uploadId)?.click()}\n style={{\n background: C.surface,\n border: `1px solid ${C.border}`,\n color: C.accent,\n borderRadius: 5,\n cursor: \"pointer\",\n fontSize: 11,\n padding: \"4px 10px\",\n width: \"100%\",\n fontWeight: 600,\n }}\n >\n <span style={{ display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\", gap: 8 }}>\n <UploadIcon size={14} strokeWidth={2.25} aria-hidden />\n <span>Upload</span>\n </span>\n </button>\n </div>\n ) : null}\n </div>\n </PR>\n <div style={{ display: \"flex\", gap: 8, marginBottom: 12 }}>\n <div style={{ flex: 1 }}>\n <PR label=\"Fit\" C={C}>\n <select style={IS} value={(p[K.size] as string) || \"cover\"} onChange={(e) => set(K.size, e.target.value)}>\n <option value=\"auto\">Auto</option>\n <option value=\"cover\">Cover</option>\n <option value=\"contain\">Contain</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label=\"Repeat\" C={C}>\n <select style={IS} value={(p[K.repeat] as string) || \"no-repeat\"} onChange={(e) => set(K.repeat, e.target.value)}>\n <option value=\"no-repeat\">No repeat</option>\n <option value=\"repeat\">Repeat</option>\n <option value=\"repeat-x\">Repeat X</option>\n <option value=\"repeat-y\">Repeat Y</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label=\"Position\" C={C}>\n <select style={IS} value={(p[K.position] as string) || \"center\"} onChange={(e) => set(K.position, e.target.value)}>\n {POS_OPTS.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n </PR>\n </div>\n </div>\n </>\n ) : null}\n {uiStep === \"gradient\" ? (\n <details open style={{ marginBottom: 4 }}>\n <summary style={{ cursor: \"pointer\", fontSize: 11, fontWeight: 800, color: C.text }}>Gradient</summary>\n <div style={{ marginTop: 10 }}>\n <DynamicGradientField\n label=\"Gradient\"\n value={p[K.gradient] as any}\n onChange={(g) => set(K.gradient, g)}\n defaults={{ colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"] }}\n C={C}\n />\n </div>\n </details>\n ) : null}\n </div>\n );\n}\n\n/** HTML block: TipTap rich text plus raw HTML source tab. */\nfunction HtmlBlockRichPanel({\n block,\n onChange,\n C,\n}: {\n block: { id: string; type: string; content?: unknown; props: Record<string, unknown> };\n onChange: (b: typeof block) => void;\n C: Record<string, string>;\n}) {\n const p = block.props;\n const { IS } = useIS(C);\n const [mode, setMode] = useState<\"visual\" | \"html\">(\"visual\");\n const [htmlDraft, setHtmlDraft] = useState(\"\");\n\n useEffect(() => {\n setMode(\"visual\");\n }, [block.id]);\n\n const body = normalizeRichHtmlForStorage(typeof block.content === \"string\" ? block.content : \"\");\n const applyHtml = (html: string) => {\n const norm = normalizeRichHtmlForStorage(html);\n onChange({ ...block, content: norm, props: { ...p, content: norm } });\n };\n\n const tabBtn = (active: boolean): CSSProperties => ({\n flex: 1,\n padding: \"7px 10px\",\n borderRadius: 6,\n border: `1px solid ${C.border}`,\n background: active ? C.accent : C.surface,\n color: active ? \"#ffffff\" : C.text,\n fontSize: 12,\n fontWeight: 700,\n cursor: \"pointer\",\n });\n\n return (\n <PR label=\"Content\" C={C}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <div style={{ display: \"flex\", gap: 8 }}>\n <button\n type=\"button\"\n style={tabBtn(mode === \"visual\")}\n onClick={() => {\n if (mode === \"html\") applyHtml(htmlDraft);\n setMode(\"visual\");\n }}\n >\n Rich text\n </button>\n <button\n type=\"button\"\n style={tabBtn(mode === \"html\")}\n onClick={() => {\n setHtmlDraft(body);\n setMode(\"html\");\n }}\n >\n HTML\n </button>\n </div>\n {mode === \"visual\" ? (\n <TextRichEditor\n key={block.id}\n value={body}\n onChange={applyHtml}\n typography={{\n fontSize: p.fontSize as number | undefined,\n color: p.color as string | undefined,\n align: p.align as string | undefined,\n fontFamily: p.fontFamily as string | undefined,\n lineHeight: p.lineHeight as number | undefined,\n letterSpacing: p.letterSpacing as number | undefined,\n padding: p.padding as { top?: number; right?: number; bottom?: number; left?: number },\n }}\n placeholder=\"Write your rich content…\"\n headerTitle=\"Rich editor\"\n C={C as any}\n />\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <textarea\n spellCheck={false}\n value={htmlDraft}\n onChange={(e) => setHtmlDraft(e.target.value)}\n placeholder=\"<p>Your HTML…</p>\"\n style={{\n ...IS,\n minHeight: 220,\n resize: \"vertical\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n fontSize: 12,\n lineHeight: 1.45,\n }}\n />\n <span style={{ fontSize: 10, color: C.muted, lineHeight: 1.45 }}>\n Raw HTML. Switch to <strong>Rich text</strong> to apply and preview in the visual editor.\n </span>\n <button\n type=\"button\"\n onClick={() => applyHtml(htmlDraft)}\n style={{\n alignSelf: \"flex-start\",\n background: C.surface,\n border: `1px solid ${C.border}`,\n color: C.accent,\n borderRadius: 5,\n cursor: \"pointer\",\n fontSize: 11,\n padding: \"6px 12px\",\n fontWeight: 600,\n }}\n >\n Apply (normalize)\n </button>\n </div>\n )}\n </div>\n </PR>\n );\n}\n\n// ─── CONTENT BLOCK EDITOR ────────────────────────────────────────────────────\nfunction ContentBlockEditor({ block, onChange, onClose, onUpload, C }) {\n const {IS,CI}=useIS(C);\n const imageFileRef = useRef(null);\n const p=block.props;\n const set=(k,v)=>{\n if(block.type===\"html\"&&k===\"content\"){\n onChange({...block,content:v,props:{...p,content:v}});\n return;\n }\n if(block.type===\"html\"){\n const body=typeof block.content===\"string\"?block.content:typeof p.content===\"string\"?p.content:\"\";\n onChange({...block,props:{...p,[k]:v,content:body}});\n return;\n }\n onChange({...block,props:{...p,[k]:v}});\n };\n const Num=(k,lbl,mn=0,mx=300)=><PR label={lbl} C={C}><input type=\"number\" style={IS} value={p[k]??0} min={mn} max={mx} onChange={e=>set(k,+e.target.value)}/></PR>;\n const Txt=(k,lbl,multi=false)=><PR label={lbl} C={C}>{multi?<textarea style={{...IS,minHeight:68,resize:\"vertical\"}} value={p[k]||\"\"} onChange={e=>set(k,e.target.value)}/>:<input type=\"text\" style={IS} value={p[k]||\"\"} onChange={e=>set(k,e.target.value)}/>}</PR>;\n const Col=(k,lbl)=><PR label={lbl} C={C}>\n <div style={{display:\"flex\",gap:8,alignItems:\"center\"}}>\n <ColorSwatchGrid value={p[k]} onPick={(hex)=>set(k,hex)} C={C} compact />\n <div style={{display:\"flex\",gap:5,flex:\"0 0 auto\",alignItems:\"center\"}}>\n <input type=\"color\" style={CI} value={p[k]||\"#000000\"} onChange={e=>set(k,e.target.value)}/>\n <input type=\"text\" style={{...IS,width:120}} value={p[k]||\"\"} onChange={e=>set(k,e.target.value)}/>\n </div>\n </div>\n </PR>;\n const Sel=(k,lbl,opts)=><PR label={lbl} C={C}><select style={IS} value={p[k]||opts[0]} onChange={e=>set(k,e.target.value)}>{opts.map(o=><option key={o} value={o}>{o}</option>)}</select></PR>;\n const Tog=(k,lbl)=><PR label={lbl} C={C}><label style={{display:\"flex\",alignItems:\"center\",gap:7,cursor:\"pointer\"}}><input type=\"checkbox\" checked={!!p[k]} onChange={e=>set(k,e.target.checked)} style={{width:15,height:15,accentColor:C.accent}}/><span style={{color:C.muted,fontSize:12}}>{p[k]?\"On\":\"Off\"}</span></label></PR>;\n const FONTS=[\"Georgia,serif\",\"Arial,sans-serif\",\"Verdana,sans-serif\",\"'Courier New',monospace\",\"Trebuchet MS,sans-serif\",\"Impact,sans-serif\"];\n\n const ImgUpload = (key) => {\n if (!onUpload) return null;\n return (\n <div style={{marginTop:4}}>\n <input id={`upload-${key}`} type=\"file\" style={{display:\"none\"}} accept=\"image/*\"\n onChange={async e=>{\n const file=e.target.files?.[0];\n if(!file)return;\n try{\n const url=await onUpload(file);\n set(key,url);\n }catch(err){\n console.error(\"Upload failed\",err);\n alert(\"Image upload failed\");\n }\n }}/>\n <button type=\"button\" onClick={()=>document.getElementById(`upload-${key}`)?.click()}\n style={{background:C.surface,border:`1px solid ${C.border}`,color:C.accent,borderRadius:5,cursor:\"pointer\",fontSize:11,padding:\"4px 10px\",width:\"100%\",fontWeight:600}}>\n ↑ Upload Image\n </button>\n </div>\n );\n };\n\n switch(block.type) {\n case \"heading\": return <>\n {Txt(\"content\",\"Heading Text\")}\n {Sel(\"level\",\"Level\",[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"])}\n <NumRangePx label=\"Font size\" value={p.fontSize ?? 28} onChange={(n)=>set(\"fontSize\",n)} min={8} max={96} step={1} C={C}/>\n {Col(\"color\",\"Color\")}\n <AlignButtons value={p.align} onChange={(v)=>set(\"align\",v)} options={[\"left\",\"center\",\"right\",\"justify\"]} C={C}/>\n {Sel(\"fontWeight\",\"Weight\",[\"300\",\"400\",\"500\",\"600\",\"700\",\"800\"])}\n {Sel(\"fontFamily\",\"Font\",FONTS)}\n <NumRangePx label=\"Letter spacing\" value={p.letterSpacing ?? 0} onChange={(n)=>set(\"letterSpacing\",n)} min={0} max={30} step={0.5} C={C}/>\n <PR label=\"Line height\" C={C}>\n <input type=\"number\" style={useIS(C).IS} min={0.8} max={4} step={0.05} value={p.lineHeight ?? 1.2} onChange={(e)=>set(\"lineHeight\",+e.target.value)} />\n </PR>\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad)=>set(\"padding\",pad)} C={C}/>\n <MarginEditor value={p.margin} onChange={(m)=>set(\"margin\",m)} C={C}/>\n </>;\n case \"text\": return (\n <>\n <PR label=\"Content\" C={C}>\n <textarea\n key={block.id}\n style={{ ...IS, minHeight: 200, resize: \"vertical\", fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\", fontSize: 12, lineHeight: 1.45 }}\n value={normalizeRichHtmlForStorage(p.content)}\n onChange={(e) => set(\"content\", normalizeRichHtmlForStorage(e.target.value))}\n spellCheck={false}\n placeholder={\"e.g. <p>Your message</p>\"}\n />\n </PR>\n <NumRangePx label=\"Font size\" value={p.fontSize ?? 15} onChange={(n)=>set(\"fontSize\",n)} min={8} max={96} step={1} C={C}/>\n {Col(\"color\",\"Color\")}\n <AlignButtons value={p.align} onChange={(v)=>set(\"align\",v)} options={[\"left\",\"center\",\"right\",\"justify\"]} C={C}/>\n {Sel(\"fontWeight\",\"Weight\",[\"400\",\"500\",\"600\",\"700\",\"800\"])}\n {Sel(\"fontFamily\",\"Font\",FONTS)}\n {Tog(\"italic\", \"Italic\")}\n {Tog(\"underline\", \"Underline\")}\n <PR label=\"Line height\" C={C}>\n <input type=\"number\" style={useIS(C).IS} min={1} max={4} step={0.05} value={p.lineHeight ?? 1.65} onChange={(e)=>set(\"lineHeight\",+e.target.value)} />\n </PR>\n <NumRangePx label=\"Letter spacing\" value={p.letterSpacing ?? 0} onChange={(n)=>set(\"letterSpacing\",n)} min={0} max={30} step={0.5} C={C}/>\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad)=>set(\"padding\",pad)} C={C}/>\n <MarginEditor value={p.margin} onChange={(m)=>set(\"margin\",m)} C={C}/>\n </>\n );\n case \"html\": return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n <HtmlBlockRichPanel block={block} onChange={onChange} C={C} />\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad)=>set(\"padding\",pad)} C={C}/>\n <MarginEditor value={p.margin} onChange={(m)=>set(\"margin\",m)} C={C}/>\n </div>\n );\n case \"image\": return <>\n <PR label=\"Image URL\" C={C}>\n <div style={{display:\"flex\",flexDirection:\"column\",gap:4}}>\n <input type=\"text\" style={IS} value={p.src||\"\"} placeholder=\"https://…\" onChange={e=>set(\"src\",e.target.value)}/>\n {ImgUpload(\"src\")}\n </div>\n </PR>\n <PR label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><Scaling size={13} strokeWidth={2.25} aria-hidden />Object fit</span>} C={C}>\n <select style={IS} value={p.objectFit || \"cover\"} onChange={e=>set(\"objectFit\",e.target.value)}>\n {[\"cover\",\"contain\",\"fill\",\"none\",\"scale-down\"].map(v=><option key={v} value={v}>{v}</option>)}\n </select>\n </PR>\n <PR label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><Crosshair size={13} strokeWidth={2.25} aria-hidden />Object position</span>} C={C}>\n <select style={IS} value={p.objectPosition || \"center\"} onChange={e=>set(\"objectPosition\",e.target.value)}>\n {[\"center\",\"top\",\"bottom\",\"left\",\"right\",\"top left\",\"top right\",\"bottom left\",\"bottom right\"].map(v=><option key={v} value={v}>{v}</option>)}\n </select>\n </PR>\n {Txt(\"alt\",\"Alt Text\")}\n <PR label=\"Link image\" C={C}>\n <label style={{display:\"flex\",alignItems:\"center\",gap:7,cursor:\"pointer\"}}>\n <input\n type=\"checkbox\"\n checked={!!(p.linkEnabled ?? (p.link && String(p.link).trim()))}\n onChange={(e) => {\n if (e.target.checked) set(\"linkEnabled\", true);\n else onChange({ ...block, props: { ...p, linkEnabled: false, link: \"\" } });\n }}\n style={{ width: 15, height: 15, accentColor: C.accent }}\n />\n <span style={{ color: C.muted, fontSize: 12 }}>\n {(p.linkEnabled ?? (p.link && String(p.link).trim())) ? \"On\" : \"Off\"}\n </span>\n </label>\n </PR>\n {(p.linkEnabled ?? (p.link && String(p.link).trim())) ? (\n <>\n {Txt(\"link\",\"Link URL\")}\n {Sel(\"linkTarget\",\"Open In\",[\"_blank\",\"_self\"])}\n </>\n ) : null}\n <AlignButtons value={p.align} onChange={(v)=>set(\"align\",v)} options={[\"left\",\"center\",\"right\"]} C={C}/>\n <BorderRadiusEditor value={p.borderRadius} onChange={(br)=>set(\"borderRadius\",br)} C={C}/>\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad)=>set(\"padding\",pad)} C={C}/>\n <MarginEditor value={p.margin} onChange={(m)=>set(\"margin\",m)} C={C}/>\n </>;\n case \"button\": return <>\n {Txt(\"label\",\"Label\")}\n {Txt(\"href\",\"Link URL\")}\n {Sel(\"linkTarget\",\"Open In\",[\"_blank\",\"_self\"])}\n {Col(\"bgColor\",\"Background\")}\n {Col(\"textColor\",\"Text Color\")}\n {Col(\"borderColor\",\"Border Color\")}\n {Num(\"borderWidth\",\"Border Width\",0,10)}\n <AlignButtons value={p.align} onChange={(v)=>set(\"align\",v)} options={[\"left\",\"center\",\"right\"]} C={C}/>\n <BorderRadiusEditor value={p.borderRadius} onChange={(br)=>set(\"borderRadius\",br)} C={C}/>\n {Num(\"paddingV\",\"Padding V\")}\n {Num(\"paddingH\",\"Padding H\")}\n <NumRangePx label=\"Font size\" value={p.fontSize ?? 14} onChange={(n)=>set(\"fontSize\",n)} min={8} max={48} step={1} C={C}/>\n {Sel(\"fontWeight\",\"Weight\",[\"400\",\"500\",\"600\",\"700\",\"800\"])}\n {Tog(\"fullWidth\",\"Full Width\")}\n <BlockSurfaceBgInspector variant=\"backdrop\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad)=>set(\"padding\",pad)} C={C}/>\n <MarginEditor value={p.margin} onChange={(m)=>set(\"margin\",m)} C={C}/>\n </>;\n case \"link\": return <>\n {Txt(\"label\",\"Label\")}{Txt(\"href\",\"Link URL\")}{Sel(\"linkTarget\",\"Open In\",[\"_blank\",\"_self\"])}{Col(\"color\",\"Text Color\")}\n <NumRangePx label=\"Font size\" value={p.fontSize ?? 15} onChange={(n)=>set(\"fontSize\",n)} min={8} max={72} step={1} C={C}/>\n <AlignButtons value={p.align} onChange={(v)=>set(\"align\",v)} options={[\"left\",\"center\",\"right\",\"justify\"]} C={C}/>\n {Sel(\"fontWeight\",\"Weight\",[\"300\",\"400\",\"500\",\"600\",\"700\",\"800\"])}\n {Sel(\"fontFamily\",\"Font\",FONTS)}{Tog(\"underline\",\"Underline\")}\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad)=>set(\"padding\",pad)} C={C}/>\n <MarginEditor value={p.margin} onChange={(m)=>set(\"margin\",m)} C={C}/>\n </>;\n case \"divider\": return <>\n {Col(\"color\",\"Color\")}\n <NumRangePx label=\"Thickness\" value={p.thickness ?? 1} onChange={(n)=>set(\"thickness\",n)} min={1} max={20} step={1} C={C}/>\n <DividerStyleButtons value={p.style} onChange={(s)=>set(\"style\",s)} C={C}/>\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad)=>set(\"padding\",pad)} C={C}/>\n <MarginEditor value={p.margin} onChange={(m)=>set(\"margin\",m)} C={C}/>\n </>;\n case \"spacer\": return <>\n <NumRangePx label=\"Height\" value={p.height ?? 24} onChange={(n)=>set(\"height\",n)} min={4} max={300} step={1} C={C}/>\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad)=>set(\"padding\",pad)} C={C}/>\n <MarginEditor value={p.margin} onChange={(m)=>set(\"margin\",m)} C={C}/>\n </>;\n case \"social\": return <>\n <PR label=\"Networks\" C={C}>\n <div style={{display:\"flex\",flexWrap:\"wrap\",gap:4,marginBottom:6}}>\n {ALL_NETWORKS.map(n=>{\n const active=(p.networks||[]).includes(n);\n return <button key={n} onClick={()=>{\n const nextNets = active ? (p.networks||[]).filter(x=>x!==n) : [...(p.networks||[]),n];\n const nextUrls = { ...(p.socialUrls||{}) };\n if (active) delete nextUrls[n];\n onChange({ ...block, props: { ...p, networks: nextNets, socialUrls: nextUrls } });\n }}\n style={{padding:\"3px 8px\",borderRadius:4,border:`1px solid ${active?C.accent:C.border}`,background:active?`${C.accent}22`:\"transparent\",color:active?C.accent:C.muted,fontSize:11,cursor:\"pointer\",fontWeight:active?700:400}}>\n {socialNetworkLabel(n)}\n </button>;\n })}\n </div>\n </PR>\n {(p.networks||[]).length>0&&(\n <PR label=\"Profile / page URLs\" C={C}>\n <div style={{fontSize:10,color:C.muted,marginBottom:8,lineHeight:1.45}}>Optional. Leave empty for icons without links. Use full URLs (https://…).</div>\n {(p.networks||[]).map(n=>(\n <div key={n} style={{marginBottom:8}}>\n <div style={{fontSize:10,fontWeight:700,color:C.accent2,marginBottom:3,textTransform:n===\"twitter\"?\"none\":\"capitalize\"}}>{socialNetworkLabel(n)}</div>\n <input type=\"text\" style={IS} placeholder={n===\"twitter\"?\"https://x.com/your-handle\":`https://${n}.com/your-profile`}\n value={(p.socialUrls&&p.socialUrls[n])||\"\"}\n onChange={e=>{\n const socialUrls = { ...(p.socialUrls||{}) };\n const v = e.target.value.trim();\n if (v) socialUrls[n] = v;\n else delete socialUrls[n];\n set(\"socialUrls\", socialUrls);\n }}/>\n </div>\n ))}\n </PR>\n )}\n <AlignButtons value={p.align} onChange={(v)=>set(\"align\",v)} options={[\"left\",\"center\",\"right\"]} C={C}/>\n <NumRangePx label=\"Icon size\" value={p.iconSize ?? 30} onChange={(n)=>set(\"iconSize\",n)} min={16} max={72} step={1} C={C}/>\n {Sel(\"shape\",\"Shape\",[\"circle\",\"square\"])}\n <NumRangePx label=\"Gap\" value={p.gap ?? 6} onChange={(n)=>set(\"gap\",n)} min={0} max={40} step={1} C={C}/>\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad)=>set(\"padding\",pad)} C={C}/>\n <MarginEditor value={p.margin} onChange={(m)=>set(\"margin\",m)} C={C}/>\n </>;\n case \"video\": return <>\n <PR label=\"Video URL\" C={C}>\n <div style={{display:\"flex\",flexDirection:\"column\",gap:4}}>\n <input type=\"text\" style={IS} value={videoSrcForEditorDisplay(p.src)||\"\"} placeholder=\"https://www.youtube.com/watch?v=… or Vimeo / embed URL\"\n onChange={e=>set(\"src\",e.target.value)}/>\n {onUpload && (\n <div style={{marginTop:0}}>\n <input\n id={`upload-video-${block.id}`}\n type=\"file\"\n style={{display:\"none\"}}\n accept=\"video/*\"\n onChange={async e=>{\n const file=e.target.files?.[0];\n if(!file)return;\n try{\n const url=await onUpload(file);\n set(\"src\",url);\n }catch(err){\n console.error(\"Upload failed\",err);\n alert(\"Video upload failed\");\n }\n }}\n />\n <button\n type=\"button\"\n onClick={()=>document.getElementById(`upload-video-${block.id}`)?.click()}\n style={{background:C.surface,border:`1px solid ${C.border}`,color:C.accent,borderRadius:5,cursor:\"pointer\",fontSize:11,padding:\"4px 10px\",width:\"100%\",fontWeight:600}}\n >\n ↑ Upload Video\n </button>\n </div>\n )}\n </div>\n <div style={{fontSize:10,color:C.muted,marginTop:4,lineHeight:1.5}}>\n Supports YouTube watch, Shorts, youtu.be, Vimeo page links, or direct embed URLs (\n <code style={{background:C.surface,padding:\"1px 4px\",borderRadius:3}}>youtube.com/embed/…</code>\n {\" \"}/\n <code style={{background:C.surface,padding:\"1px 4px\",borderRadius:3}}>player.vimeo.com/…</code>\n ).\n </div>\n </PR>\n <NumRangePx label=\"Height\" value={p.height ?? 280} onChange={(n)=>set(\"height\",n)} min={80} max={720} step={1} C={C}/>\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad)=>set(\"padding\",pad)} C={C}/>\n <MarginEditor value={p.margin} onChange={(m)=>set(\"margin\",m)} C={C}/>\n </>;\n case \"menu\": return <>\n <PR label=\"Menu Items\" C={C}>\n {(p.items||[]).map((item,i)=>(\n <div key={i} style={{display:\"flex\",gap:4,marginBottom:5}}>\n <input type=\"text\" style={{...IS,flex:2}} placeholder=\"Label\" value={item.label} onChange={e=>{const items=[...p.items];items[i]={...items[i],label:e.target.value};set(\"items\",items);}}/>\n <input type=\"text\" style={{...IS,flex:3}} placeholder=\"URL\" value={item.href} onChange={e=>{const items=[...p.items];items[i]={...items[i],href:e.target.value};set(\"items\",items);}}/>\n <button onClick={()=>set(\"items\",p.items.filter((_,j)=>j!==i))} style={{background:\"none\",border:`1px solid ${C.danger}`,color:C.danger,borderRadius:4,cursor:\"pointer\",fontSize:12,padding:\"0 6px\"}}>✕</button>\n </div>\n ))}\n <button onClick={()=>set(\"items\",[...(p.items||[]),{label:\"New\",href:\"#\"}])} style={{background:C.surface,border:`1px solid ${C.border}`,color:C.text,borderRadius:5,cursor:\"pointer\",fontSize:11,padding:\"4px 10px\",width:\"100%\"}}>+ Add Item</button>\n </PR>\n <AlignButtons value={p.align} onChange={(v)=>set(\"align\",v)} options={[\"left\",\"center\",\"right\"]} C={C}/>\n {Col(\"color\",\"Link Color\")}\n <NumRangePx label=\"Font size\" value={p.fontSize ?? 14} onChange={(n)=>set(\"fontSize\",n)} min={8} max={48} step={1} C={C}/>\n <NumRangePx label=\"Item gap\" value={p.gap ?? 20} onChange={(n)=>set(\"gap\",n)} min={0} max={80} step={1} C={C}/>\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad)=>set(\"padding\",pad)} C={C}/>\n <MarginEditor value={p.margin} onChange={(m)=>set(\"margin\",m)} C={C}/>\n </>;\n case \"timer\": {\n const endAt = parseTimerEndDate(p.endDate);\n const dateVal = formatDateInputLocal(endAt);\n const timeVal = formatTimeInputLocal(endAt);\n return <>\n <PR label=\"End date & time\" C={C}>\n <div style={{ display: \"flex\", gap: 8, flexWrap: \"wrap\", alignItems: \"stretch\" }}>\n <input\n type=\"date\"\n style={{ ...IS, flex: \"1 1 140px\", minWidth: 0 }}\n value={dateVal}\n onChange={(e) => {\n const next = e.target.value;\n if (!next) return;\n set(\"endDate\", combineLocalDateTime(next, timeVal));\n }}\n />\n <input\n type=\"time\"\n step={60}\n style={{ ...IS, flex: \"0 1 128px\" }}\n value={timeVal}\n onChange={(e) => set(\"endDate\", combineLocalDateTime(dateVal, e.target.value || \"00:00\"))}\n />\n </div>\n </PR>\n {Txt(\"label\",\"Label Text\")}\n {Col(\"bgColor\",\"Box Background\")}\n {Col(\"textColor\",\"Text Color\")}\n <BorderRadiusEditor value={p.borderRadius} onChange={(br)=>set(\"borderRadius\",br)} C={C}/>\n <AlignButtons value={p.align} onChange={(v)=>set(\"align\",v)} options={[\"left\",\"center\",\"right\"]} C={C}/>\n {Tog(\"showLabels\",\"Show Labels\")}\n <BlockSurfaceBgInspector variant=\"backdrop\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad)=>set(\"padding\",pad)} C={C}/>\n <MarginEditor value={p.margin} onChange={(m)=>set(\"margin\",m)} C={C}/>\n </>;\n }\n case \"table\": return (\n <>\n {Tog(\"header\",\"First row is header\")}\n <PR label=\"Table role\" C={C}>\n <div style={{fontSize:10,color:C.muted,marginBottom:6,lineHeight:1.45}}>\n <strong>Data</strong> → <code style={{background:C.surface,padding:\"1px 4px\",borderRadius:3}}>role="table"</code> for real tables.\n {\" \"}<strong>Layout</strong> → <code style={{background:C.surface,padding:\"1px 4px\",borderRadius:3}}>role="presentation"</code> for non-data grids.\n </div>\n <select\n style={IS}\n value={p.tableRole === \"presentation\" ? \"presentation\" : \"data\"}\n onChange={e=>set(\"tableRole\", e.target.value)}\n >\n <option value=\"data\">Data table (role="table")</option>\n <option value=\"presentation\">Layout (role="presentation")</option>\n </select>\n </PR>\n <PR label=\"Table Data\" C={C}>\n <div style={{fontSize:10,color:C.muted,marginBottom:6,lineHeight:1.5}}>When header is on, row 1 is the header row. Click a cell to edit.</div>\n <div style={{overflowX:\"auto\"}}>\n <table style={{borderCollapse:\"collapse\",width:\"100%\",fontSize:11}}>\n <tbody>\n {(p.data||[]).map((row,ri)=>(\n <tr key={ri}>\n {row.map((cell,ci)=>(\n <td key={ci} style={{padding:2}}>\n <input type=\"text\" style={{...IS,padding:\"4px 6px\",fontSize:11,minWidth:60,background:!!p.header&&ri===0?C.accent+\"22\":C.inputBg,fontWeight:!!p.header&&ri===0?700:400,boxSizing:\"border-box\" as const}} value={cell}\n onChange={e=>{const d=p.data.map(r=>[...r]);d[ri][ci]=e.target.value;set(\"data\",d);}}/>\n </td>\n ))}\n <td style={{padding:2}}>\n <button type=\"button\" onClick={()=>set(\"data\",p.data.filter((_,j)=>j!==ri))} title=\"Remove row\"\n style={{background:\"none\",border:`1px solid ${C.danger}`,color:C.danger,borderRadius:3,cursor:\"pointer\",fontSize:10,padding:\"3px 5px\",whiteSpace:\"nowrap\"}}>✕</button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <div style={{display:\"flex\",gap:5,marginTop:6}}>\n <button type=\"button\" onClick={()=>set(\"data\",[...(p.data||[]),[...Array((p.data||[[]])[0]?.length||3).fill(\"\")]])}\n style={{flex:1,background:C.surface,border:`1px solid ${C.border}`,color:C.text,borderRadius:4,cursor:\"pointer\",fontSize:11,padding:\"4px\"}}>+ Row</button>\n <button type=\"button\" onClick={()=>set(\"data\",(p.data||[]).map(r=>[...r,\"\"]))}\n style={{flex:1,background:C.surface,border:`1px solid ${C.border}`,color:C.text,borderRadius:4,cursor:\"pointer\",fontSize:11,padding:\"4px\"}}>+ Col</button>\n <button type=\"button\" onClick={()=>set(\"data\",(p.data||[]).map(r=>r.slice(0,-1)).filter(r=>r.length>0))}\n style={{flex:1,background:C.surface,border:`1px solid ${C.border}`,color:C.muted,borderRadius:4,cursor:\"pointer\",fontSize:11,padding:\"4px\"}}>− Col</button>\n </div>\n </PR>\n {Col(\"headerBg\",\"Header row background\")}{Col(\"headerColor\",\"Header row text\")}{Col(\"cellBg\",\"Cell background\")}{Col(\"cellBorder\",\"Cell border\")}{Col(\"stripedBg\",\"Stripe color\")}\n {Tog(\"striped\",\"Striped rows\")}\n <NumRangePx label=\"Font size\" value={p.fontSize ?? 13} onChange={(n)=>set(\"fontSize\",n)} min={10} max={24} step={1} C={C}/>\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad)=>set(\"padding\",pad)} C={C}/>\n <PaddingEditor label=\"Cell padding\" value={p.cellPadding} onChange={(pad)=>set(\"cellPadding\",pad)} C={C}/>\n <MarginEditor value={p.margin} onChange={(m)=>set(\"margin\",m)} C={C}/>\n </>\n );\n case \"layout\":\n return (\n <LayoutRowEditor\n row={{\n id: block.id,\n type: \"layout\",\n preset: p.preset,\n cols: p.cols ?? (p.ratios?.length || 1),\n ratios: [...(p.ratios?.length ? p.ratios : [1])],\n gap: p.gap,\n padding: p.padding,\n bgColor: p.bgColor || \"\",\n bgImage: p.bgImage || \"\",\n bgSize: p.bgSize,\n bgRepeat: p.bgRepeat,\n bgPosition: p.bgPosition ?? \"center\",\n bgGradient: p.bgGradient ?? null,\n cells: p.cells || [],\n columns: getColumns(p),\n }}\n onChange={(row) =>\n onChange({\n ...block,\n props: {\n ...p,\n preset: row.preset,\n cols: row.ratios?.length ?? row.cols ?? 1,\n gap: row.gap,\n padding: row.padding,\n bgColor: row.bgColor,\n bgImage: row.bgImage,\n bgSize: row.bgSize,\n bgRepeat: row.bgRepeat,\n bgPosition: row.bgPosition,\n bgGradient: row.bgGradient,\n ratios: [...(row.ratios || [1])],\n cells: row.cells || [],\n columns: row.columns ?? getColumns(row),\n },\n })\n }\n onClose={onClose}\n onUpload={onUpload}\n C={C}\n customizationHint=\"Choose how many columns to use, set ratio weights (flex), gap and padding, row background, then scroll down for per-column colors and padding.\"\n />\n );\n default: return null;\n }\n}\n\ntype BgUiKind = \"solid\" | \"image\" | \"gradient\";\n\nfunction inferLayoutRowBgStep(r: any): BgUiKind | null {\n if (r.bgGradient) return \"gradient\";\n if (String(r.bgImage || \"\").trim()) return \"image\";\n if (String(r.bgColor || \"\").trim()) return \"solid\";\n return null;\n}\n\nfunction inferColumnBgStep(container: any, selCol: number): BgUiKind | null {\n const cs = getColumnPropsAt(container, selCol) as any;\n if (cs.bgGradient) return \"gradient\";\n if (String(cs.bgImage || \"\").trim()) return \"image\";\n if (String(cs.bgColor || \"\").trim()) return \"solid\";\n return null;\n}\n\n// ─── LAYOUT ROW EDITOR ───────────────────────────────────────────────────────\nfunction LayoutRowEditor({\n row,\n onChange,\n onClose,\n onUpload,\n initialCol = null,\n rowIndex = -1,\n rowCount = 1,\n onMoveUp,\n onMoveDown,\n C,\n /** Shown under the inspector header when editing a Layout block */\n customizationHint,\n}: {\n row: any;\n onChange: (row: any) => void;\n onClose?: () => void;\n onUpload?: (file: File) => Promise<string>;\n initialCol?: number | null;\n rowIndex?: number;\n rowCount?: number;\n onMoveUp?: () => void;\n onMoveDown?: () => void;\n C: any;\n customizationHint?: string;\n}) {\n const {IS,CI}=useIS(C);\n const colCount = Math.max(1, row.ratios?.length || row.cells?.length || 1);\n const ratioList = row.ratios?.length ? row.ratios : [1];\n /** Always index a real column so Column Styling (incl. background type) is usable without an extra click. */\n const [selCol, setSelCol] = useState(0);\n /** When saved data has no bg yet, remembers Color / Gradient / Image until props catch up (avoids effect↔state flicker). */\n const [rowBgPickerMode, setRowBgPickerMode] = useState<BgUiKind | null>(null);\n const [colBgPickerMode, setColBgPickerMode] = useState<BgUiKind | null>(null);\n\n const inferredRowBg = useMemo(() => inferLayoutRowBgStep(row), [row.bgGradient, row.bgImage, row.bgColor]);\n const inferredColBg = useMemo(\n () => inferColumnBgStep(row, selCol),\n [row.columns, row.columnStyles, selCol],\n );\n const rowBgUiStep = inferredRowBg ?? rowBgPickerMode;\n const colBgUiStep = inferredColBg ?? colBgPickerMode;\n\n useEffect(() => {\n if (initialCol !== null && initialCol !== undefined && initialCol >= 0) {\n setSelCol(Math.min(initialCol, colCount - 1));\n } else {\n setSelCol((c) => Math.min(Math.max(0, c), colCount - 1));\n }\n }, [initialCol, row.id, colCount]);\n\n useEffect(() => {\n setRowBgPickerMode(null);\n }, [row.id]);\n\n useEffect(() => {\n setColBgPickerMode(null);\n }, [selCol, row.id]);\n\n useEffect(() => {\n if (inferredRowBg) setRowBgPickerMode(null);\n }, [inferredRowBg]);\n\n useEffect(() => {\n if (inferredColBg) setColBgPickerMode(null);\n }, [inferredColBg]);\n\n const set=(k,v)=>onChange({...row,[k]:v});\n const applyColumnCount=(n)=>{\n const prevCells=[...(row.cells||[])];\n const prevRatios=[...(row.ratios||[])];\n const cells=[];\n const ratios=[];\n for(let i=0;i<n;i++){\n cells.push(i<prevCells.length&&Array.isArray(prevCells[i])?[...prevCells[i]]:[]);\n ratios.push(i<prevRatios.length&&prevRatios[i]!=null?prevRatios[i]:1);\n }\n if(prevCells.length>n){\n cells[n-1]=[...cells[n-1],...prevCells.slice(n).flat()];\n }\n onChange({...row,cols:n,preset:\"custom\",cells,ratios});\n };\n const updCol=(i,upd)=>{\n const columns = patchColumnPropsAt(row, i, upd);\n onChange(withColumnsOnly(row, columns));\n };\n const setColBgMode = (mode: BgUiKind) => {\n setColBgPickerMode(mode);\n const cs = getColumnPropsAt(row, selCol) as any;\n if (mode === \"solid\") {\n updCol(selCol, { bgGradient: null, bgImage: \"\" });\n return;\n }\n if (mode === \"image\") {\n updCol(selCol, { bgGradient: null });\n return;\n }\n updCol(selCol, {\n bgImage: \"\",\n bgGradient: cs.bgGradient || { angle: 135, colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"], stops: [0, 50, 100] },\n });\n };\n const total=ratioList.reduce((a,b)=>a+b,0)||1;\n const POS_OPTS = [\"center\",\"top\",\"bottom\",\"left\",\"right\",\"top left\",\"top right\",\"bottom left\",\"bottom right\"];\n const setRowBgMode = (mode: BgUiKind) => {\n setRowBgPickerMode(mode);\n if (mode === \"solid\") {\n set(\"bgGradient\", null);\n set(\"bgImage\", \"\");\n return;\n }\n if (mode === \"image\") {\n set(\"bgGradient\", null);\n return;\n }\n // gradient\n set(\"bgImage\", \"\");\n if (!row.bgGradient) {\n set(\"bgGradient\", { angle: 135, colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"], stops: [0, 50, 100] });\n }\n };\n const canMoveUp = rowIndex > 0;\n const canMoveDown = rowIndex >= 0 && rowIndex < rowCount - 1;\n\n return (\n <>\n {onMoveUp && onMoveDown ? (\n <div style={{ display: \"flex\", gap: 6, marginBottom: 12 }}>\n <button\n type=\"button\"\n disabled={!canMoveUp}\n onClick={onMoveUp}\n style={{\n flex: 1,\n padding: \"8px 10px\",\n fontSize: 12,\n fontWeight: 600,\n borderRadius: 8,\n border: `1px solid ${C.border}`,\n background: canMoveUp ? C.surface : C.canvas,\n color: canMoveUp ? C.text : C.muted,\n cursor: canMoveUp ? \"pointer\" : \"not-allowed\",\n }}\n >\n ↑ Move section up\n </button>\n <button\n type=\"button\"\n disabled={!canMoveDown}\n onClick={onMoveDown}\n style={{\n flex: 1,\n padding: \"8px 10px\",\n fontSize: 12,\n fontWeight: 600,\n borderRadius: 8,\n border: `1px solid ${C.border}`,\n background: canMoveDown ? C.surface : C.canvas,\n color: canMoveDown ? C.text : C.muted,\n cursor: canMoveDown ? \"pointer\" : \"not-allowed\",\n }}\n >\n ↓ Move section down\n </button>\n </div>\n ) : null}\n {customizationHint ? (\n <div\n style={{\n fontSize: 11,\n color: C.muted,\n lineHeight: 1.45,\n marginBottom: 12,\n padding: \"8px 10px\",\n background: C.surface,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n }}>\n {customizationHint}\n </div>\n ) : null}\n <PR label=\"Columns\" C={C}>\n <select style={IS} value={colCount} onChange={e=>applyColumnCount(+e.target.value)}>\n {[1,2,3,4,5,6].map(n=><option key={n} value={n}>{n} {n===1?\"column\":\"columns\"}</option>)}\n </select>\n </PR>\n <NumRangePx label=\"Column gap\" value={row.gap ?? 12} onChange={(n)=>set(\"gap\",n)} min={0} max={80} step={1} C={C}/>\n <NumRangePx label=\"Row padding\" value={row.padding ?? 8} onChange={(n)=>set(\"padding\",n)} min={0} max={120} step={1} C={C}/>\n <BgModeButtons value={rowBgUiStep} onChange={setRowBgMode} C={C}/>\n {rowBgUiStep === null ? (\n <div style={{ fontSize: 11, color: C.muted, marginBottom: 10, lineHeight: 1.45 }}>\n Choose Color, Gradient, or Image — the matching settings appear below.\n </div>\n ) : null}\n {rowBgUiStep === \"solid\" ? (\n <PR label=\"bg color\" C={C}>\n <div style={{display:\"flex\",gap:8,alignItems:\"center\"}}>\n <ColorSwatchGrid\n value={row.bgColor}\n C={C}\n compact\n onPick={(hex)=>set(\"bgColor\",hex===\"#ffffff\"?\"\":hex)}\n />\n <div style={{display:\"flex\",gap:5,alignItems:\"center\"}}>\n <input type=\"color\" style={CI} value={row.bgColor||\"#ffffff\"} onChange={e=>set(\"bgColor\",e.target.value===\"#ffffff\"?\"\":e.target.value)}/>\n <input type=\"text\" style={{...IS,width:120}} placeholder=\"transparent\" value={row.bgColor||\"\"} onChange={e=>set(\"bgColor\",e.target.value)}/>\n </div>\n </div>\n </PR>\n ) : null}\n {rowBgUiStep === \"image\" ? (\n <>\n <PR label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><ImageIcon size={13} strokeWidth={2.25} aria-hidden />bg image</span>} C={C}>\n <div style={{display:\"flex\",flexDirection:\"column\",gap:4}}>\n <input type=\"text\" style={IS} placeholder=\"https://…\" value={row.bgImage||\"\"} onChange={e=>set(\"bgImage\",e.target.value)}/>\n {onUpload && (\n <div style={{marginTop:0}}>\n <input id=\"row-bg-upload\" type=\"file\" style={{display:\"none\"}} accept=\"image/*\"\n onChange={async e=>{\n const file=e.target.files?.[0];\n if(!file)return;\n try{\n const url=await onUpload(file);\n set(\"bgImage\",url);\n }catch(err){\n console.error(\"Upload failed\",err);\n alert(\"Background upload failed\");\n }\n }}/>\n <button type=\"button\" onClick={()=>document.getElementById(\"row-bg-upload\")?.click()}\n style={{background:C.surface,border:`1px solid ${C.border}`,color:C.accent,borderRadius:5,cursor:\"pointer\",fontSize:11,padding:\"4px 10px\",width:\"100%\",fontWeight:600}}>\n <span style={{display:\"inline-flex\",alignItems:\"center\",justifyContent:\"center\",gap:8}}>\n <UploadIcon size={14} strokeWidth={2.25} aria-hidden />\n <span>Upload</span>\n </span>\n </button>\n </div>\n )}\n </div>\n </PR>\n <div style={{display:\"flex\",gap:8,marginBottom:12}}>\n <div style={{flex:1}}>\n <PR label=\"fit\" C={C}>\n <select style={IS} value={row.bgSize||\"cover\"} onChange={e=>set(\"bgSize\",e.target.value)}>\n <option value=\"auto\">Auto</option>\n <option value=\"cover\">Cover</option>\n <option value=\"contain\">Contain</option>\n </select>\n </PR>\n </div>\n <div style={{flex:1}}>\n <PR label=\"repeat\" C={C}>\n <select style={IS} value={row.bgRepeat||\"no-repeat\"} onChange={e=>set(\"bgRepeat\",e.target.value)}>\n <option value=\"no-repeat\">No-Repeat</option>\n <option value=\"repeat\">Repeat</option>\n <option value=\"repeat-x\">Repeat X</option>\n <option value=\"repeat-y\">Repeat Y</option>\n </select>\n </PR>\n </div>\n <div style={{flex:1}}>\n <PR label=\"align\" C={C}>\n <select style={IS} value={row.bgPosition||\"center\"} onChange={e=>set(\"bgPosition\",e.target.value)}>\n {POS_OPTS.map(p=><option key={p} value={p}>{p}</option>)}\n </select>\n </PR>\n </div>\n </div>\n </>\n ) : null}\n\n {rowBgUiStep === \"gradient\" ? (\n <details open style={{ marginBottom: 12 }}>\n <summary style={{ cursor: \"pointer\", fontSize: 11, fontWeight: 800, color: C.text }}>gradient</summary>\n <div style={{ marginTop: 10 }}>\n <DynamicGradientField\n label=\"gradient\"\n value={row.bgGradient}\n onChange={(g)=>set(\"bgGradient\",g)}\n defaults={{ colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"] }}\n C={C}\n />\n </div>\n </details>\n ) : null}\n <PR label=\"Column Ratios\" C={C}>\n <div style={{display:\"flex\",gap:5}}>\n {ratioList.map((r,i)=>(\n <input key={i} type=\"number\" style={{...IS,flex:1}} value={r} min={1} max={12}\n onChange={e=>{const nr=[...ratioList];nr[i]=+e.target.value||1;set(\"ratios\",nr);}}/>\n ))}\n </div>\n <div style={{fontSize:10,color:C.muted,marginTop:4}}>\n {ratioList.map((r,i)=>`C${i+1}:${Math.round((r/total)*100)}%`).join(\" · \")}\n </div>\n </PR>\n\n <div style={{marginTop:20,borderTop:`1px solid ${C.border}`,paddingTop:15}}>\n <div style={{fontSize:11,fontWeight:700,color:C.text,textTransform:\"uppercase\",letterSpacing:\".05em\",marginBottom:10}}>Column Styling</div>\n <div style={{display:\"flex\",gap:4,marginBottom:12}}>\n {ratioList.map((_,i)=>(\n <button key={i} onClick={()=>setSelCol(i)}\n style={{flex:1,padding:6,fontSize:10,borderRadius:4,border:selCol===i?`1px solid ${C.accent}`:`1px solid ${C.border}`,background:selCol===i?`${C.accent}22`:\"transparent\",color:selCol===i?C.accent:C.muted,cursor:\"pointer\"}}>\n Col {i+1}\n </button>\n ))}\n </div>\n {colCount > 0 && (\n <div style={{background:C.surface,padding:10,borderRadius:8,border:`1px solid ${C.border}`}}>\n <BgModeButtons value={colBgUiStep} onChange={setColBgMode} C={C} />\n {colBgUiStep === null ? (\n <div style={{ fontSize: 11, color: C.muted, marginBottom: 10, lineHeight: 1.45 }}>\n Choose Color, Gradient, or Image — then edit column background details.\n </div>\n ) : null}\n {colBgUiStep === \"solid\" ? (\n <PR label={`col ${selCol+1} bg`} C={C}>\n <div style={{display:\"flex\",gap:8,alignItems:\"center\"}}>\n <ColorSwatchGrid\n value={(getColumnPropsAt(row, selCol)?.bgColor) || \"\"}\n C={C}\n compact\n onPick={(hex)=>updCol(selCol,{bgColor:hex===\"#ffffff\"?\"\":hex})}\n />\n <div style={{display:\"flex\",gap:5,alignItems:\"center\"}}>\n <input type=\"color\" style={CI} value={(getColumnPropsAt(row, selCol)?.bgColor) || \"#ffffff\"} onChange={e=>updCol(selCol,{bgColor:e.target.value===\"#ffffff\"?\"\":e.target.value})}/>\n <input type=\"text\" style={{...IS,width:120}} placeholder=\"transparent\" value={(getColumnPropsAt(row, selCol)?.bgColor) || \"\"} onChange={e=>updCol(selCol,{bgColor:e.target.value})}/>\n </div>\n </div>\n </PR>\n ) : null}\n {colBgUiStep === \"image\" ? (\n <>\n <PR label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><ImageIcon size={13} strokeWidth={2.25} aria-hidden />bg image</span>} C={C}>\n <div style={{display:\"flex\",flexDirection:\"column\",gap:4}}>\n <input type=\"text\" style={IS} placeholder=\"https://…\" value={(getColumnPropsAt(row, selCol)?.bgImage) || \"\"} onChange={e=>updCol(selCol,{bgImage:e.target.value})}/>\n {onUpload && (\n <div style={{marginTop:0}}>\n <input id={`col-bg-upload-${selCol}`} type=\"file\" style={{display:\"none\"}} accept=\"image/*\"\n onChange={async e=>{\n const file=e.target.files?.[0];\n if(!file)return;\n try{\n const url=await onUpload(file);\n updCol(selCol,{bgImage:url});\n }catch(err){\n console.error(\"Upload failed\",err);\n alert(\"Column background upload failed\");\n }\n e.target.value=\"\";\n }}/>\n <button type=\"button\" onClick={()=>document.getElementById(`col-bg-upload-${selCol}`)?.click()}\n style={{background:C.surface,border:`1px solid ${C.border}`,color:C.accent,borderRadius:5,cursor:\"pointer\",fontSize:11,padding:\"4px 10px\",width:\"100%\",fontWeight:600}}>\n <span style={{display:\"inline-flex\",alignItems:\"center\",justifyContent:\"center\",gap:8}}>\n <UploadIcon size={14} strokeWidth={2.25} aria-hidden />\n <span>Upload</span>\n </span>\n </button>\n </div>\n )}\n </div>\n </PR>\n <div style={{display:\"flex\",gap:8,marginBottom:12}}>\n <div style={{flex:1}}>\n <PR label=\"fit\" C={C}>\n <select style={IS} value={(getColumnPropsAt(row, selCol)?.bgSize) || \"cover\"} onChange={e=>updCol(selCol,{bgSize:e.target.value})}>\n <option value=\"auto\">Auto</option>\n <option value=\"cover\">Cover</option>\n <option value=\"contain\">Contain</option>\n </select>\n </PR>\n </div>\n <div style={{flex:1}}>\n <PR label=\"repeat\" C={C}>\n <select style={IS} value={(getColumnPropsAt(row, selCol)?.bgRepeat) || \"no-repeat\"} onChange={e=>updCol(selCol,{bgRepeat:e.target.value})}>\n <option value=\"no-repeat\">No repeat</option>\n <option value=\"repeat\">Repeat</option>\n <option value=\"repeat-x\">Repeat X</option>\n <option value=\"repeat-y\">Repeat Y</option>\n </select>\n </PR>\n </div>\n <div style={{flex:1}}>\n <PR label=\"align\" C={C}>\n <select style={IS} value={(getColumnPropsAt(row, selCol)?.bgPosition) || \"center\"} onChange={e=>updCol(selCol,{bgPosition:e.target.value})}>\n {POS_OPTS.map(p=><option key={p} value={p}>{p}</option>)}\n </select>\n </PR>\n </div>\n </div>\n </>\n ) : null}\n\n {colBgUiStep === \"gradient\" ? (\n <details open style={{ marginBottom: 12 }}>\n <summary style={{ cursor: \"pointer\", fontSize: 11, fontWeight: 800, color: C.text }}>gradient</summary>\n <div style={{ marginTop: 10 }}>\n <DynamicGradientField\n label=\"gradient\"\n value={getColumnPropsAt(row, selCol)?.bgGradient}\n onChange={(g)=>updCol(selCol,{bgGradient:g})}\n defaults={{ colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"] }}\n C={C}\n />\n </div>\n </details>\n ) : null}\n <PaddingEditor label=\"Column padding\" value={getColumnPropsAt(row, selCol).padding} onChange={(pad)=>updCol(selCol,{padding:pad})} C={C}/>\n <BorderRadiusEditor label=\"Column radius\" value={getColumnPropsAt(row, selCol).borderRadius} onChange={(br)=>updCol(selCol,{borderRadius:br})} C={C}/>\n </div>\n )}\n </div>\n </>\n );\n}\n\nexport { ContentBlockEditor, LayoutRowEditor, PR, NumRangePx, ColorField, ImageUrlUploadField, DynamicGradientField, BgModeButtons };\n","import { useEffect, useId, useState, type CSSProperties } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport type { Editor } from \"@tiptap/react\";\r\nimport { useEditor, EditorContent, useEditorState } from \"@tiptap/react\";\r\nimport StarterKit from \"@tiptap/starter-kit\";\r\nimport Placeholder from \"@tiptap/extension-placeholder\";\r\nimport TextAlign from \"@tiptap/extension-text-align\";\r\nimport {\r\n TextStyle,\r\n Color,\r\n FontFamily,\r\n FontSize,\r\n LineHeight,\r\n} from \"@tiptap/extension-text-style\";\r\nimport { LetterSpacing } from \"./LetterSpacing\";\r\nimport { normalizeRichHtmlForStorage } from \"../../lib/htmlUtils\";\r\nimport {\r\n AlignCenter,\r\n AlignJustify,\r\n AlignLeft,\r\n AlignRight,\r\n Bold,\r\n Code,\r\n Heading2,\r\n Heading3,\r\n Heading4,\r\n Italic,\r\n Link2,\r\n List,\r\n ListOrdered,\r\n Maximize2,\r\n Minus,\r\n Quote,\r\n Redo2,\r\n Strikethrough,\r\n Type,\r\n Underline,\r\n Undo2,\r\n Unlink2,\r\n X,\r\n} from \"lucide-react\";\r\n\r\ntype ThemeColors = {\r\n border: string;\r\n surface: string;\r\n inputBg: string;\r\n text: string;\r\n muted: string;\r\n accent: string;\r\n};\r\n\r\nexport type TextTypography = {\r\n fontSize?: number;\r\n color?: string;\r\n align?: string;\r\n fontFamily?: string;\r\n lineHeight?: number;\r\n letterSpacing?: number;\r\n /** Number (px) or four-side box `{ top, right, bottom, left }` like block props. */\r\n padding?: number | { top?: number; right?: number; bottom?: number; left?: number };\r\n};\r\n\r\nconst FONTS = [\r\n \"Georgia,serif\",\r\n \"Arial,sans-serif\",\r\n \"Verdana,sans-serif\",\r\n \"'Courier New',monospace\",\r\n \"Trebuchet MS,sans-serif\",\r\n \"Impact,sans-serif\",\r\n];\r\n\r\nfunction paddingToCss(pad: TextTypography[\"padding\"], fallback: number): string {\r\n if (typeof pad === \"number\" && Number.isFinite(pad)) return `${Math.max(0, pad)}px`;\r\n if (pad && typeof pad === \"object\" && !Array.isArray(pad)) {\r\n const t = typeof pad.top === \"number\" && Number.isFinite(pad.top) ? pad.top : fallback;\r\n const r = typeof pad.right === \"number\" && Number.isFinite(pad.right) ? pad.right : t;\r\n const b = typeof pad.bottom === \"number\" && Number.isFinite(pad.bottom) ? pad.bottom : t;\r\n const l = typeof pad.left === \"number\" && Number.isFinite(pad.left) ? pad.left : r;\r\n return `${t}px ${r}px ${b}px ${l}px`;\r\n }\r\n return `${fallback}px`;\r\n}\r\n\r\nconst FONT_SIZE_PX = [10, 11, 12, 13, 14, 15, 16, 18, 20, 24, 28, 32, 36, 42, 48, 56, 64, 72];\r\nconst LINE_HEIGHT_OPTS = [\"1\", \"1.15\", \"1.25\", \"1.5\", \"1.65\", \"1.75\", \"2\", \"2.5\"];\r\nconst LETTER_SPACING_OPTS = [\"-0.5px\", \"0px\", \"0.5px\", \"1px\", \"1.5px\", \"2px\", \"3px\", \"4px\"];\r\n\r\nfunction rgbChannelToHex(n: number): string {\r\n const v = Math.max(0, Math.min(255, Math.round(n)));\r\n return v.toString(16).padStart(2, \"0\");\r\n}\r\n\r\nfunction hexForColorInput(color: string | undefined | null): string {\r\n if (!color || typeof color !== \"string\") return \"#000000\";\r\n const c = color.trim();\r\n if (/^#[0-9a-fA-F]{3,8}$/.test(c)) {\r\n if (c.length === 4) {\r\n const r = c[1];\r\n const g = c[2];\r\n const b = c[3];\r\n return `#${r}${r}${g}${g}${b}${b}`;\r\n }\r\n return c.slice(0, 7);\r\n }\r\n const rgb = c.match(/^rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i);\r\n if (rgb) {\r\n return `#${rgbChannelToHex(+rgb[1])}${rgbChannelToHex(+rgb[2])}${rgbChannelToHex(+rgb[3])}`;\r\n }\r\n return \"#000000\";\r\n}\r\n\r\nfunction textStyleColorFromEditor(editor: Editor): string | null {\r\n const ts = editor.getAttributes(\"textStyle\") as { color?: string | null };\r\n if (ts.color && String(ts.color).trim()) return String(ts.color).trim();\r\n\r\n const stored = editor.state.storedMarks;\r\n if (stored) {\r\n for (const m of stored) {\r\n if (m.type.name === \"textStyle\" && m.attrs.color) {\r\n return String(m.attrs.color).trim();\r\n }\r\n }\r\n }\r\n\r\n const { from, to } = editor.state.selection;\r\n if (from === to) return null;\r\n\r\n const domAt = editor.view.domAtPos(from);\r\n let el: HTMLElement | null =\r\n domAt.node.nodeType === Node.TEXT_NODE\r\n ? (domAt.node.parentElement as HTMLElement | null)\r\n : (domAt.node as HTMLElement);\r\n while (el && el !== editor.view.dom) {\r\n const inline = el.style?.color?.trim();\r\n if (inline) return inline;\r\n el = el.parentElement;\r\n }\r\n return null;\r\n}\r\n\r\nfunction parsePxSize(raw: string | undefined | null): string {\r\n if (!raw) return \"\";\r\n const s = String(raw).trim();\r\n const m = s.match(/^([\\d.]+)\\s*px$/i);\r\n if (m) return m[1];\r\n if (/^\\d+(\\.\\d+)?$/.test(s)) return s;\r\n return \"\";\r\n}\r\n\r\nfunction normalizeLineHeightAttr(raw: string | undefined | null): string {\r\n if (!raw) return \"\";\r\n const s = String(raw).trim();\r\n return s;\r\n}\r\n\r\nfunction normalizeLetterSpacingAttr(raw: string | undefined | null): string {\r\n if (!raw) return \"\";\r\n return String(raw).trim();\r\n}\r\n\r\nfunction currentBlockTextAlign(editor: Editor): \"left\" | \"center\" | \"right\" | \"justify\" {\r\n const p = editor.getAttributes(\"paragraph\") as { textAlign?: string | null };\r\n const h = editor.getAttributes(\"heading\") as { textAlign?: string | null };\r\n const a = (p.textAlign || h.textAlign || \"left\") as string;\r\n if (a === \"center\" || a === \"right\" || a === \"justify\") return a;\r\n return \"left\";\r\n}\r\n\r\nfunction toolbarSelect(C: ThemeColors): CSSProperties {\r\n return {\r\n maxWidth: 120,\r\n padding: \"3px 5px\",\r\n borderRadius: 4,\r\n border: `1px solid ${C.border}`,\r\n background: C.surface,\r\n color: C.text,\r\n fontSize: 11,\r\n cursor: \"pointer\",\r\n height: 26,\r\n boxSizing: \"border-box\",\r\n };\r\n}\r\n\r\nconst TOOLBAR_ICON = 15;\r\n\r\nfunction toolbarBtn(C: ThemeColors, active: boolean): CSSProperties {\r\n return {\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"4px 7px\",\r\n borderRadius: 4,\r\n border: `1px solid ${active ? C.accent : C.border}`,\r\n background: active ? `${C.accent}18` : C.surface,\r\n color: active ? C.accent : C.text,\r\n cursor: \"pointer\",\r\n fontSize: 11,\r\n fontWeight: 600,\r\n lineHeight: 1,\r\n };\r\n}\r\n\r\nfunction toolbarIconBtn(C: ThemeColors, active: boolean): CSSProperties {\r\n return {\r\n ...toolbarBtn(C, active),\r\n padding: 5,\r\n minWidth: 28,\r\n minHeight: 28,\r\n boxSizing: \"border-box\",\r\n };\r\n}\r\n\r\nfunction ToolbarTypographyControls({ editor, C }: { editor: Editor; C: ThemeColors }) {\r\n const sel = toolbarSelect(C);\r\n const { ts, align, textColor } = useEditorState({\r\n editor,\r\n selector: ({ editor: ed }) => {\r\n const attrs = ed.getAttributes(\"textStyle\") as {\r\n color?: string | null;\r\n fontFamily?: string | null;\r\n fontSize?: string | null;\r\n lineHeight?: string | null;\r\n letterSpacing?: string | null;\r\n };\r\n return {\r\n ts: attrs,\r\n align: currentBlockTextAlign(ed),\r\n textColor: textStyleColorFromEditor(ed),\r\n };\r\n },\r\n });\r\n const fontFamily = ts.fontFamily || \"\";\r\n const sizeVal = parsePxSize(ts.fontSize);\r\n const lhVal = normalizeLineHeightAttr(ts.lineHeight);\r\n const lsVal = normalizeLetterSpacingAttr(ts.letterSpacing);\r\n const lsSelectValue = LETTER_SPACING_OPTS.includes(lsVal) ? lsVal : lsVal || \"\";\r\n\r\n return (\r\n <>\r\n <select\r\n title=\"Font family\"\r\n style={{ ...sel, maxWidth: 104 }}\r\n value={fontFamily}\r\n onChange={(e) => {\r\n const v = e.target.value;\r\n const ch = editor.chain().focus();\r\n if (!v) void ch.unsetFontFamily().run();\r\n else void ch.setFontFamily(v).run();\r\n }}\r\n >\r\n <option value=\"\">Font…</option>\r\n {FONTS.map((f) => (\r\n <option key={f} value={f}>\r\n {f.split(\",\")[0].replace(/'/g, \"\")}\r\n </option>\r\n ))}\r\n </select>\r\n <select\r\n title=\"Font size\"\r\n style={{ ...sel, maxWidth: 68 }}\r\n value={sizeVal}\r\n onChange={(e) => {\r\n const v = e.target.value;\r\n const ch = editor.chain().focus();\r\n if (!v) void ch.unsetFontSize().run();\r\n else void ch.setFontSize(`${v}px`).run();\r\n }}\r\n >\r\n <option value=\"\">Size</option>\r\n {FONT_SIZE_PX.map((n) => (\r\n <option key={n} value={String(n)}>\r\n {n}px\r\n </option>\r\n ))}\r\n </select>\r\n <select\r\n title=\"Line height\"\r\n style={{ ...sel, maxWidth: 76 }}\r\n value={LINE_HEIGHT_OPTS.includes(lhVal) ? lhVal : \"\"}\r\n onChange={(e) => {\r\n const v = e.target.value;\r\n const ch = editor.chain().focus();\r\n if (!v) void ch.unsetLineHeight().run();\r\n else void ch.setLineHeight(v).run();\r\n }}\r\n >\r\n <option value=\"\">Leading</option>\r\n {LINE_HEIGHT_OPTS.map((v) => (\r\n <option key={v} value={v}>\r\n {v}\r\n </option>\r\n ))}\r\n </select>\r\n <select\r\n title=\"Letter spacing\"\r\n style={{ ...sel, maxWidth: 80 }}\r\n value={lsSelectValue}\r\n onChange={(e) => {\r\n const v = e.target.value;\r\n const ch = editor.chain().focus();\r\n if (!v) void ch.unsetLetterSpacing().run();\r\n else void ch.setLetterSpacing(v).run();\r\n }}\r\n >\r\n <option value=\"\">Tracking</option>\r\n {LETTER_SPACING_OPTS.map((v) => (\r\n <option key={v} value={v}>\r\n {v === \"0px\" ? \"0\" : v}\r\n </option>\r\n ))}\r\n {lsVal && !LETTER_SPACING_OPTS.includes(lsVal) ? (\r\n <option value={lsVal}>{lsVal}</option>\r\n ) : null}\r\n </select>\r\n <input\r\n type=\"color\"\r\n title=\"Text color\"\r\n value={hexForColorInput(textColor ?? ts.color)}\r\n onChange={(e) => {\r\n const hex = e.target.value;\r\n void editor.chain().focus().setColor(hex).run();\r\n }}\r\n style={{\r\n width: 28,\r\n height: 26,\r\n padding: 0,\r\n border: `1px solid ${C.border}`,\r\n borderRadius: 4,\r\n cursor: \"pointer\",\r\n background: C.surface,\r\n flexShrink: 0,\r\n }}\r\n />\r\n {(\r\n [\r\n [\"left\", AlignLeft, \"Align left\"],\r\n [\"center\", AlignCenter, \"Align center\"],\r\n [\"right\", AlignRight, \"Align right\"],\r\n [\"justify\", AlignJustify, \"Align justify\"],\r\n ] as const\r\n ).map(([al, Icon, title]) => (\r\n <button\r\n key={al}\r\n type=\"button\"\r\n title={title}\r\n aria-label={title}\r\n onClick={() => void editor.chain().focus().setTextAlign(al).run()}\r\n style={toolbarIconBtn(C, align === al)}\r\n >\r\n <Icon size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n ))}\r\n </>\r\n );\r\n}\r\n\r\nfunction FormattingToolbar({\r\n editor,\r\n C,\r\n}: {\r\n editor: Editor;\r\n C: ThemeColors;\r\n}) {\r\n const [linkPanelOpen, setLinkPanelOpen] = useState(false);\r\n const [linkUrlValue, setLinkUrlValue] = useState(\"\");\r\n const ibtn = (active: boolean) => toolbarIconBtn(C, active);\r\n\r\n const openLinkPanel = () => {\r\n if (editor.isActive(\"link\")) {\r\n editor.chain().focus().extendMarkRange(\"link\").run();\r\n } else {\r\n editor.chain().focus().run();\r\n }\r\n const href = editor.getAttributes(\"link\").href as string | undefined;\r\n setLinkUrlValue(typeof href === \"string\" ? href : \"\");\r\n setLinkPanelOpen(true);\r\n };\r\n\r\n const applyLinkUrl = () => {\r\n const u = linkUrlValue.trim();\r\n if (!u) {\r\n if (editor.isActive(\"link\")) {\r\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\r\n }\r\n setLinkPanelOpen(false);\r\n return;\r\n }\r\n const { empty } = editor.state.selection;\r\n if (empty && !editor.isActive(\"link\")) {\r\n return;\r\n }\r\n let chain = editor.chain().focus();\r\n if (editor.isActive(\"link\")) {\r\n chain = chain.extendMarkRange(\"link\");\r\n }\r\n chain.setLink({ href: u }).run();\r\n setLinkPanelOpen(false);\r\n };\r\n\r\n const removeLinkMark = () => {\r\n if (editor.isActive(\"link\")) {\r\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\r\n }\r\n setLinkPanelOpen(false);\r\n };\r\n\r\n const hBtn = (level: 2 | 3 | 4, Icon: typeof Heading2) => (\r\n <button\r\n type=\"button\"\r\n key={`h${level}`}\r\n onClick={() => editor.chain().focus().toggleHeading({ level }).run()}\r\n style={ibtn(editor.isActive(\"heading\", { level }))}\r\n title={`Heading ${level}`}\r\n aria-label={`Heading ${level}`}\r\n >\r\n <Icon size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n );\r\n\r\n const inputStyle: CSSProperties = {\r\n flex: 1,\r\n minWidth: 160,\r\n padding: \"6px 8px\",\r\n borderRadius: 4,\r\n border: `1px solid ${C.border}`,\r\n background: C.inputBg,\r\n color: C.text,\r\n fontSize: 12,\r\n boxSizing: \"border-box\",\r\n outline: \"none\",\r\n };\r\n\r\n const panelBtn = (primary?: boolean): CSSProperties => ({\r\n padding: \"6px 10px\",\r\n borderRadius: 4,\r\n border: `1px solid ${primary ? C.accent : C.border}`,\r\n background: primary ? `${C.accent}18` : C.surface,\r\n color: C.text,\r\n fontSize: 11,\r\n fontWeight: 600,\r\n cursor: \"pointer\",\r\n });\r\n\r\n return (\r\n <div style={{ position: \"relative\", display: \"flex\", flexDirection: \"column\" }}>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexWrap: \"wrap\",\r\n gap: 4,\r\n padding: 6,\r\n borderBottom: linkPanelOpen ? \"none\" : `1px solid ${C.border}`,\r\n background: C.surface,\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().undo().run()}\r\n disabled={!editor.can().undo()}\r\n style={{ ...ibtn(false), opacity: editor.can().undo() ? 1 : 0.4 }}\r\n title=\"Undo\"\r\n aria-label=\"Undo\"\r\n >\r\n <Undo2 size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().redo().run()}\r\n disabled={!editor.can().redo()}\r\n style={{ ...ibtn(false), opacity: editor.can().redo() ? 1 : 0.4 }}\r\n title=\"Redo\"\r\n aria-label=\"Redo\"\r\n >\r\n <Redo2 size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <span style={{ width: 1, alignSelf: \"stretch\", background: C.border, margin: \"0 2px\" }} />\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleBold().run()}\r\n style={ibtn(editor.isActive(\"bold\"))}\r\n title=\"Bold\"\r\n aria-label=\"Bold\"\r\n >\r\n <Bold size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleItalic().run()}\r\n style={ibtn(editor.isActive(\"italic\"))}\r\n title=\"Italic\"\r\n aria-label=\"Italic\"\r\n >\r\n <Italic size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleUnderline().run()}\r\n style={ibtn(editor.isActive(\"underline\"))}\r\n title=\"Underline\"\r\n aria-label=\"Underline\"\r\n >\r\n <Underline size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleStrike().run()}\r\n style={ibtn(editor.isActive(\"strike\"))}\r\n title=\"Strikethrough\"\r\n aria-label=\"Strikethrough\"\r\n >\r\n <Strikethrough size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleCode().run()}\r\n style={ibtn(editor.isActive(\"code\"))}\r\n title=\"Inline code\"\r\n aria-label=\"Inline code\"\r\n >\r\n <Code size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <span style={{ width: 1, alignSelf: \"stretch\", background: C.border, margin: \"0 2px\" }} />\r\n {hBtn(2, Heading2)}\r\n {hBtn(3, Heading3)}\r\n {hBtn(4, Heading4)}\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().setParagraph().run()}\r\n style={ibtn(editor.isActive(\"paragraph\"))}\r\n title=\"Paragraph\"\r\n aria-label=\"Paragraph\"\r\n >\r\n <Type size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <span style={{ width: 1, alignSelf: \"stretch\", background: C.border, margin: \"0 2px\" }} />\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleBulletList().run()}\r\n style={ibtn(editor.isActive(\"bulletList\"))}\r\n title=\"Bullet list\"\r\n aria-label=\"Bullet list\"\r\n >\r\n <List size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\r\n style={ibtn(editor.isActive(\"orderedList\"))}\r\n title=\"Numbered list\"\r\n aria-label=\"Numbered list\"\r\n >\r\n <ListOrdered size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\r\n style={ibtn(editor.isActive(\"blockquote\"))}\r\n title=\"Quote\"\r\n aria-label=\"Quote\"\r\n >\r\n <Quote size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\r\n style={ibtn(false)}\r\n title=\"Horizontal rule\"\r\n aria-label=\"Horizontal rule\"\r\n >\r\n <Minus size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <span style={{ width: 1, alignSelf: \"stretch\", background: C.border, margin: \"0 2px\" }} />\r\n <ToolbarTypographyControls editor={editor} C={C} />\r\n <span style={{ width: 1, alignSelf: \"stretch\", background: C.border, margin: \"0 2px\" }} />\r\n <button\r\n type=\"button\"\r\n onClick={openLinkPanel}\r\n style={ibtn(editor.isActive(\"link\") || linkPanelOpen)}\r\n title=\"Add or edit link\"\r\n aria-label=\"Add or edit link\"\r\n aria-expanded={linkPanelOpen}\r\n >\r\n <Link2 size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <span style={{ flex: 1, minWidth: 8 }} />\r\n </div>\r\n {linkPanelOpen ? (\r\n <div\r\n role=\"dialog\"\r\n aria-label=\"Link URL\"\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 8,\r\n padding: \"8px 10px 10px\",\r\n borderBottom: `1px solid ${C.border}`,\r\n background: C.inputBg,\r\n }}\r\n >\r\n <label style={{ fontSize: 10, fontWeight: 700, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".06em\" }}>\r\n Link URL\r\n </label>\r\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 6, alignItems: \"center\" }}>\r\n <input\r\n type=\"url\"\r\n value={linkUrlValue}\r\n onChange={(e) => setLinkUrlValue(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n applyLinkUrl();\r\n }\r\n if (e.key === \"Escape\") {\r\n e.preventDefault();\r\n setLinkPanelOpen(false);\r\n }\r\n }}\r\n placeholder=\"https://example.com\"\r\n autoFocus\r\n style={inputStyle}\r\n />\r\n <button type=\"button\" onClick={applyLinkUrl} style={panelBtn(true)}>\r\n Apply\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={removeLinkMark}\r\n disabled={!editor.isActive(\"link\")}\r\n title=\"Remove link\"\r\n aria-label=\"Remove link\"\r\n style={{\r\n ...toolbarIconBtn(C, false),\r\n opacity: editor.isActive(\"link\") ? 1 : 0.35,\r\n cursor: editor.isActive(\"link\") ? \"pointer\" : \"not-allowed\",\r\n }}\r\n >\r\n <Unlink2 size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button type=\"button\" onClick={() => setLinkPanelOpen(false)} style={panelBtn()}>\r\n Close\r\n </button>\r\n </div>\r\n {editor.state.selection.empty && !editor.isActive(\"link\") ? (\r\n <span style={{ fontSize: 10, color: C.muted, lineHeight: 1.4 }}>\r\n Select text in the editor, then enter a URL and click Apply.\r\n </span>\r\n ) : null}\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nconst chromeTitleStyle = (C: ThemeColors): CSSProperties => ({\r\n fontSize: 11,\r\n fontWeight: 700,\r\n color: C.text,\r\n textTransform: \"uppercase\",\r\n letterSpacing: \".05em\",\r\n});\r\n\r\nexport function TextRichEditor({\r\n value,\r\n onChange,\r\n typography,\r\n placeholder = \"Write your message…\",\r\n headerTitle = \"Rich editor\",\r\n C,\r\n}: {\r\n value: string;\r\n onChange: (html: string) => void;\r\n typography: TextTypography;\r\n placeholder?: string;\r\n /** Shown on the compact chrome row (with expand) and as the expanded modal title. */\r\n headerTitle?: string;\r\n C: ThemeColors;\r\n}) {\r\n const [expanded, setExpanded] = useState(false);\r\n const expandedTitleId = useId();\r\n\r\n const editor = useEditor({\r\n extensions: [\r\n /** StarterKit v3 includes Link + Underline — configure them here instead of registering twice. */\r\n StarterKit.configure({\r\n heading: { levels: [2, 3, 4] },\r\n link: {\r\n openOnClick: false,\r\n HTMLAttributes: { style: \"color: inherit;\" },\r\n },\r\n }),\r\n TextStyle,\r\n Color.configure({ types: [\"textStyle\"] }),\r\n FontFamily,\r\n FontSize,\r\n LineHeight,\r\n LetterSpacing,\r\n TextAlign.configure({\r\n types: [\"heading\", \"paragraph\", \"blockquote\"],\r\n }),\r\n Placeholder.configure({ placeholder }),\r\n ],\r\n content: normalizeRichHtmlForStorage(value),\r\n onUpdate: ({ editor: ed }) => {\r\n onChange(normalizeRichHtmlForStorage(ed.getHTML()));\r\n },\r\n editorProps: {\r\n attributes: {\r\n style: \"min-height:inherit;outline:none;padding:10px 12px;\",\r\n },\r\n /** `openOnClick: false` does not call preventDefault — browser would still follow href. */\r\n handleDOMEvents: {\r\n click: (view, event) => {\r\n const t = event.target as HTMLElement | null;\r\n if (!t) return false;\r\n const anchor = t.closest(\"a[href]\");\r\n if (!anchor || !view.dom.contains(anchor)) return false;\r\n event.preventDefault();\r\n return true;\r\n },\r\n },\r\n },\r\n });\r\n\r\n useEffect(() => {\r\n if (!editor) return;\r\n const cur = normalizeRichHtmlForStorage(editor.getHTML());\r\n const next = normalizeRichHtmlForStorage(value);\r\n if (next !== cur) {\r\n editor.commands.setContent(next, { emitUpdate: false });\r\n }\r\n }, [value, editor]);\r\n\r\n useEffect(() => {\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key !== \"Escape\") return;\r\n if (expanded) setExpanded(false);\r\n };\r\n window.addEventListener(\"keydown\", onKey);\r\n return () => window.removeEventListener(\"keydown\", onKey);\r\n }, [expanded]);\r\n\r\n const editorWrapStyle = (forModal: boolean): CSSProperties => ({\r\n fontSize: typography.fontSize ?? 15,\r\n color: typography.color ?? C.text,\r\n fontFamily: typography.fontFamily ?? \"Georgia,serif\",\r\n textAlign: (typography.align as CSSProperties[\"textAlign\"]) || \"left\",\r\n lineHeight: typography.lineHeight ?? 1.65,\r\n letterSpacing: typography.letterSpacing ?? 0,\r\n padding: paddingToCss(typography.padding, 12),\r\n minHeight: forModal ? \"min(52vh, 480px)\" : 160,\r\n flex: 1,\r\n minWidth: 0,\r\n });\r\n\r\n const proseStyle = `\r\n .email-text-rich-editor .ProseMirror { min-height: inherit; outline: none; }\r\n .email-text-rich-editor .ProseMirror a { cursor: text; }\r\n /* TipTap Placeholder extension: empty nodes get .is-empty + data-placeholder (no default CSS in package). */\r\n .email-text-rich-editor .ProseMirror p.is-empty::before,\r\n .email-text-rich-editor .ProseMirror h2.is-empty::before,\r\n .email-text-rich-editor .ProseMirror h3.is-empty::before,\r\n .email-text-rich-editor .ProseMirror h4.is-empty::before,\r\n .email-text-rich-editor .ProseMirror blockquote.is-empty::before {\r\n content: attr(data-placeholder);\r\n float: left;\r\n height: 0;\r\n color: ${C.muted};\r\n pointer-events: none;\r\n font-style: italic;\r\n font-weight: 400;\r\n }\r\n .email-text-rich-editor .ProseMirror ul,\r\n .email-text-rich-editor .ProseMirror ol { padding-left: 1.25rem; margin: 0.35em 0; }\r\n .email-text-rich-editor .ProseMirror p { margin: 0.35em 0; }\r\n .email-text-rich-editor .ProseMirror h2,\r\n .email-text-rich-editor .ProseMirror h3,\r\n .email-text-rich-editor .ProseMirror h4 { margin: 0.5em 0 0.25em; line-height: 1.25; }\r\n .email-text-rich-editor .ProseMirror blockquote { margin: 0.35em 0; padding-left: 0.75rem; border-left: 3px solid ${C.border}; }\r\n `;\r\n\r\n /** Formatting toolbar + editor (block wrapper styles still from `typography`). */\r\n const compactLayout = editor ? (\r\n <div\r\n style={{\r\n border: `1px solid ${C.border}`,\r\n borderRadius: 6,\r\n background: C.inputBg,\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n maxHeight: \"calc(100vh - 180px)\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: 8,\r\n padding: \"8px 10px\",\r\n borderBottom: `1px solid ${C.border}`,\r\n background: C.surface,\r\n flexShrink: 0,\r\n }}\r\n >\r\n <span style={chromeTitleStyle(C)}>{headerTitle}</span>\r\n <button\r\n type=\"button\"\r\n onClick={() => setExpanded(true)}\r\n style={toolbarIconBtn(C, false)}\r\n title=\"Expand editor\"\r\n aria-label=\"Expand editor\"\r\n >\r\n <Maximize2 size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n </div>\r\n <FormattingToolbar editor={editor} C={C} />\r\n <style>{proseStyle}</style>\r\n <div\r\n style={{\r\n position: \"relative\",\r\n flex: 1,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <div\r\n className=\"email-text-rich-editor\"\r\n style={{ ...editorWrapStyle(false), overflowY: \"auto\" }}\r\n >\r\n <EditorContent editor={editor} />\r\n </div>\r\n </div>\r\n </div>\r\n ) : (\r\n <div\r\n style={{\r\n border: `1px solid ${C.border}`,\r\n borderRadius: 6,\r\n background: C.inputBg,\r\n minHeight: 200,\r\n }}\r\n />\r\n );\r\n\r\n /** Modal: same floating layout panel on the right inside the editor area. */\r\n const modalBody = editor ? (\r\n <div\r\n style={{\r\n flex: 1,\r\n minWidth: 0,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n border: `1px solid ${C.border}`,\r\n borderRadius: 8,\r\n overflow: \"hidden\",\r\n background: C.inputBg,\r\n }}\r\n >\r\n <FormattingToolbar editor={editor} C={C} />\r\n <style>{proseStyle}</style>\r\n <div\r\n style={{\r\n position: \"relative\",\r\n flex: 1,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <div\r\n className=\"email-text-rich-editor\"\r\n style={{ ...editorWrapStyle(true), overflowY: \"auto\" }}\r\n >\r\n <EditorContent editor={editor} />\r\n </div>\r\n </div>\r\n </div>\r\n ) : null;\r\n\r\n if (!editor) {\r\n return compactLayout;\r\n }\r\n\r\n return (\r\n <>\r\n {!expanded && compactLayout}\r\n {expanded &&\r\n createPortal(\r\n <div\r\n role=\"dialog\"\r\n aria-modal\r\n aria-labelledby={expandedTitleId}\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n zIndex: 100000,\r\n background: \"rgba(15,23,42,0.55)\",\r\n backdropFilter: \"blur(6px)\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: 16,\r\n }}\r\n onClick={(e) => {\r\n if (e.target === e.currentTarget) setExpanded(false);\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: \"min(1100px, 100%)\",\r\n height: \"min(92vh, 920px)\",\r\n maxHeight: \"min(92vh, 920px)\",\r\n background: C.surface,\r\n border: `1px solid ${C.border}`,\r\n borderRadius: 12,\r\n boxShadow: \"0 24px 80px rgba(0,0,0,0.35)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: 12,\r\n flexShrink: 0,\r\n padding: \"12px 14px\",\r\n borderBottom: `1px solid ${C.border}`,\r\n background: C.surface,\r\n }}\r\n >\r\n <span id={expandedTitleId} style={{ ...chromeTitleStyle(C), fontSize: 12, letterSpacing: \".06em\" }}>\r\n {headerTitle}\r\n </span>\r\n <button\r\n type=\"button\"\r\n onClick={() => setExpanded(false)}\r\n style={toolbarIconBtn(C, false)}\r\n title=\"Close\"\r\n aria-label=\"Close expanded editor\"\r\n >\r\n <X size={TOOLBAR_ICON + 1} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n </div>\r\n <div\r\n style={{\r\n flex: 1,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n padding: \"12px 14px 14px\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n {modalBody}\r\n </div>\r\n </div>\r\n </div>,\r\n document.body,\r\n )}\r\n </>\r\n );\r\n}\r\n","import { Extension } from \"@tiptap/core\";\r\n\r\ndeclare module \"@tiptap/core\" {\r\n interface Commands<ReturnType> {\r\n letterSpacing: {\r\n setLetterSpacing: (letterSpacing: string) => ReturnType;\r\n unsetLetterSpacing: () => ReturnType;\r\n };\r\n }\r\n}\r\n\r\ndeclare module \"@tiptap/extension-text-style\" {\r\n interface TextStyleAttributes {\r\n letterSpacing?: string | null;\r\n }\r\n}\r\n\r\n/** Inline letter-spacing on the `textStyle` mark (same pattern as FontSize / LineHeight). */\r\nexport const LetterSpacing = Extension.create({\r\n name: \"letterSpacing\",\r\n addOptions() {\r\n return { types: [\"textStyle\"] as string[] };\r\n },\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: this.options.types,\r\n attributes: {\r\n letterSpacing: {\r\n default: null,\r\n parseHTML: (element) => {\r\n const v = element.style.letterSpacing;\r\n return v?.replace(/['\"]+/g, \"\").trim() || null;\r\n },\r\n renderHTML: (attributes) => {\r\n if (!attributes.letterSpacing) {\r\n return {};\r\n }\r\n return { style: `letter-spacing: ${attributes.letterSpacing}` };\r\n },\r\n },\r\n },\r\n },\r\n ];\r\n },\r\n addCommands() {\r\n return {\r\n setLetterSpacing:\r\n (letterSpacing: string) =>\r\n ({ chain }) =>\r\n chain().setMark(\"textStyle\", { letterSpacing }).run(),\r\n unsetLetterSpacing:\r\n () =>\r\n ({ chain }) =>\r\n chain().setMark(\"textStyle\", { letterSpacing: null }).removeEmptyTextStyle().run(),\r\n };\r\n },\r\n});\r\n","/** Preset swatches shown in two rows (8 columns × 2 rows). */\r\nconst COLOR_SWATCHES = [\r\n \"#000000\", \"#ffffff\", \"#64748b\", \"#94a3b8\",\r\n \"#ef4444\", \"#f97316\", \"#eab308\", \"#22c55e\",\r\n \"#14b8a6\", \"#0ea5e9\", \"#3b82f6\", \"#6366f1\",\r\n \"#8b5cf6\", \"#a855f7\", \"#ec4899\", \"#78716c\",\r\n];\r\n\r\nexport function ColorSwatchGrid({\r\n value,\r\n onPick,\r\n C,\r\n compact = false,\r\n}: {\r\n value: string | undefined;\r\n onPick: (hex: string) => void;\r\n C: { border: string; accent: string };\r\n /** Toolbar-friendly smaller swatches in one dense row (wraps). */\r\n compact?: boolean;\r\n}) {\r\n const norm = (v: string | undefined) => (v || \"\").trim().toLowerCase();\r\n const current = norm(value);\r\n const cell = compact ? 16 : undefined;\r\n return (\r\n <div\r\n style={\r\n compact\r\n ? {\r\n display: \"flex\",\r\n flexWrap: \"wrap\",\r\n gap: 3,\r\n alignItems: \"center\",\r\n flex: \"1 1 120px\",\r\n minWidth: 0,\r\n }\r\n : {\r\n display: \"grid\",\r\n gridTemplateColumns: \"repeat(8, minmax(0, 1fr))\",\r\n gap: 4,\r\n marginBottom: 2,\r\n }\r\n }\r\n >\r\n {COLOR_SWATCHES.map((hex) => {\r\n const active = current === hex.toLowerCase();\r\n return (\r\n <button\r\n key={hex}\r\n type=\"button\"\r\n title={hex}\r\n onClick={() => onPick(hex)}\r\n style={{\r\n boxSizing: \"border-box\",\r\n margin: 0,\r\n padding: 0,\r\n width: cell ?? \"100%\",\r\n height: cell,\r\n aspectRatio: compact ? undefined : \"1\",\r\n minHeight: 0,\r\n minWidth: compact ? cell : 0,\r\n borderRadius: compact ? 3 : 4,\r\n border: active ? `2px solid ${C.accent}` : `1px solid ${C.border}`,\r\n background: hex,\r\n cursor: \"pointer\",\r\n flexShrink: 0,\r\n boxShadow: hex.toLowerCase() === \"#ffffff\" ? `inset 0 0 0 1px ${C.border}` : undefined,\r\n }}\r\n />\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n","import {\r\n useState,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useLayoutEffect,\r\n type CSSProperties,\r\n type ReactNode,\r\n} from \"react\";\r\nimport { Monitor, Smartphone, Tablet, Columns2 } from \"lucide-react\";\r\nimport { previewEmailSrcDoc } from \"../../lib/emailHtml\";\r\n\r\nexport type MobilePreviewVariant = \"iphone\" | \"android\";\r\n\r\nexport type EmailPreviewModalProps = {\r\n html: string;\r\n contentWidth?: number;\r\n rowCount?: number;\r\n blockCount?: number;\r\n editorZoom?: number;\r\n locale?: string;\r\n initialDevice?: string;\r\n /** Phone shell in mobile / split view: iPhone vs Android frame + viewport width. */\r\n initialMobileVariant?: MobilePreviewVariant;\r\n onClose: () => void;\r\n C: Record<string, string>;\r\n /** Shown as the header line (e.g. email subject). */\r\n title?: string;\r\n secondaryActionLabel?: string;\r\n onSecondaryAction?: () => void;\r\n};\r\n\r\n// ─── PREVIEW MODAL ───────────────────────────────────────────────────────────\r\nconst DEVICES = [\r\n {\r\n key:\"desktop\", label:\"Desktop\", maxW:1024,\r\n screenW:null, screenH:null,\r\n frame: null,\r\n },\r\n {\r\n key:\"tablet\", label:\"Tablet\", maxW:820,\r\n screenW:820, screenH:1180,\r\n chrome: {\r\n body: { width:860, borderRadius:18, background:\"linear-gradient(145deg,#2a2a3a,#1a1a28)\", padding:\"14px 14px 20px\", boxShadow:\"0 0 0 1px #444,0 30px 80px rgba(0,0,0,.7),inset 0 1px 0 rgba(255,255,255,.08)\" },\r\n topBar: { height:20, display:\"flex\", alignItems:\"center\", justifyContent:\"center\", marginBottom:10 },\r\n topBarInner: { width:60, height:6, borderRadius:3, background:\"#333\" },\r\n bottomBar: { height:16, display:\"flex\", alignItems:\"center\", justifyContent:\"center\", marginTop:10 },\r\n homeIndicator: { width:100, height:4, borderRadius:2, background:\"#444\" },\r\n screen: { borderRadius:10, overflow:\"hidden\", border:\"2px solid #111\" },\r\n },\r\n },\r\n {\r\n key:\"mobile\", label:\"Mobile\", maxW:390,\r\n screenW:390, screenH:844,\r\n chrome: {\r\n body: { width:430, borderRadius:52, background:\"linear-gradient(145deg,#2a2a3a,#1a1a28)\", padding:\"16px 16px 24px\", boxShadow:\"0 0 0 1px #555,0 40px 100px rgba(0,0,0,.8),inset 0 1px 0 rgba(255,255,255,.1)\" },\r\n notch: true,\r\n sideButtons: true,\r\n topBar: { height:30, display:\"flex\", alignItems:\"flex-start\", justifyContent:\"center\", paddingTop:8, marginBottom:4 },\r\n topBarInner: null,\r\n bottomBar: { height:24, display:\"flex\", alignItems:\"center\", justifyContent:\"center\", marginTop:6 },\r\n homeIndicator: { width:120, height:5, borderRadius:3, background:\"#555\" },\r\n screen: { borderRadius:42, overflow:\"hidden\", border:\"2px solid #111\" },\r\n },\r\n },\r\n];\r\n\r\n/** Logical points (viewport) — drives `previewEmailSrcDoc` and device aspect ratio. */\r\nconst MOBILE_IPHONE = { logicalW: 390, logicalH: 844, label: \"iPhone\", outerRadius: 46, innerRadius: 38 };\r\nconst MOBILE_ANDROID = { logicalW: 412, logicalH: 915, label: \"Android\", outerRadius: 32, innerRadius: 20 };\r\n\r\nfunction previewIframeWidthPx(deviceKey: \"mobile\" | \"tablet\", mobileVariant: MobilePreviewVariant = \"iphone\"): number {\r\n if (deviceKey === \"tablet\") {\r\n const d = DEVICES.find((x) => x.key === \"tablet\");\r\n return d?.maxW ?? 820;\r\n }\r\n return mobileVariant === \"android\" ? MOBILE_ANDROID.logicalW : MOBILE_IPHONE.logicalW;\r\n}\r\n\r\nfunction PreviewDeviceIcon({ devKey, color }) {\r\n const p = { size: 15, strokeWidth: 1.75, color: color || \"currentColor\", style: { display: \"block\", flexShrink: 0 } };\r\n if (devKey === \"desktop\") return <Monitor {...p} />;\r\n if (devKey === \"tablet\") return <Tablet {...p} />;\r\n return <Smartphone {...p} />;\r\n}\r\n\r\nfunction BrowserBar({ url, C }) {\r\n const icon = C.muted;\r\n return (\r\n <div style={{ background: C.toolbarBg, padding: \"8px 12px\", display: \"flex\", alignItems: \"center\", gap: 8, borderBottom: `1px solid ${C.border}`, flexShrink: 0 }}>\r\n <div style={{ display: \"flex\", gap: 5 }}>\r\n {[\"#ef4444\", \"#f59e0b\", \"#22c55e\"].map((col) => (\r\n <div key={col} style={{ width: 10, height: 10, borderRadius: \"50%\", background: col }} />\r\n ))}\r\n </div>\r\n <div style={{ flex: 1, background: C.surface, borderRadius: 6, padding: \"4px 10px\", display: \"flex\", alignItems: \"center\", gap: 6, border: `1px solid ${C.border}` }}>\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\"><path d=\"M5 1a4 4 0 100 8A4 4 0 005 1z\" stroke={icon} strokeWidth=\"1.2\"/><path d=\"M5 1v8M1 5h8M2.3 2.3l5.4 5.4M7.7 2.3L2.3 7.7\" stroke={icon} strokeWidth=\".8\"/></svg>\r\n <span style={{ fontSize: 11, color: C.muted, fontFamily: \"monospace\", letterSpacing: \".02em\" }}>{url || \"email-preview\"}</span>\r\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill={icon} style={{ marginLeft: \"auto\" }}><path d=\"M1 4a3 3 0 106 0A3 3 0 001 4z\"/></svg>\r\n </div>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <circle cx=\"7\" cy=\"7\" r=\"5.5\" stroke={icon} strokeWidth=\"1.2\"/>\r\n <path d=\"M7 4.5v3l2 1.5\" stroke={icon} strokeWidth=\"1.2\" strokeLinecap=\"round\"/>\r\n </svg>\r\n </div>\r\n );\r\n}\r\n\r\nfunction StatusBar({ time, C, variant = \"light\" }) {\r\n const dark = variant === \"dark\";\r\n const ink = dark ? \"#f5f5f7\" : C.text;\r\n const barBg = dark ? \"#000000\" : C.toolbarBg;\r\n const hair = dark ? \"#2c2c2e\" : C.border;\r\n return (\r\n <div style={{ background: barBg, height: 44, display: \"flex\", alignItems: \"flex-end\", justifyContent: \"space-between\", padding: \"0 24px 8px\", flexShrink: 0, borderBottom: `1px solid ${hair}` }}>\r\n <span style={{ fontSize: 12, fontWeight: 700, color: ink, letterSpacing: \".04em\" }}>{time}</span>\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\r\n <svg width=\"14\" height=\"10\" viewBox=\"0 0 14 10\" fill={ink} opacity=\".75\"><rect x=\"0\" y=\"4\" width=\"2\" height=\"6\" rx=\"1\"/><rect x=\"3\" y=\"3\" width=\"2\" height=\"7\" rx=\"1\"/><rect x=\"6\" y=\"1\" width=\"2\" height=\"9\" rx=\"1\"/><rect x=\"9\" y=\"0\" width=\"2\" height=\"10\" rx=\"1\"/></svg>\r\n <svg width=\"14\" height=\"10\" viewBox=\"0 0 16 12\" fill={ink} opacity=\".75\"><path d=\"M8 2.4C5.6 2.4 3.4 3.4 1.8 5L0 3.2C2.2 1.2 5 0 8 0s5.8 1.2 8 3.2L14.2 5C12.6 3.4 10.4 2.4 8 2.4z\"/><path d=\"M8 6c-1.6 0-3 .7-4 1.7L2.4 6.2C3.8 4.8 5.8 4 8 4s4.2.8 5.6 2.2L12 7.7C11 6.7 9.6 6 8 6z\"/><circle cx=\"8\" cy=\"11\" r=\"1.5\"/></svg>\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\r\n <div style={{ width: 18, height: 9, border: `1.5px solid ${ink}`, borderRadius: 2, display: \"flex\", alignItems: \"center\", padding: \"1px\", opacity: 0.75 }}>\r\n <div style={{ width: \"70%\", height: \"100%\", background: ink, borderRadius: 1 }} />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction AndroidStatusBar({ time }: { time: string }) {\r\n const ink = \"#e8eaed\";\r\n return (\r\n <div\r\n style={{\r\n background: \"#1a1a1c\",\r\n height: 48,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n padding: \"0 18px 0 20px\",\r\n flexShrink: 0,\r\n borderBottom: \"1px solid #2d2d30\",\r\n }}\r\n >\r\n <span style={{ fontSize: 14, fontWeight: 600, color: ink, letterSpacing: \".02em\" }}>{time}</span>\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\r\n <svg width=\"16\" height=\"10\" viewBox=\"0 0 16 10\" fill=\"none\" stroke={ink} strokeWidth={1.2} opacity={0.9}>\r\n <path d=\"M8 9a5 5 0 000-8M3 5a3 3 0 105 0M5.5 5a1.5 1.5 0 103 0\" strokeLinecap=\"round\" />\r\n </svg>\r\n <svg width=\"14\" height=\"10\" viewBox=\"0 0 14 10\" fill={ink} opacity={0.9}>\r\n <rect x=\"1\" y=\"7\" width=\"2\" height=\"2\" rx=\"0.5\" />\r\n <rect x=\"4.5\" y=\"5\" width=\"2\" height=\"4\" rx=\"0.5\" />\r\n <rect x=\"8\" y=\"3\" width=\"2\" height=\"6\" rx=\"0.5\" />\r\n <rect x=\"11\" y=\"1\" width=\"2\" height=\"8\" rx=\"0.5\" />\r\n </svg>\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 2, border: `1.5px solid ${ink}`, borderRadius: 3, padding: \"2px 5px\", opacity: 0.95 }}>\r\n <div style={{ width: 14, height: 7, borderRadius: 1, background: ink, opacity: 0.35 }} />\r\n <div style={{ width: 1, height: 5, background: ink, borderRadius: 1 }} />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/** Aspect-ratio–locked shell; iframe fills remaining height below system chrome. */\r\nfunction MobileDeviceChrome({\r\n variant,\r\n children,\r\n C,\r\n}: {\r\n variant: MobilePreviewVariant;\r\n children: ReactNode;\r\n C: Record<string, string>;\r\n}) {\r\n const spec = variant === \"android\" ? MOBILE_ANDROID : MOBILE_IPHONE;\r\n const now = new Date();\r\n const time = `${now.getHours().toString().padStart(2, \"0\")}:${now.getMinutes().toString().padStart(2, \"0\")}`;\r\n const frameShell =\r\n variant === \"android\"\r\n ? \"linear-gradient(160deg, #3a3a3e 0%, #252528 40%, #1a1a1d 100%)\"\r\n : \"linear-gradient(165deg, #1c1c1e 0%, #000000 48%, #0d0d0f 100%)\";\r\n const sideBtn = \"#2c2c2e\";\r\n const screenBorder = variant === \"android\" ? \"#0d0d0f\" : \"#0a0a0a\";\r\n\r\n /** Fixed CSS width so iframe viewport + aspect ratio stay correct; parent scales to fit viewport. */\r\n const frameOuterW = spec.logicalW + (variant === \"android\" ? 20 : 18);\r\n\r\n return (\r\n <div\r\n style={{\r\n width: frameOuterW,\r\n aspectRatio: `${spec.logicalW} / ${spec.logicalH}`,\r\n boxSizing: \"border-box\",\r\n borderRadius: spec.outerRadius,\r\n background: frameShell,\r\n padding: variant === \"android\" ? \"5px 5px 6px\" : \"0 3px 3px\",\r\n boxShadow: \"0 0 0 1px #000, 0 32px 72px rgba(0,0,0,.55)\",\r\n position: \"relative\",\r\n flexShrink: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n {variant === \"iphone\" ? (\r\n <>\r\n <div style={{ position: \"absolute\", left: -3, top: \"18%\", width: 3, height: 32, background: sideBtn, borderRadius: \"2px 0 0 2px\", zIndex: 2 }} />\r\n <div style={{ position: \"absolute\", left: -3, top: \"26%\", width: 3, height: 60, background: sideBtn, borderRadius: \"2px 0 0 2px\", zIndex: 2 }} />\r\n <div style={{ position: \"absolute\", left: -3, top: \"34%\", width: 3, height: 60, background: sideBtn, borderRadius: \"2px 0 0 2px\", zIndex: 2 }} />\r\n <div style={{ position: \"absolute\", right: -3, top: \"28%\", width: 3, height: 80, background: sideBtn, borderRadius: \"0 2px 2px 0\", zIndex: 2 }} />\r\n </>\r\n ) : null}\r\n\r\n <div\r\n style={{\r\n flex: 1,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n borderRadius: spec.innerRadius,\r\n overflow: \"hidden\",\r\n border: `2px solid ${screenBorder}`,\r\n background: \"#000\",\r\n }}\r\n >\r\n {variant === \"iphone\" ? (\r\n <>\r\n <StatusBar time={time} C={C} variant=\"dark\" />\r\n <div style={{ position: \"relative\", background: \"#000\", marginTop: -1, minHeight: 28, flexShrink: 0 }}>\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n width: 110,\r\n height: 28,\r\n background: \"#000\",\r\n borderRadius: \"0 0 18px 18px\",\r\n zIndex: 10,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 8,\r\n }}\r\n >\r\n <div style={{ width: 10, height: 10, borderRadius: \"50%\", background: \"#1c1c1e\", border: \"2px solid #3a3a3c\" }} />\r\n <div style={{ width: 54, height: 5, borderRadius: 3, background: \"#3a3a3c\" }} />\r\n </div>\r\n </div>\r\n </>\r\n ) : (\r\n <div style={{ position: \"relative\", flexShrink: 0 }}>\r\n <AndroidStatusBar time={time} />\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: 10,\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n width: 12,\r\n height: 12,\r\n borderRadius: \"50%\",\r\n background: \"#0a0a0c\",\r\n border: \"2px solid #2a2a2e\",\r\n zIndex: 5,\r\n pointerEvents: \"none\",\r\n }}\r\n />\r\n </div>\r\n )}\r\n\r\n <div\r\n style={{\r\n flex: 1,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n background: \"#fff\",\r\n padding: 10,\r\n boxSizing: \"border-box\",\r\n }}\r\n >\r\n <div style={{ flex: 1, minHeight: 0, width: \"100%\", position: \"relative\" }}>{children}</div>\r\n </div>\r\n\r\n {variant === \"iphone\" ? (\r\n <div style={{ background: \"#fff\", height: 22, flexShrink: 0, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\r\n <div style={{ width: 120, height: 5, borderRadius: 3, background: \"#d1d5db\" }} />\r\n </div>\r\n ) : (\r\n <div style={{ background: \"#0f0f10\", height: 26, flexShrink: 0, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\r\n <div style={{ width: 112, height: 4, borderRadius: 4, background: \"#4a4a52\" }} />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/** Scales the phone shell to fit the preview pane (short viewports, split view) without changing iframe logical width. */\r\nfunction MobilePhoneScaleSlot({ variantKey, children }: { variantKey: MobilePreviewVariant; children: ReactNode }) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const phoneRef = useRef<HTMLDivElement>(null);\r\n const [fit, setFit] = useState({ s: 1, w: 0, h: 0 });\r\n\r\n useLayoutEffect(() => {\r\n const container = containerRef.current;\r\n const phone = phoneRef.current;\r\n if (!container || !phone) return;\r\n\r\n const run = () => {\r\n const cw = container.clientWidth;\r\n const ch = container.clientHeight;\r\n const pw = phone.offsetWidth;\r\n const ph = phone.offsetHeight;\r\n if (cw < 12 || ch < 12 || pw < 12 || ph < 12) return;\r\n const pad = 20;\r\n const raw = Math.min(1, (cw - pad) / pw, (ch - pad) / ph);\r\n const s = Number.isFinite(raw) ? Math.max(0.2, raw) : 1;\r\n setFit({ s, w: pw * s, h: ph * s });\r\n };\r\n\r\n const ro = new ResizeObserver(run);\r\n ro.observe(container);\r\n ro.observe(phone);\r\n run();\r\n const t = window.setTimeout(run, 0);\r\n const raf = window.requestAnimationFrame(run);\r\n return () => {\r\n ro.disconnect();\r\n window.clearTimeout(t);\r\n window.cancelAnimationFrame(raf);\r\n };\r\n }, [variantKey]);\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n style={{\r\n flex: 1,\r\n minHeight: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: fit.w > 0 ? fit.w : undefined,\r\n height: fit.h > 0 ? fit.h : undefined,\r\n minWidth: 0,\r\n minHeight: 0,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n transform: `scale(${fit.s})`,\r\n transformOrigin: \"center center\",\r\n willChange: \"transform\",\r\n }}\r\n >\r\n <div ref={phoneRef} style={{ width: \"max-content\" }}>\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction TabletChrome({ children, C }) {\r\n const shell = `linear-gradient(145deg, ${C.canvas} 0%, ${C.surface} 50%, ${C.border} 100%)`;\r\n return (\r\n <div style={{ width: \"max-content\", maxWidth: \"100%\", boxSizing: \"border-box\", borderRadius: 18, background: shell, padding: \"14px 14px 20px\", boxShadow: `0 0 0 1px ${C.border}, 0 24px 56px rgba(15,23,42,.1), inset 0 1px 0 #fff`, flexShrink: 0 }}>\r\n <div style={{ height: 16, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", marginBottom: 10 }}>\r\n <div style={{ width: 60, height: 5, borderRadius: 3, background: C.muted, opacity: 0.5 }} />\r\n </div>\r\n <div style={{ borderRadius: 10, overflow: \"hidden\", border: `2px solid ${C.border}`, background: \"#fff\" }}>\r\n <BrowserBar url=\"email-preview\" C={C} />\r\n <div style={{ overflow: \"hidden\", background: \"#fff\", minHeight: 0, padding: 12 }}>{children}</div>\r\n </div>\r\n <div style={{ height: 18, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", marginTop: 10 }}>\r\n <div style={{ width: 100, height: 4, borderRadius: 2, background: C.muted, opacity: 0.45 }} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction DesktopChrome({ children, C, maxW }) {\r\n return (\r\n <div style={{ width: \"100%\", maxWidth: maxW, borderRadius: 10, overflow: \"hidden\", boxShadow: `0 16px 48px rgba(15,23,42,.1), 0 0 0 1px ${C.border}`, border: `1px solid ${C.border}`, background: C.sidebar }}>\r\n <BrowserBar url=\"email-preview\" C={C} />\r\n <div style={{ background: \"#fff\", overflow: \"hidden\", minHeight: 0, padding: 12 }}>{children}</div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction PreviewModal({\r\n html,\r\n contentWidth,\r\n rowCount = 0,\r\n blockCount = 0,\r\n editorZoom = 100,\r\n locale = \"en\",\r\n initialDevice,\r\n initialMobileVariant = \"iphone\",\r\n onClose,\r\n C,\r\n title,\r\n secondaryActionLabel,\r\n onSecondaryAction,\r\n}: EmailPreviewModalProps) {\r\n const [dev, setDev] = useState(initialDevice || \"desktop\");\r\n const [zoom, setZoom] = useState(100);\r\n const [split, setSplit] = useState(false);\r\n const [mobileVariant, setMobileVariant] = useState<MobilePreviewVariant>(initialMobileVariant);\r\n\r\n useEffect(() => {\r\n const h = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") onClose();\r\n };\r\n window.addEventListener(\"keydown\", h);\r\n return () => window.removeEventListener(\"keydown\", h);\r\n }, [onClose]);\r\n\r\n // Reset zoom when device changes\r\n useEffect(() => setZoom(100), [dev]);\r\n\r\n /** Desktop: fill chrome. Mobile/tablet: fixed CSS width on the iframe so `srcDoc` layout viewport matches device (responsive CSS applies). */\r\n const iframeHDesktop = \"min(720px, calc(100vh - 200px))\";\r\n const mobileIframeW = previewIframeWidthPx(\"mobile\", mobileVariant);\r\n const tabletIframeW = previewIframeWidthPx(\"tablet\");\r\n const srcDocMobile = useMemo(() => previewEmailSrcDoc(html, mobileIframeW), [html, mobileIframeW]);\r\n const srcDocTablet = useMemo(() => previewEmailSrcDoc(html, tabletIframeW), [html, tabletIframeW]);\r\n\r\n const IframeContent = ({\r\n srcDoc,\r\n title: iframeTitle,\r\n iframeWidth,\r\n fill,\r\n style: s = {},\r\n }: {\r\n srcDoc: string;\r\n title: string;\r\n iframeWidth?: number;\r\n /** Fill parent (e.g. phone shell); use with a `position: relative` flex child. */\r\n fill?: boolean;\r\n style?: CSSProperties;\r\n }) => (\r\n <iframe\r\n srcDoc={srcDoc}\r\n title={iframeTitle}\r\n width={iframeWidth}\r\n scrolling=\"yes\"\r\n style={{\r\n border: \"none\",\r\n display: \"block\",\r\n boxSizing: \"border-box\",\r\n ...(fill\r\n ? {\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n maxWidth: \"100%\",\r\n overflow: \"auto\",\r\n }\r\n : iframeWidth != null\r\n ? {\r\n width: iframeWidth,\r\n maxWidth: \"min(100%, calc(100vw - 80px))\",\r\n }\r\n : {\r\n width: \"100%\",\r\n maxWidth: \"100%\",\r\n }),\r\n ...(!fill ? { height: iframeHDesktop, minHeight: iframeWidth != null ? 220 : 280 } : { minHeight: 0 }),\r\n ...s,\r\n }}\r\n sandbox=\"allow-same-origin allow-scripts\"\r\n />\r\n );\r\n\r\n const deviceBg = C.canvas;\r\n const hairline = C.border;\r\n const tabInactiveBg = \"transparent\";\r\n const tabInactiveFg = C.muted;\r\n const tabActiveBg = C.accent;\r\n const tabActiveFg = \"#fff\";\r\n\r\n const previewBodyStretchMobile = dev === \"mobile\" || split;\r\n const previewBodyPadding = previewBodyStretchMobile ? \"12px 16px\" : \"28px 32px\";\r\n\r\n return (\r\n <div style={{ position: \"fixed\", inset: 0, zIndex: 9000, background: \"rgba(15, 23, 42, 0.45)\", backdropFilter: \"blur(12px)\", display: \"flex\", flexDirection: \"column\", overflow: \"hidden\" }}>\r\n <style>{`\r\n @keyframes pmSlideIn{from{opacity:0;transform:translateY(-12px)}to{opacity:1;transform:translateY(0)}}\r\n @keyframes devicePop{from{opacity:0;transform:scale(.94) translateY(16px)}to{opacity:1;transform:scale(1) translateY(0)}}\r\n .pm-device{animation:devicePop .22s cubic-bezier(.34,1.56,.64,1);}\r\n `}</style>\r\n\r\n {/* ── HEADER: subject left · device + zoom · actions right ── */}\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, padding: \"8px 16px\", background: C.toolbarBg, borderBottom: `1px solid ${hairline}`, flexShrink: 0, animation: \"pmSlideIn .16s ease\" }}>\r\n\r\n <span\r\n style={{\r\n flex: 1,\r\n minWidth: 0,\r\n fontWeight: 700,\r\n fontSize: 14,\r\n color: C.text,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n title={title || undefined}\r\n >\r\n {title?.trim() ? title : \"\\u2014\"}\r\n </span>\r\n\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, flexShrink: 0 }}>\r\n <div style={{ display: \"flex\", gap: 2, background: C.surface, padding: 3, borderRadius: 8, border: `1px solid ${hairline}` }}>\r\n {DEVICES.map((d) => (\r\n <button\r\n key={d.key}\r\n type=\"button\"\r\n title={d.label}\r\n aria-label={d.label}\r\n onClick={() => {\r\n setDev(d.key);\r\n setSplit(false);\r\n }}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: 34,\r\n height: 30,\r\n padding: 0,\r\n borderRadius: 6,\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n transition: \"all .15s\",\r\n background: dev === d.key && !split ? tabActiveBg : tabInactiveBg,\r\n color: dev === d.key && !split ? tabActiveFg : tabInactiveFg,\r\n }}\r\n >\r\n <PreviewDeviceIcon devKey={d.key} color={dev === d.key && !split ? tabActiveFg : tabInactiveFg} />\r\n </button>\r\n ))}\r\n <button\r\n type=\"button\"\r\n title=\"Split view\"\r\n aria-label=\"Split view\"\r\n onClick={() => setSplit((s) => !s)}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: 34,\r\n height: 30,\r\n padding: 0,\r\n borderRadius: 6,\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n transition: \"all .15s\",\r\n background: split ? tabActiveBg : tabInactiveBg,\r\n color: split ? tabActiveFg : tabInactiveFg,\r\n }}\r\n >\r\n <Columns2 size={15} strokeWidth={1.75} color={split ? tabActiveFg : tabInactiveFg} style={{ display: \"block\", flexShrink: 0 }} />\r\n </button>\r\n </div>\r\n\r\n {(dev === \"mobile\" || split) ? (\r\n <div\r\n role=\"group\"\r\n aria-label=\"Phone preview\"\r\n style={{\r\n display: \"flex\",\r\n gap: 2,\r\n background: C.surface,\r\n padding: 3,\r\n borderRadius: 8,\r\n border: `1px solid ${hairline}`,\r\n }}\r\n >\r\n {([\"iphone\", \"android\"] as const).map((v) => (\r\n <button\r\n key={v}\r\n type=\"button\"\r\n title={v === \"iphone\" ? MOBILE_IPHONE.label : MOBILE_ANDROID.label}\r\n aria-label={v === \"iphone\" ? MOBILE_IPHONE.label : MOBILE_ANDROID.label}\r\n aria-pressed={mobileVariant === v}\r\n onClick={() => setMobileVariant(v)}\r\n style={{\r\n padding: \"4px 10px\",\r\n borderRadius: 6,\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n fontSize: 11,\r\n fontWeight: 700,\r\n transition: \"all .15s\",\r\n background: mobileVariant === v ? tabActiveBg : tabInactiveBg,\r\n color: mobileVariant === v ? tabActiveFg : tabInactiveFg,\r\n }}\r\n >\r\n {v === \"iphone\" ? \"iPhone\" : \"Android\"}\r\n </button>\r\n ))}\r\n </div>\r\n ) : null}\r\n\r\n {dev === \"desktop\" && !split ? (\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\r\n <button type=\"button\" onClick={() => setZoom((z) => Math.max(50, z - 10))} style={{ background: C.surface, border: `1px solid ${hairline}`, color: C.text, width: 24, height: 24, borderRadius: 4, cursor: \"pointer\", fontSize: 13, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>−</button>\r\n <span style={{ fontSize: 11, color: C.muted, minWidth: 36, textAlign: \"center\" }}>{zoom}%</span>\r\n <button type=\"button\" onClick={() => setZoom((z) => Math.min(150, z + 10))} style={{ background: C.surface, border: `1px solid ${hairline}`, color: C.text, width: 24, height: 24, borderRadius: 4, cursor: \"pointer\", fontSize: 13, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>+</button>\r\n <button type=\"button\" onClick={() => setZoom(100)} style={{ background: \"none\", border: `1px solid ${hairline}`, color: C.muted, padding: \"3px 7px\", borderRadius: 4, cursor: \"pointer\", fontSize: 10 }}>Reset</button>\r\n </div>\r\n ) : null}\r\n\r\n {typeof onSecondaryAction === \"function\" && secondaryActionLabel ? (\r\n <button\r\n type=\"button\"\r\n onClick={onSecondaryAction}\r\n style={{\r\n background: C.surface,\r\n border: `1px solid ${hairline}`,\r\n color: C.text,\r\n padding: \"6px 12px\",\r\n borderRadius: 6,\r\n cursor: \"pointer\",\r\n fontSize: 12,\r\n fontWeight: 700,\r\n }}\r\n >\r\n {secondaryActionLabel}\r\n </button>\r\n ) : null}\r\n\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n style={{\r\n background: \"none\",\r\n border: `1px solid ${hairline}`,\r\n color: C.muted,\r\n width: 30,\r\n height: 30,\r\n borderRadius: 6,\r\n cursor: \"pointer\",\r\n fontSize: 17,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}\r\n >\r\n ×\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* ── BODY (no outer scroll; iframe handles scrolling) ── */}\r\n <div style={{ flex: 1, display: \"flex\", minHeight: 0, overflow: \"hidden\" }}>\r\n <div\r\n style={{\r\n flex: 1,\r\n minHeight: 0,\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n alignItems: previewBodyStretchMobile ? \"stretch\" : dev === \"desktop\" ? \"flex-start\" : \"center\",\r\n justifyContent: \"center\",\r\n padding: previewBodyPadding,\r\n background: deviceBg,\r\n }}\r\n >\r\n {split ? (\r\n <div style={{ display: \"flex\", gap: 24, alignItems: \"stretch\", justifyContent: \"center\", width: \"100%\", minHeight: 0, overflow: \"hidden\" }}>\r\n <div\r\n className=\"pm-device\"\r\n style={{\r\n width: \"100%\",\r\n maxWidth: 440,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n minHeight: 0,\r\n overflow: \"hidden\",\r\n flexShrink: 0,\r\n }}\r\n >\r\n <MobilePhoneScaleSlot variantKey={mobileVariant}>\r\n <MobileDeviceChrome variant={mobileVariant} C={C}>\r\n <IframeContent srcDoc={srcDocMobile} title=\"mobile-split\" iframeWidth={mobileIframeW} fill />\r\n </MobileDeviceChrome>\r\n </MobilePhoneScaleSlot>\r\n </div>\r\n <div className=\"pm-device\" style={{ width: \"100%\", minWidth: 0, flex: 1, maxWidth: 900, overflow: \"hidden\" }}>\r\n <DesktopChrome C={C} maxW={900}>\r\n <IframeContent srcDoc={html} title=\"desktop-split\" />\r\n </DesktopChrome>\r\n </div>\r\n </div>\r\n ) : dev === \"mobile\" ? (\r\n <div className=\"pm-device\" style={{ width: \"380px\", maxWidth: 440, display: \"flex\", justifyContent: \"center\", alignItems: \"center\", overflow: \"hidden\", minHeight: 0 }}>\r\n <MobilePhoneScaleSlot variantKey={mobileVariant}>\r\n <MobileDeviceChrome variant={mobileVariant} C={C}>\r\n <IframeContent srcDoc={srcDocMobile} title=\"mobile\" iframeWidth={mobileIframeW} fill />\r\n </MobileDeviceChrome>\r\n </MobilePhoneScaleSlot>\r\n </div>\r\n ) : dev === \"tablet\" ? (\r\n <div className=\"pm-device\" style={{ width: \"100%\", display: \"flex\", justifyContent: \"center\", overflow: \"hidden\" }}>\r\n <TabletChrome C={C}>\r\n <IframeContent srcDoc={srcDocTablet} title=\"tablet\" iframeWidth={tabletIframeW} />\r\n </TabletChrome>\r\n </div>\r\n ) : (\r\n <div\r\n className=\"pm-device\"\r\n style={{\r\n width: \"100%\",\r\n maxWidth: 1024,\r\n transformOrigin: \"top center\",\r\n transform: `scale(${zoom / 100})`,\r\n marginBottom: zoom < 100 ? `-${(1 - zoom / 100) * 400}px` : 0,\r\n transition: \"transform .2s,margin .2s\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <DesktopChrome C={C} maxW={1024}>\r\n <IframeContent srcDoc={html} title=\"desktop\" />\r\n </DesktopChrome>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport { PreviewModal, DEVICES };\r\n","import { useEffect, useRef } from \"react\";\r\n\r\nfunction ContextMenu({x,y,items,onClose,C}) {\r\n const ref=useRef(null);\r\n useEffect(()=>{\r\n const h=()=>onClose();\r\n window.addEventListener(\"mousedown\",h);\r\n window.addEventListener(\"keydown\",h);\r\n return()=>{window.removeEventListener(\"mousedown\",h);window.removeEventListener(\"keydown\",h);};\r\n },[onClose]);\r\n return (\r\n <div ref={ref} onMouseDown={e=>e.stopPropagation()} style={{position:\"fixed\",left:x,top:y,zIndex:9999,background:C.sidebar,border:`1px solid ${C.border}`,borderRadius:7,padding:\"4px 0\",boxShadow:`0 8px 32px rgba(0,0,0,.4)`,minWidth:160}}>\r\n {items.map((item,i)=>item.sep?(\r\n <div key={i} style={{height:1,background:C.border,margin:\"3px 0\"}}/>\r\n ):(\r\n <button\r\n key={i}\r\n type=\"button\"\r\n disabled={!!item.disabled}\r\n onClick={()=>{if(item.disabled)return;item.action();onClose();}}\r\n style={{\r\n display:\"block\",width:\"100%\",background:\"none\",border:\"none\",padding:\"7px 14px\",textAlign:\"left\",\r\n cursor:item.disabled?\"not-allowed\":\"pointer\",fontSize:12,\r\n color:item.disabled?C.muted:item.danger?C.danger:C.text,\r\n fontWeight:item.bold?700:400,opacity:item.disabled?0.45:1,\r\n }}\r\n onMouseEnter={e=>{if(!item.disabled)e.currentTarget.style.background=C.surface;}}\r\n onMouseLeave={e=>{e.currentTarget.style.background=\"none\";}}\r\n >\r\n {item.icon&&<span style={{marginRight:8}}>{item.icon}</span>}{item.label}\r\n </button>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport { ContextMenu };\r\n","function ConfirmDialog({message,onConfirm,onCancel,C}) {\r\n return (\r\n <div style={{position:\"fixed\",inset:0,zIndex:9500,background:\"rgba(0,0,0,.7)\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\"}}>\r\n <div style={{background:C.sidebar,border:`1px solid ${C.border}`,borderRadius:10,padding:24,maxWidth:320,textAlign:\"center\",boxShadow:\"0 20px 60px rgba(0,0,0,.5)\"}}>\r\n <div style={{fontSize:24,marginBottom:12}}>⚠️</div>\r\n <div style={{fontSize:14,color:C.text,marginBottom:20,lineHeight:1.5}}>{message}</div>\r\n <div style={{display:\"flex\",gap:10,justifyContent:\"center\"}}>\r\n <button onClick={onCancel} style={{background:\"none\",border:`1px solid ${C.border}`,color:C.text,padding:\"8px 20px\",borderRadius:6,cursor:\"pointer\",fontSize:13}}>Cancel</button>\r\n <button onClick={onConfirm} style={{background:C.danger,border:\"none\",color:\"#fff\",padding:\"8px 20px\",borderRadius:6,cursor:\"pointer\",fontSize:13,fontWeight:700}}>Confirm</button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport { ConfirmDialog };\r\n","import { useState, useRef } from \"react\";\r\n\r\nfunction TBtn({\r\n onClick,\r\n title,\r\n children,\r\n active = false,\r\n accent,\r\n muted,\r\n border,\r\n text,\r\n disabled = false,\r\n style: sx = {},\r\n}) {\r\n const [show,setShow]=useState(false);\r\n const ref=useRef(null);\r\n const [pos,setPos]=useState({left:0,top:0});\r\n return (\r\n <div style={{position:\"relative\",display:\"inline-flex\"}} ref={ref}\r\n onMouseEnter={()=>{setShow(true);if(ref.current){const r=ref.current.getBoundingClientRect();setPos({left:r.left+r.width/2,top:r.bottom+6});}}}\r\n onMouseLeave={()=>setShow(false)}>\r\n <button onClick={onClick} disabled={disabled}\r\n style={{background:active?`${accent}22`:\"none\",border:`1px solid ${active?accent:border}`,color:disabled?muted:active?accent:text,padding:\"5px 10px\",borderRadius:5,cursor:disabled?\"default\":\"pointer\",fontSize:12,fontWeight:600,...sx}}>\r\n {children}\r\n </button>\r\n {show&&<div style={{position:\"fixed\",left:pos.left,top:pos.top,transform:\"translateX(-50%)\",background:\"rgba(0,0,0,.85)\",color:\"#fff\",padding:\"3px 8px\",borderRadius:4,fontSize:11,pointerEvents:\"none\",whiteSpace:\"nowrap\",zIndex:9999}}>{title}</div>}\r\n </div>\r\n );\r\n}\r\n\r\nexport { TBtn };\r\n"],"mappings":"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","names":["ReactEmailEditor","import_react","BOX0","import_jsx_runtime","numOr","tr","pad","base","tr","tr","pad","defaults","merged","import_jsx_runtime","tr","numOr","import_lucide_react","import_react","import_lucide_react","import_react","import_jsx_runtime","pad","StarterKit","TextAlign","Placeholder","import_jsx_runtime","import_jsx_runtime","UploadIcon","g","SolidIcon","GradientIcon","ImageIcon","FONTS","pad","import_react","import_lucide_react","import_jsx_runtime","pad","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","options","r","ColorIcon","ImageIcon","RepeatIcon","GradientIcon","ReactEmailEditor"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/ReactEmailEditor.tsx","../src/constants.tsx","../src/defaultBlockProps.ts","../src/lib/columnProps.ts","../src/lib/factories.ts","../src/lib/columnPath.ts","../src/lib/htmlUtils.ts","../src/socialIcons.tsx","../src/lib/blockBackground.ts","../src/lib/emailHtml.ts","../src/schema/emailDocument.ts","../src/lib/emailDesignJson.ts","../src/lib/htmlToEmailDesign.ts","../src/editor/canvas/DesignCanvas.tsx","../src/editor/properties/PropertyEditors.tsx","../src/editor/properties/TextRichEditor.tsx","../src/editor/properties/LetterSpacing.ts","../src/editor/properties/ColorSwatchGrid.tsx","../src/editor/preview/EmailPreviewModal.tsx","../src/editor/overlays/ContextMenu.tsx","../src/editor/overlays/ConfirmDialog.tsx","../src/editor/chrome/TBtn.tsx"],"sourcesContent":["export {\r\n ReactEmailEditor,\r\n type ReactEmailEditorRef,\r\n type ReactEmailEditorProps,\r\n type ReactEmailEditorOptions,\r\n type LoadJsonOptions,\r\n} from \"./ReactEmailEditor\";\r\n\r\nexport {\r\n jsonToHtml,\r\n canonicalizeEmailDocument,\r\n coerceEmailDocumentInput,\r\n type JsonToHtmlOptions,\r\n} from \"./lib/emailDesignJson\";\r\nexport { htmlToEmailDesignTemplate, extractHtmlForDesign, htmlToJson } from \"./lib/htmlToEmailDesign\";\r\nexport type { EmailHtmlOptions } from \"./lib/emailHtml\";\r\nexport { utf8ToBase64, base64ToUtf8 } from \"./lib/htmlUtils\";\r\n\r\nexport {\r\n PreviewModal as EmailPreviewModal,\r\n DEVICES as emailPreviewDevices,\r\n type EmailPreviewModalProps,\r\n type MobilePreviewVariant,\r\n} from \"./editor/preview/EmailPreviewModal\";\r\n\r\nexport type {\r\n EmailDocument,\r\n EmailDocumentSettings,\r\n EmailDocumentRow,\r\n EmailDocumentColumn,\r\n BlockBase,\r\n RowProps,\r\n ColumnProps,\r\n RowStyles,\r\n ColumnStyles,\r\n} from \"./schema/emailDocument\";\r\n","import {\n useState, useRef, useEffect, useCallback, useMemo,\n forwardRef,\n useImperativeHandle,\n Fragment,\n type CSSProperties,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from \"react\";\nimport {\n THEMES,\n tr,\n LAYOUT_PRESETS,\n CONTENT_BLOCK_TYPES,\n BLOCK_PALETTE_GROUPS,\n type BlockPaletteGroupKey,\n} from \"./constants\";\nimport { makeLayoutRow, makeContentBlock, makeNestedRowBlock, makeRootContentRow, uid } from \"./lib/factories\";\nimport {\n getColumnBlocks,\n updateColumnAt,\n toColumnLoc,\n sameColumnLoc,\n countBlocksInDesign,\n isSplitLayoutBlock,\n isRootContentRow,\n MAX_NESTED_LAYOUT_DEPTH,\n nestedLayoutDepth,\n} from \"./lib/columnPath\";\nimport {\n coerceEmailDocumentInput,\n designToEmailDocument,\n emailDocumentToEditorRows,\n normalizeEmailDesignInput,\n jsonToHtml,\n} from \"./lib/emailDesignJson\";\nimport { htmlToJson } from \"./lib/htmlToEmailDesign\";\nimport { CanvasRow } from \"./editor/canvas/DesignCanvas\";\nimport { Image as ImageIcon, Repeat as RepeatIcon, Move as MoveIcon, Scaling, Crosshair, Blend as GradientIcon, Droplets as ColorIcon } from \"lucide-react\";\nimport { ContentBlockEditor, LayoutRowEditor, PR, NumRangePx, ColorField, ImageUrlUploadField, DynamicGradientField, BgModeButtons } from \"./editor/properties/PropertyEditors\";\nimport { PreviewModal } from \"./editor/preview/EmailPreviewModal\";\nimport { designToHtml, type EmailHtmlOptions } from \"./lib/emailHtml\";\nimport { ContextMenu } from \"./editor/overlays/ContextMenu\";\nimport { ConfirmDialog } from \"./editor/overlays/ConfirmDialog\";\nimport { TBtn } from \"./editor/chrome/TBtn\";\n\nconst RIGHT_RAIL_DEFAULT_W = 328;\nconst RIGHT_RAIL_MIN_W = 260;\nconst RIGHT_RAIL_MAX_W = 720;\n\n/** Theme color tokens (subset used by the editor chrome). */\ntype ThemeColors = (typeof THEMES)[\"light\"];\n\n/** Known `options` keys for {@link ReactEmailEditor} — callers may pass extra keys; these are what the editor reads. */\nexport type ReactEmailEditorOptions = EmailHtmlOptions & {\n appearance?: {\n theme?: string;\n /** Shallow merge over the active theme (e.g. accent border). */\n colors?: Partial<ThemeColors>;\n /** Extra named palettes; keys appear in Settings → Color scheme. */\n customThemes?: Record<string, ThemeColors>;\n };\n locale?: string;\n features?: { autoSave?: { enabled?: boolean; interval?: number } };\n tools?: Record<string, { enabled?: boolean }>;\n /** Optional labels for block-library sections (row layouts + content blocks). */\n blockLibrary?: {\n groupHeadings?: { blocks?: string };\n /** Override default palette group titles (keys: text, structure, media, actions, widgets). */\n paletteGroupLabels?: Partial<Record<BlockPaletteGroupKey, string>>;\n };\n};\n\nexport type LoadJsonOptions = { mode?: \"replace\" | \"append\" };\n\nexport interface ReactEmailEditorRef {\n loadJson(input: string | Record<string, unknown>, options?: LoadJsonOptions): void;\n /** Calls `cb` with the design as a JSON string (new `email_document` schema). */\n exportJson(cb: (json: string) => void, pretty?: boolean): void;\n}\n\nexport type ReactEmailEditorProps = {\n minHeight?: string;\n editorId?: string;\n options?: ReactEmailEditorOptions;\n style?: CSSProperties;\n onLoad?: (api: ReactEmailEditorRef) => void;\n onReady?: (api: ReactEmailEditorRef) => void;\n onUpload?: (file: File) => Promise<string>;\n templates?: { name: string; design: unknown; thumbnail?: string }[];\n hideTemplates?: boolean;\n children?: ReactNode;\n};\n\nconst ReactEmailEditorComponent = forwardRef<ReactEmailEditorRef, ReactEmailEditorProps>(\n function ReactEmailEditor(\n {\n minHeight = \"100vh\",\n editorId = \"email-editor\",\n onLoad,\n onReady,\n onUpload,\n options = {},\n templates = [],\n hideTemplates = false,\n style = {},\n },\n ref,\n ) {\n const opt = options;\n const mergedThemes = useMemo(\n () => ({ ...THEMES, ...(opt.appearance?.customThemes || {}) }),\n [opt.appearance?.customThemes],\n );\n const initialTheme =\n typeof opt.appearance?.theme === \"string\" && mergedThemes[opt.appearance.theme]\n ? opt.appearance.theme\n : \"light\";\n const [colorSchema, setColorSchema] = useState<string>(initialTheme);\n\n const [rows, setRows] = useState<any[]>(() => [makeLayoutRow(LAYOUT_PRESETS[0])]);\n const [selectedRowId,setSelectedRowId] = useState<string | null>(null);\n const [selContentId, setSelContentId] = useState<string | null>(null);\n const [selContentMeta,setSelMeta] = useState<any>(null);\n const [dragOver, setDragOver] = useState<number | null>(null);\n const [draggingRowId,setDraggingRowId] = useState<string | null>(null);\n const draggingRowIdRef = useRef<string | null>(null);\n const setRowDrag = useCallback((id: string | null) => {\n draggingRowIdRef.current = id;\n setDraggingRowId(id);\n }, []);\n const [history, setHistory] = useState<string[]>([]);\n const [future, setFuture] = useState<string[]>([]);\n const [showPreviewModal,setShowPreview]= useState<boolean>(false);\n const [previewDevice,setPreviewDevice] = useState<string>(\"desktop\");\n const [activeTab, setActiveTab] = useState<\"blocks\" | \"settings\">(\"blocks\");\n const [templatesOpen,setTemplatesOpen] = useState<boolean>(false);\n const [jsonLoading, setJsonLoading] = useState<boolean>(false);\n const [autoSaveMsg, setAutoSaveMsg] = useState<string>(\"\");\n const [locale, setLocale] = useState<string>(\n typeof opt.locale === \"string\" ? opt.locale : \"en\",\n );\n const [zoom, setZoom] = useState(100);\n const [rightRailWidth, setRightRailWidth] = useState(RIGHT_RAIL_DEFAULT_W);\n const [ctxMenu, setCtxMenu] = useState<any>(null); // {x,y,items}\n const [confirm, setConfirm] = useState<any>(null); // {msg,onConfirm}\n const [settings, setSettings] = useState({\n bgColor: \"#f1f5f9\",\n bgImage: \"\",\n bgSize: \"cover\",\n bgRepeat: \"no-repeat\",\n bgPosition: \"center\",\n bgGradient: null as any,\n contentBg: \"#ffffff\",\n contentBgImage: \"\",\n contentBgSize: \"cover\",\n contentBgRepeat: \"no-repeat\",\n contentBgPosition: \"center\",\n contentBgGradient: null as any,\n contentWidth: 600,\n padding: 24,\n borderRadius: 8,\n });\n /** Background UI: show type first; detail controls only after a choice (or after `loadJson`). */\n const [pageBgUiStep, setPageBgUiStep] = useState<null | \"solid\" | \"image\" | \"gradient\">(null);\n const [contentBgUiStep, setContentBgUiStep] = useState<null | \"solid\" | \"image\" | \"gradient\">(null);\n\n const pageBgLastSolidRef = useRef<string>(\"#f1f5f9\");\n const pageBgIsOff =\n !String((settings as any).bgColor ?? \"\").trim() &&\n !String((settings as any).bgImage ?? \"\").trim() &&\n !((settings as any).bgGradient as any);\n\n const applyPageBgMode = (mode: \"solid\" | \"image\" | \"gradient\") => {\n setPageBgUiStep(mode);\n if (mode === \"solid\") {\n setSettings((s) => {\n const next = { ...s, bgGradient: null, bgImage: \"\" };\n const raw = typeof next.bgColor === \"string\" ? next.bgColor.trim() : \"\";\n if (!raw) next.bgColor = pageBgLastSolidRef.current || \"#f1f5f9\";\n return next;\n });\n return;\n }\n if (mode === \"image\") {\n setSettings((s) => ({ ...s, bgGradient: null }));\n return;\n }\n setSettings((s) => ({\n ...s,\n bgImage: \"\",\n bgGradient:\n (s as any).bgGradient || { angle: 135, colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"], stops: [0, 50, 100] },\n }));\n };\n\n const applyContentBgMode = (mode: \"solid\" | \"image\" | \"gradient\") => {\n setContentBgUiStep(mode);\n if (mode === \"solid\") {\n setSettings((s) => ({ ...s, contentBgGradient: null, contentBgImage: \"\" }));\n return;\n }\n if (mode === \"image\") {\n setSettings((s) => ({ ...s, contentBgGradient: null }));\n return;\n }\n setSettings((s) => ({\n ...s,\n contentBgImage: \"\",\n contentBgGradient:\n (s as any).contentBgGradient || { angle: 135, colors: [\"#ffffff\", \"#ffffff\", \"#ffffff\"], stops: [0, 50, 100] },\n }));\n };\n\n const autoSaveTimer = useRef<any>(null);\n /** Latest document for `exportJson`. */\n const rowsRef = useRef(rows);\n const settingsRef = useRef(settings);\n rowsRef.current = rows;\n settingsRef.current = settings;\n\n useEffect(() => {\n if (rows.length === 0) {\n setRows([makeLayoutRow(LAYOUT_PRESETS[0])]);\n }\n }, [rows.length]);\n\n useEffect(() => {\n const t = opt.appearance?.theme;\n if (typeof t === \"string\" && mergedThemes[t]) setColorSchema(t);\n }, [opt.appearance?.theme, mergedThemes]);\n\n const baseTheme = mergedThemes[colorSchema] || mergedThemes.light;\n const C: ThemeColors = { ...baseTheme, ...(opt.appearance?.colors || {}) };\n\n const L = (key) => tr(locale, key);\n\n // ── History ─────────────────────────────────────────────────────────────────\n const snap = useCallback(prev=>{\n setHistory(h=>[...h.slice(-50),JSON.stringify(prev)]);\n setFuture([]);\n },[]);\n const mutate = useCallback(fn=>{\n setRows(prev=>{\n snap(prev);\n const next=fn(prev);\n if (opt.features?.autoSave?.enabled) {\n clearTimeout(autoSaveTimer.current ?? undefined);\n autoSaveTimer.current = setTimeout(\n () => {\n setAutoSaveMsg(L(\"autoSaved\"));\n setTimeout(() => setAutoSaveMsg(\"\"), 2500);\n },\n opt.features?.autoSave?.interval ?? 3000,\n );\n }\n return next;\n });\n }, [snap, opt, locale]);\n\n const undo=()=>{\n if(!history.length) return;\n setFuture(f=>[JSON.stringify(rows),...f]);\n setRows(JSON.parse(history[history.length-1]));\n setHistory(h=>h.slice(0,-1));\n };\n const redo=()=>{\n if(!future.length) return;\n setHistory(h=>[...h,JSON.stringify(rows)]);\n setRows(JSON.parse(future[0]));\n setFuture(f=>f.slice(1));\n };\n\n // ── Keyboard shortcuts ──────────────────────────────────────────────────────\n useEffect(()=>{\n const handler=(e)=>{\n const tag=document.activeElement?.tagName;\n if(tag===\"INPUT\"||tag===\"TEXTAREA\"||tag===\"SELECT\") return;\n const ae=document.activeElement;\n /** TipTap / ProseMirror — let Backspace, Ctrl+Z, etc. stay inside the rich text field (not delete the block). */\n if(ae instanceof HTMLElement&&ae.closest(\".ProseMirror\")) return;\n if((e.ctrlKey||e.metaKey)&&e.key===\"z\"){e.preventDefault();undo();}\n else if((e.ctrlKey||e.metaKey)&&(e.key===\"y\"||(e.shiftKey&&e.key===\"z\"))){e.preventDefault();redo();}\n else if((e.ctrlKey||e.metaKey)&&e.key===\"d\"){e.preventDefault();if(selContentMeta)duplicateSelected();}\n else if(e.key===\"Escape\"){setSelContentId(null);setSelMeta(null);setSelectedRowId(null);setCtxMenu(null);}\n else if(e.key===\"Delete\"||e.key===\"Backspace\"){if(selContentMeta){e.preventDefault();deleteSelected();}}\n };\n window.addEventListener(\"keydown\",handler);\n return()=>window.removeEventListener(\"keydown\",handler);\n },[rows,history,future,selContentMeta]);\n\n // ── API ─────────────────────────────────────────────────────────────────────\n const buildApi=useCallback(()=>({\n loadJson(input: string | Record<string, unknown>, options?: LoadJsonOptions) {\n setJsonLoading(true);\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n try {\n let parsed: unknown = input;\n if (typeof input === \"string\") {\n try {\n parsed = JSON.parse(input);\n } catch {\n return;\n }\n }\n const coerced = coerceEmailDocumentInput(parsed);\n if (options?.mode === \"append\") {\n const extra = emailDocumentToEditorRows(coerced ?? parsed);\n if (!extra?.length) return;\n setRows((prev) => [...prev, ...extra]);\n return;\n }\n const norm = normalizeEmailDesignInput(coerced ?? parsed);\n if (!norm) return;\n setRows(norm.rows);\n const ns = norm.settings as any;\n setSettings((s) => ({ ...s, ...ns }));\n const inferPage = (): \"solid\" | \"image\" | \"gradient\" => {\n if (ns?.bgGradient) return \"gradient\";\n if (String(ns?.bgImage ?? \"\").trim()) return \"image\";\n return \"solid\";\n };\n const inferContent = (): \"solid\" | \"image\" | \"gradient\" => {\n if (ns?.contentBgGradient) return \"gradient\";\n if (String(ns?.contentBgImage ?? \"\").trim()) return \"image\";\n return \"solid\";\n };\n setPageBgUiStep(inferPage());\n setContentBgUiStep(inferContent());\n } finally {\n setJsonLoading(false);\n }\n });\n });\n },\n exportJson(cb, pretty) {\n const design = designToEmailDocument(rowsRef.current, settingsRef.current);\n const json = pretty ? JSON.stringify(design, null, 2) : JSON.stringify(design);\n cb(json);\n },\n }),[]);\n\n useImperativeHandle(ref,()=>buildApi(),[buildApi]);\n useEffect(()=>{const api=buildApi();onLoad?.(api);onReady?.(api);},[]);// eslint-disable-line\n\n // ── Row ops ─────────────────────────────────────────────────────────────────\n const handleRowDrop=(targetIdx,e)=>{\n if(e){\n e.preventDefault();\n e.stopPropagation();\n try {\n const data=JSON.parse(e.dataTransfer.getData(\"application/json\")||\"{}\");\n if(data.layoutPresetKey){\n const preset=LAYOUT_PRESETS.find(p=>p.key===data.layoutPresetKey);\n if(preset){\n mutate(prev=>{const newRow=makeLayoutRow(preset);const next=[...prev];next.splice(targetIdx,0,newRow);return next;});\n setDragOver(null);return;\n }\n }\n } catch {}\n }\n const moveId =\n draggingRowIdRef.current ??\n draggingRowId ??\n (() => {\n if (!e) return null;\n try {\n const data = JSON.parse(e.dataTransfer.getData(\"application/json\") || \"{}\");\n return typeof data.moveRowId === \"string\" ? data.moveRowId : null;\n } catch {\n return null;\n }\n })();\n if(moveId){\n mutate(prev=>{\n const fi=prev.findIndex(r=>r.id===moveId);\n if(fi===-1)return prev;\n const next=[...prev];\n const[m]=next.splice(fi,1);\n const insertAt=targetIdx>fi?targetIdx-1:targetIdx;\n next.splice(Math.max(0,Math.min(insertAt,next.length)),0,m);\n return next;\n });\n }\n setDragOver(null);\n setRowDrag(null);\n };\n const addRow =(preset)=>mutate(prev=>[...prev,makeLayoutRow(preset)]);\n const deleteRow =(id)=>{mutate(prev=>prev.filter(r=>r.id!==id));if(selectedRowId===id)setSelectedRowId(null);};\n const reassignNestedBlockIds=(b)=>{const nb={...b,id:uid()};if(isSplitLayoutBlock(nb)&&nb.props?.cells){nb.props={...nb.props,cells:nb.props.cells.map((col)=>col.map(reassignNestedBlockIds))};}return nb;};\n const dupRow =(id)=>mutate(prev=>{const i=prev.findIndex(r=>r.id===id);const copy=JSON.parse(JSON.stringify(prev[i]));copy.id=uid();copy.cells=copy.cells.map((c)=>c.map(reassignNestedBlockIds));const next=[...prev];next.splice(i+1,0,copy);return next;});\n const moveRow =(id,dir)=>mutate(prev=>{const i=prev.findIndex(r=>r.id===id);if((dir<0&&i===0)||(dir>0&&i===prev.length-1))return prev;const next=[...prev];const[r]=next.splice(i,1);next.splice(i+dir,0,r);return next;});\n const updateRow =(upd)=>mutate(prev=>prev.map(r=>r.id===upd.id?upd:r));\n\n // ── Content ops ─────────────────────────────────────────────────────────────\n const splice=(arr,item,idx)=>{const n=[...arr];n.splice(idx===null?n.length:Math.max(0,Math.min(idx,n.length)),0,item);return n;};\n\n const resolveSelectedBlock=useCallback((meta)=>{\n if(!meta)return null;\n const r=rows.find(x=>x.id===meta.rowId);\n if(!r)return null;\n const col=r.cells[meta.cellIdx];\n if(!col)return null;\n const parent=col[meta.contentIdx];\n if(!meta.inner)return parent??null;\n if(!parent||!isSplitLayoutBlock(parent))return null;\n const innerCol=parent.props.cells[meta.inner.cellIdx];\n return innerCol?.[meta.inner.contentIdx]??null;\n },[rows]);\n\n const dropContent=(rowId:any,cellIdx:any,action:any)=>{\n const {insertAt:ia=null}=action;\n const nested=action.nested;\n const toLoc=toColumnLoc(rowId,cellIdx,nested);\n if(action.kind===\"new\"){\n if (\n (action.contentType === \"layout\" || action.contentType === \"nestedRow\") &&\n nestedLayoutDepth(nested) >= MAX_NESTED_LAYOUT_DEPTH\n ) {\n return;\n }\n let nb;\n if(\n action.preset &&\n (action.contentType === \"layout\" || action.contentType === \"nestedRow\")\n ){\n nb=makeNestedRowBlock(action.preset);\n }else{\n nb=makeContentBlock(action.contentType);\n }\n const col=getColumnBlocks(rows,toLoc);\n const prevLen=col.length;\n const insertIndex=ia==null||ia===undefined?prevLen:Math.max(0,Math.min(ia,prevLen));\n mutate(prev=>updateColumnAt(prev,toLoc,c=>splice(c,nb,insertIndex)));\n setSelectedRowId(null);\n setSelContentId(nb.id);\n if(nested){\n setSelMeta({rowId,cellIdx,contentIdx:nested.parentBlockIdx,inner:{cellIdx:nested.innerCellIdx,contentIdx:insertIndex}});\n }else{\n setSelMeta({rowId,cellIdx,contentIdx:insertIndex});\n }\n } else if(action.kind===\"move\"){\n const{fromRow,fromCell,fromIdx,fromNested}=action;\n const fromLoc=toColumnLoc(fromRow,fromCell,fromNested);\n const moved=getColumnBlocks(rows,fromLoc)[fromIdx];\n if(!moved)return;\n mutate(prev=>{\n let movedBlock=null;\n let next=updateColumnAt(prev,fromLoc,c=>{movedBlock=c[fromIdx];return c.filter((_,i)=>i!==fromIdx);});\n if(!movedBlock)return prev;\n let adj=ia;\n if(sameColumnLoc(fromLoc,toLoc)&&(ia!==null&&ia!==undefined))adj=fromIdx<ia?ia-1:ia;\n const lenAfter=getColumnBlocks(next,toLoc).length;\n const insertIndex=(ia===null||ia===undefined)?lenAfter:Math.max(0,Math.min(adj,lenAfter));\n return updateColumnAt(next,toLoc,c=>splice(c,movedBlock,insertIndex));\n });\n if(moved){\n const fromLoc2=toColumnLoc(fromRow,fromCell,fromNested);\n const toLoc2=toColumnLoc(rowId,cellIdx,nested);\n const targetLenBefore=getColumnBlocks(rows,toLoc2).length;\n const sameCol=sameColumnLoc(fromLoc2,toLoc2);\n let adj=ia;\n if(sameCol&&(ia!==null&&ia!==undefined))adj=fromIdx<ia?ia-1:ia;\n const lenAfterRemove=sameCol?Math.max(0,targetLenBefore-1):targetLenBefore;\n const insertIndex=(ia===null||ia===undefined)?lenAfterRemove:Math.max(0,Math.min(adj,lenAfterRemove));\n setSelectedRowId(null);\n setSelContentId(moved.id);\n if(nested){\n setSelMeta({rowId,cellIdx,contentIdx:nested.parentBlockIdx,inner:{cellIdx:nested.innerCellIdx,contentIdx:insertIndex}});\n }else{\n setSelMeta({rowId,cellIdx,contentIdx:insertIndex});\n }\n }\n } else if(action.kind===\"duplicate\"){\n const{fromIdx,fromNested}=action;\n const loc=toColumnLoc(rowId,cellIdx,fromNested);\n const col=getColumnBlocks(rows,loc);\n const source=col[fromIdx];\n if(!source)return;\n const copy=reassignNestedBlockIds(JSON.parse(JSON.stringify(source)));\n mutate(prev=>updateColumnAt(prev,loc,c=>{\n const n=[...c];\n n.splice(fromIdx+1,0,copy);\n return n;\n }));\n setSelectedRowId(null);\n setSelContentId(copy.id);\n if(fromNested){\n setSelMeta({rowId,cellIdx,contentIdx:fromNested.parentBlockIdx,inner:{cellIdx:fromNested.innerCellIdx,contentIdx:fromIdx+1}});\n }else{\n setSelMeta({rowId,cellIdx,contentIdx:fromIdx+1});\n }\n }\n };\n\n const rootContentPreset = LAYOUT_PRESETS.find((p) => p.cols === 1) ?? LAYOUT_PRESETS[0];\n\n /** Append a single-block row (exports as a flat root entry in `blocks[]`). */\n const insertRootContentBlock = (contentType: string) => {\n const { row: newRow, block: nb } = makeRootContentRow(contentType, rootContentPreset);\n const anchorRowId = selContentMeta?.rowId ?? selectedRowId ?? null;\n mutate((prev) => {\n if (anchorRowId) {\n const i = prev.findIndex((r) => r.id === anchorRowId);\n if (i >= 0) {\n const next = [...prev];\n next.splice(i + 1, 0, newRow);\n return next;\n }\n }\n return [...prev, newRow];\n });\n setSelectedRowId(null);\n setSelContentId(nb.id);\n setSelMeta({ rowId: newRow.id, cellIdx: 0, contentIdx: 0 });\n };\n\n /** Palette / canvas drop: content blocks → root `blocks[]`; layout blocks → new row or nested column. */\n const insertBlockFromLibrary = (contentType: string) => {\n const isLayoutType = contentType === \"layout\" || contentType === \"nestedRow\";\n if (selContentMeta?.inner) {\n const { rowId, cellIdx, contentIdx, inner } = selContentMeta;\n dropContent(rowId, cellIdx, {\n kind: \"new\",\n contentType,\n insertAt: null,\n nested: { parentBlockIdx: contentIdx, innerCellIdx: inner.cellIdx },\n });\n return;\n }\n if (isLayoutType) {\n if (\n selContentMeta?.rowId &&\n typeof selContentMeta.cellIdx === \"number\" &&\n selContentMeta.cellIdx >= 0 &&\n typeof selContentMeta.contentIdx === \"number\" &&\n selContentMeta.contentIdx >= 0\n ) {\n const r = rows.find((x) => x.id === selContentMeta.rowId);\n if (r && selContentMeta.cellIdx < r.cells.length) {\n dropContent(selContentMeta.rowId, selContentMeta.cellIdx, {\n kind: \"new\",\n contentType,\n insertAt: null,\n });\n return;\n }\n }\n addRow(rootContentPreset);\n return;\n }\n if (!rows.length) {\n insertRootContentBlock(contentType);\n return;\n }\n insertRootContentBlock(contentType);\n };\n\n /** @param inner null | { parentBlockIdx, cellIdx, contentIdx } — when set, ci is ignored; inner.contentIdx is index in inner column */\n const deleteContent=(rowId:any,cellIdx:any,ci:any,inner:any=null)=>{\n if(!inner){\n mutate(prev=>prev.map(r=>{if(r.id!==rowId)return r;const cells=r.cells.map((c,i)=>i===cellIdx?c.filter((_,j)=>j!==ci):c);return{...r,cells};}));\n }else{\n const loc={type:\"nested\",rowId,outerCellIdx:cellIdx,blockIdx:inner.parentBlockIdx,innerCellIdx:inner.cellIdx};\n mutate(prev=>updateColumnAt(prev,loc,c=>c.filter((_,j)=>j!==inner.contentIdx)));\n }\n setSelContentId(null);setSelMeta(null);\n };\n const moveContent=(rowId:any,cellIdx:any,ci:any,dir:any,inner:any=null)=>{\n if(inner){\n const loc={type:\"nested\",rowId,outerCellIdx:cellIdx,blockIdx:inner.parentBlockIdx,innerCellIdx:inner.cellIdx};\n mutate(prev=>updateColumnAt(prev,loc,c=>{\n const ibc=inner.contentIdx;\n const ni=ibc+dir;\n if(ni<0||ni>=c.length)return c;\n const n=[...c];\n [n[ibc],n[ni]]=[n[ni],n[ibc]];\n return n;\n }));\n return;\n }\n mutate(prev=>prev.map(r=>{if(r.id!==rowId)return r;const cells=r.cells.map((c,i)=>{if(i!==cellIdx)return c;const ni=ci+dir;if(ni<0||ni>=c.length)return c;const n=[...c];[n[ci],n[ni]]=[n[ni],n[ci]];return n;});return{...r,cells};}));\n };\n const updateContent=(rowId:any,cellIdx:any,ci:any,upd:any,inner:any=null)=>{\n if(!inner){\n mutate(prev=>prev.map(r=>{if(r.id!==rowId)return r;const cells=r.cells.map((c,i)=>i===cellIdx?c.map((b,j)=>j===ci?upd:b):c);return{...r,cells};}));\n return;\n }\n const loc={type:\"nested\",rowId,outerCellIdx:cellIdx,blockIdx:ci,innerCellIdx:inner.cellIdx};\n mutate(prev=>updateColumnAt(prev,loc,c=>c.map((b,j)=>j===inner.contentIdx?upd:b)));\n };\n const selectContent=(contentId:any,rowId:any,cellIdx:any,parentBlockIdx:any,inner:any=null)=>{\n setSelContentId(contentId);\n setSelMeta(inner?{rowId,cellIdx,contentIdx:parentBlockIdx,inner}:{rowId,cellIdx,contentIdx:parentBlockIdx});\n /** Empty-column affordance uses `contentIdx: -1` and `contentId: null`; column handler also sets row — do not clear row. */\n const emptyColumnAffordance =\n inner == null && contentId == null && parentBlockIdx === -1;\n if (!emptyColumnAffordance) setSelectedRowId(null);\n };\n\n const deleteSelected=()=>{if(selContentMeta){const{rowId,cellIdx,contentIdx,inner}=selContentMeta;if(inner)deleteContent(rowId,cellIdx,0,{parentBlockIdx:contentIdx,cellIdx:inner.cellIdx,contentIdx:inner.contentIdx});else deleteContent(rowId,cellIdx,contentIdx);}};\n const duplicateSelected=()=>{if(selContentMeta){const{rowId,cellIdx,contentIdx,inner}=selContentMeta;if(inner)dropContent(rowId,cellIdx,{kind:\"duplicate\",fromIdx:inner.contentIdx,fromNested:{parentBlockIdx:contentIdx,innerCellIdx:inner.cellIdx}});else dropContent(rowId,cellIdx,{kind:\"duplicate\",fromIdx:contentIdx});}};\n\n // ── Context menu ────────────────────────────────────────────────────────────\n /** inner: { parentBlockIdx, cellIdx, contentIdx } for block inside nested row */\n const handleContextMenu=(e:any,rowId:any,cellIdx:any,ci:any,inner:any=null)=>{\n setCtxMenu({x:e.clientX,y:e.clientY,items:[\n {icon:\"↑\",label:\"Move Up\", action:()=>moveContent(rowId,cellIdx,ci,-1,inner)},\n {icon:\"↓\",label:\"Move Down\",action:()=>moveContent(rowId,cellIdx,ci, 1,inner)},\n {sep:true},\n {icon:\"⧉\",label:\"Duplicate\",action:()=>dropContent(rowId,cellIdx,inner?{kind:\"duplicate\",fromIdx:inner.contentIdx,fromNested:{parentBlockIdx:inner.parentBlockIdx,innerCellIdx:inner.cellIdx}}:{kind:\"duplicate\",fromIdx:ci})},\n {sep:true},\n {icon:\"✕\",label:\"Delete\",action:()=>inner?deleteContent(rowId,cellIdx,0,inner):deleteContent(rowId,cellIdx,ci),danger:true},\n ]});\n };\n\n const handleLayoutContextMenu=(e,rowId)=>{\n e.preventDefault();\n e.stopPropagation();\n const ri=rows.findIndex(r=>r.id===rowId);\n setSelectedRowId(rowId);\n setSelContentId(null);\n setSelMeta(null);\n setCtxMenu({x:e.clientX,y:e.clientY,items:[\n {icon:\"↑\",label:\"Move row up\",disabled:ri<=0,action:()=>{if(ri>0)moveRow(rowId,-1);}},\n {icon:\"↓\",label:\"Move row down\",disabled:ri<0||ri>=rows.length-1,action:()=>{if(ri>=0&&ri<rows.length-1)moveRow(rowId,1);}},\n {sep:true},\n {icon:\"⧉\",label:\"Duplicate row\",action:()=>dupRow(rowId)},\n {sep:true},\n {icon:\"✕\",label:\"Delete row\",action:()=>deleteRow(rowId),danger:true},\n ]});\n };\n\n const selectedRow=rows.find(r=>r.id===selectedRowId);\n const selectedCB=resolveSelectedBlock(selContentMeta);\n const totalBlocks=countBlocksInDesign(rows);\n\n const filteredBlockTypes = CONTENT_BLOCK_TYPES.filter((bt) => {\n if (opt.tools?.[bt.type]?.enabled === false) return false;\n return true;\n });\n\n const onRightRailResizePointerDown = useCallback((e: ReactPointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n if (e.pointerType === \"mouse\" && e.button !== 0) return;\n const startX = e.clientX;\n const startW = rightRailWidth;\n const onMove = (ev: PointerEvent) => {\n const delta = startX - ev.clientX;\n setRightRailWidth(() =>\n Math.min(RIGHT_RAIL_MAX_W, Math.max(RIGHT_RAIL_MIN_W, startW + delta)),\n );\n };\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n window.removeEventListener(\"pointercancel\", onUp);\n document.body.style.removeProperty(\"cursor\");\n document.body.style.removeProperty(\"user-select\");\n };\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n window.addEventListener(\"pointercancel\", onUp);\n }, [rightRailWidth]);\n\n const paletteGroupLabelOverrides = opt.blockLibrary?.paletteGroupLabels;\n const blockPaletteSections = BLOCK_PALETTE_GROUPS.map(({ key, labelKey }) => {\n const blocks = filteredBlockTypes\n .filter((bt) => bt.paletteGroup === key)\n .slice()\n .sort((a, b) => a.paletteOrder - b.paletteOrder);\n if (blocks.length === 0) return null;\n return {\n groupKey: key,\n title: paletteGroupLabelOverrides?.[key] ?? L(labelKey),\n blocks,\n };\n }).filter(Boolean) as { groupKey: BlockPaletteGroupKey; title: string; blocks: typeof filteredBlockTypes }[];\n\n const IS: CSSProperties = {\n width: \"100%\",\n padding: \"6px 8px\",\n border: `1px solid ${C.border}`,\n borderRadius: 5,\n background: C.inputBg,\n color: C.text,\n fontSize: 13,\n boxSizing: \"border-box\",\n outline: \"none\",\n };\n const CI: CSSProperties = {\n padding: \"2px 4px\",\n height: 28,\n cursor: \"pointer\",\n border: `1px solid ${C.border}`,\n borderRadius: 5,\n background: C.inputBg,\n };\n\n const LEFT_TEMPLATE_W = 292;\n const eid = (suffix?: string) => (suffix ? `${editorId}-${suffix}` : editorId);\n\n const sectionHeadingStyle: CSSProperties = {\n fontSize: 10,\n color: C.muted,\n fontWeight: 700,\n textTransform: \"uppercase\",\n letterSpacing: \".08em\",\n marginBottom: 8,\n };\n\n /** Right-rail cards: same look for Settings sections (and scroll padding). */\n const RAIL_BODY_PAD: CSSProperties = { padding: \"12px 12px 20px\" };\n const railSectionCard: CSSProperties = {\n marginBottom: 8,\n border: `1px solid ${C.border}`,\n borderRadius: 10,\n background: C.surface,\n overflow: \"hidden\",\n };\n const railSectionSummary: CSSProperties = {\n cursor: \"pointer\",\n listStyle: \"none\",\n fontSize: 10,\n fontWeight: 800,\n color: C.text,\n textTransform: \"uppercase\",\n letterSpacing: \".08em\",\n padding: \"9px 11px\",\n background: C.toolbarBg,\n borderBottom: `1px solid ${C.border}`,\n userSelect: \"none\",\n };\n const railSectionBody: CSSProperties = {\n padding: \"10px 11px 12px\",\n };\n\n return (\n <div id={eid()}\n style={{display:\"flex\",flexDirection:\"column\",height:minHeight,maxHeight:minHeight,background:C.bg,color:C.text,fontFamily:\"'Inter',system-ui,sans-serif\",overflow:\"hidden\",...style}}>\n <style>{`\n *{box-sizing:border-box;}\n input[type=range]{accent-color:${C.accent};}\n input[type=checkbox]{accent-color:${C.accent};}\n details.rail-section > summary::-webkit-details-marker{display:none;}\n details.rail-section > summary{list-style:none;}\n ::-webkit-scrollbar{width:5px;height:5px;}\n ::-webkit-scrollbar-track{background:transparent;}\n ::-webkit-scrollbar-thumb{background:${C.border};border-radius:3px;}\n ::-webkit-scrollbar-thumb:hover{background:${C.muted};}\n @keyframes email-editor-json-spin{to{transform:rotate(360deg);}}\n `}</style>\n\n <div id={eid(\"workspace\")} style={{\n display:\"flex\",flex:1,overflow:\"hidden\",minHeight:0,position:\"relative\",\n alignItems:\"stretch\",gap:0,\n padding:12,\n maxHeight: \"calc(100% - 24px)\",\n width: \"100%\",\n }}>\n\n {/* ── LEFT: templates drawer ─────────────────────────────────────────── */}\n {!hideTemplates && templatesOpen && (\n <aside\n id={eid(\"templates-panel\")}\n style={{\n flexShrink: 0,\n width: LEFT_TEMPLATE_W,\n alignSelf: \"stretch\",\n background: C.sidebar,\n borderRight: `1px solid ${C.border}`,\n borderRadius: 12,\n display: \"flex\",\n flexDirection: \"column\",\n zIndex: 60, \n maxHeight: \"calc(100% - 24px)\",\n overflow: \"auto\",\n boxShadow: \"4px 0 24px rgba(0,0,0,0.06)\",\n }}>\n <div\n id={eid(\"templates-panel-header\")}\n style={{\n padding: \"10px 12px\",\n borderBottom: `1px solid ${C.border}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n flexShrink: 0,\n background: C.sidebar,\n }}>\n <span style={{ fontSize: 11, fontWeight: 700, color: C.text }}>{L(\"templates\")}</span>\n <button\n type=\"button\"\n id={eid(\"templates-panel-close\")}\n title={L(\"closePanel\")}\n onClick={() => setTemplatesOpen(false)}\n style={{\n background: C.surface,\n border: `1px solid ${C.border}`,\n borderRadius: 6,\n color: C.text,\n cursor: \"pointer\",\n fontSize: 16,\n lineHeight: 1,\n padding: \"2px 8px\",\n }}>\n ×\n </button>\n </div>\n <div id={eid(\"templates-panel-body\")} style={{ flex: 1, overflowY: \"auto\", padding: 10 }}>\n {templates.map((tpl, idx) => (\n <div\n key={idx}\n id={eid(`template-${idx}`)}\n onClick={() => {\n if (rows.length > 0) {\n setConfirm({\n msg: \"Loading a template will replace your current design. Continue?\",\n onConfirm: () => {\n buildApi().loadJson(tpl.design as Record<string, unknown>);\n setTemplatesOpen(false);\n },\n });\n } else {\n buildApi().loadJson(tpl.design as Record<string, unknown>);\n setTemplatesOpen(false);\n }\n }}\n style={{\n background: C.surface,\n border: `1px solid ${C.border}`,\n borderRadius: 10,\n padding: 10,\n cursor: \"pointer\",\n transition: \"all .2s\",\n marginBottom: 10,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = C.accent;\n e.currentTarget.style.transform = \"translateY(-1px)\";\n e.currentTarget.style.boxShadow = \"0 6px 16px rgba(0,0,0,0.08)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = C.border;\n e.currentTarget.style.transform = \"none\";\n e.currentTarget.style.boxShadow = \"none\";\n }}>\n {tpl.thumbnail ? (\n <img\n src={tpl.thumbnail}\n alt={tpl.name}\n style={{\n width: \"100%\",\n height: 100,\n objectFit: \"cover\",\n borderRadius: 6,\n background: C.canvas,\n marginBottom: 8,\n border: `1px solid ${C.border}`,\n }}\n />\n ) : (\n <div\n style={{\n width: \"100%\",\n height: 64,\n background: C.canvas,\n borderRadius: 6,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 28,\n marginBottom: 8,\n border: `1px solid ${C.border}`,\n }}>\n 📄\n </div>\n )}\n <div style={{ fontSize: 11, fontWeight: 700, color: C.text }}>{tpl.name}</div>\n </div>\n ))}\n {templates.length === 0 && (\n <div style={{ color: C.muted, fontSize: 11, padding: 20, textAlign: \"center\" }}>No templates available.</div>\n )}\n </div>\n </aside>\n )}\n\n {/* ── CENTER: content toolbar + canvas ───────────────────────────────── */}\n <div\n id={eid(\"content-column\")}\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n minWidth: 0,\n padding: 12,\n paddingBottom: 0,\n paddingTop: 0,\n gap: 10,\n maxHeight: \"calc(100% - 24px)\",\n overflow: \"auto\",\n }}>\n <div\n id={eid(\"content-toolbar\")}\n style={{\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n gap: 0,\n padding: \"7px 12px\",\n background: C.toolbarBg,\n border: `1px solid ${C.border}`,\n borderRadius: 12,\n boxShadow: \"0 1px 3px rgba(0,0,0,0.06)\",\n }}>\n {/* Left: templates + canvas zoom */}\n <div\n id={eid(\"toolbar-left\")}\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-start\",\n gap: 8,\n minWidth: 0,\n }}\n >\n {!hideTemplates && (\n <TBtn\n onClick={() => setTemplatesOpen((o) => !o)}\n title={L(\"templates\")}\n accent={C.accent}\n muted={C.muted}\n border={C.border}\n text={C.text}\n style={{\n padding: \"5px 12px\",\n fontWeight: 700,\n ...(templatesOpen\n ? { outline: `2px solid ${C.accent}`, outlineOffset: 2, borderRadius: 8 }\n : {}),\n }}\n >\n {L(\"templates\")}\n </TBtn>\n )}\n <div id={eid(\"toolbar-zoom\")} style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <TBtn\n onClick={() => setZoom((z) => Math.max(50, z - 10))}\n title={L(\"zoomOut\")}\n accent={C.accent}\n muted={C.muted}\n border={C.border}\n text={C.text}\n style={{ padding: \"4px 8px\" }}\n >\n −\n </TBtn>\n <span\n style={{\n fontSize: 11,\n color: C.muted,\n minWidth: 34,\n textAlign: \"center\",\n userSelect: \"none\",\n }}\n >\n {zoom}%\n </span>\n <TBtn\n onClick={() => setZoom((z) => Math.min(150, z + 10))}\n title={L(\"zoomIn\")}\n accent={C.accent}\n muted={C.muted}\n border={C.border}\n text={C.text}\n style={{ padding: \"4px 8px\" }}\n >\n +\n </TBtn>\n </div>\n </div>\n\n {/* Center: preview (true visual center) */}\n <div\n id={eid(\"toolbar-center\")}\n style={{\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <TBtn\n onClick={() => {\n setPreviewDevice(\"desktop\");\n setShowPreview(true);\n }}\n title=\"Preview\"\n accent={C.accent}\n muted={C.muted}\n border={C.border}\n text={C.text}\n style={{ padding: \"5px 14px\", fontWeight: 700, display: \"flex\", alignItems: \"center\", gap: 6 }}\n >\n <svg width=\"14\" height=\"10\" viewBox=\"0 0 14 10\" fill=\"none\" style={{ flexShrink: 0 }}>\n <rect x=\".5\" y=\".5\" width=\"13\" height=\"9\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M4 10h6M7 9v1\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n </TBtn>\n </div>\n\n {/* Right: autosave + history */}\n <div\n id={eid(\"toolbar-right\")}\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n gap: 8,\n minWidth: 0,\n }}\n >\n {autoSaveMsg ? (\n <>\n <span style={{ fontSize: 10, color: C.success, fontWeight: 700, whiteSpace: \"nowrap\" }}>\n ✓ {autoSaveMsg}\n </span>\n <span style={{ width: 1, height: 22, background: C.border, flexShrink: 0 }} />\n </>\n ) : null}\n <div id={eid(\"toolbar-history\")} style={{ display: \"flex\", alignItems: \"center\", gap: 4, flexShrink: 0 }}>\n <TBtn\n onClick={undo}\n title={`${L(\"undo\")} (Ctrl+Z)`}\n disabled={!history.length}\n accent={C.accent}\n muted={C.muted}\n border={C.border}\n text={C.text}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 7v6h6\" />\n <path d=\"M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13\" />\n </svg>\n </TBtn>\n <TBtn\n onClick={redo}\n title={`${L(\"redo\")} (Ctrl+Y)`}\n disabled={!future.length}\n accent={C.accent}\n muted={C.muted}\n border={C.border}\n text={C.text}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 7v6h-6\" />\n <path d=\"M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3l3 2.7\" />\n </svg>\n </TBtn>\n </div>\n </div>\n </div>\n\n <div\n id={eid(\"canvas\")}\n style={{\n flex: 1,\n overflowY: \"auto\",\n overflowX: \"hidden\",\n background: C.canvas,\n padding: 12,\n minHeight: 0,\n borderRadius: 12,\n border: `1px solid ${C.border}`,\n }}\n onClick={() => {\n setSelectedRowId(null);\n setSelContentId(null);\n setSelMeta(null);\n setCtxMenu(null);\n }}\n onDragOver={(e) => {\n e.preventDefault();\n }}\n onDrop={(e) => {\n e.preventDefault();\n try {\n const data = JSON.parse(e.dataTransfer.getData(\"application/json\") || \"{}\");\n if (data.moveRowId) return;\n if (data.layoutPresetKey) {\n const preset = LAYOUT_PRESETS.find((p) => p.key === data.layoutPresetKey);\n if (preset) mutate((prev) => [...prev, makeLayoutRow(preset)]);\n } else if (data.contentType && typeof data.contentType === \"string\") {\n insertBlockFromLibrary(data.contentType);\n }\n } catch {\n /* ignore */\n }\n }}>\n <div\n id={eid(\"canvas-scale\")}\n style={{\n transform: `scale(${zoom / 100})`,\n transformOrigin: \"top center\",\n transition: \"transform .2s\",\n paddingBottom: zoom < 100 ? `${(1 - zoom / 100) * 200}px` : 0,\n }}>\n <div\n id={eid(\"canvas-document\")}\n style={(() => {\n const img =\n typeof (settings as { contentBgImage?: string }).contentBgImage === \"string\"\n ? (settings as { contentBgImage?: string }).contentBgImage!.trim()\n : \"\";\n const base: CSSProperties = {\n maxWidth: settings.contentWidth,\n margin: \"0 auto\",\n borderRadius: settings.borderRadius,\n padding: settings.padding,\n minHeight: 420,\n border: `1px solid ${C.border}`,\n };\n if (img) {\n const st = settings as {\n contentBgSize?: string;\n contentBgRepeat?: string;\n };\n base.backgroundColor = settings.contentBg;\n base.backgroundImage = `url(${JSON.stringify(img)})`;\n base.backgroundSize = (st.contentBgSize || \"cover\").trim() || \"cover\";\n base.backgroundPosition = \"center\";\n base.backgroundRepeat = (st.contentBgRepeat || \"no-repeat\").trim() || \"no-repeat\";\n } else {\n base.background = settings.contentBg;\n }\n return base;\n })()}\n onDragOver={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onDrop={(e) => {\n e.preventDefault();\n e.stopPropagation();\n try {\n const data = JSON.parse(e.dataTransfer.getData(\"application/json\") || \"{}\");\n if (data.moveRowId) return;\n if (data.contentType && typeof data.contentType === \"string\") {\n insertBlockFromLibrary(data.contentType);\n }\n } catch {\n /* ignore */\n }\n }}>\n {rows.length === 0 && (\n <div id={eid(\"canvas-empty\")} style={{ padding: \"56px 20px\", textAlign: \"center\", color: C.muted, border: `2px dashed ${C.border}`, borderRadius: 7 }}>\n <div style={{ fontSize: 30, marginBottom: 10 }}>✉</div>\n <div style={{ fontWeight: 700, marginBottom: 6, color: C.text }}>{L(\"addRow\")}</div>\n <div style={{ fontSize: 12 }}>{L(\"canvasEmptyHint\")}</div>\n </div>\n )}\n\n {rows.map((row, ri) => (\n <Fragment key={row.id}>\n <CanvasRow\n editorId={editorId}\n row={row}\n ri={ri}\n selectedRowId={selectedRowId}\n selContentMeta={selContentMeta}\n dragOver={dragOver}\n draggingRowId={draggingRowId}\n C={C}\n setDragOver={setDragOver}\n handleRowDrop={handleRowDrop}\n setRowDrag={setRowDrag}\n setSelectedRowId={setSelectedRowId}\n setSelContentId={setSelContentId}\n setSelMeta={setSelMeta}\n selectContent={selectContent}\n dropContent={dropContent}\n deleteContent={deleteContent}\n handleContextMenu={handleContextMenu}\n handleLayoutContextMenu={handleLayoutContextMenu}\n selContentId={selContentId}\n />\n </Fragment>\n ))}\n\n {/* Bottom drop zone */}\n <div\n id={eid(\"canvas-row-drop-end\")}\n onDragOver={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setDragOver(rows.length);\n }}\n onDragLeave={() => setDragOver(null)}\n onDrop={(e) => handleRowDrop(rows.length, e)}\n style={{\n height: dragOver === rows.length ? 28 : 10,\n background: dragOver === rows.length ? `${C.accent}25` : \"transparent\",\n border:\n dragOver === rows.length\n ? `2px dashed ${C.accent}`\n : \"2px solid transparent\",\n borderRadius: 4,\n transition: \"all .12s\",\n margin: \"2px 0\",\n boxSizing: \"border-box\",\n }}\n />\n </div>\n </div>\n </div>\n </div>\n\n {/* ── Right rail resize + sidebar ── */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n flexShrink: 0,\n alignItems: \"stretch\",\n alignSelf: \"stretch\",\n maxHeight: \"calc(100% - 24px)\",\n minHeight: 0,\n }}\n >\n <div\n id={eid(\"sidebar-resize-handle\")}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={L(\"resizeSidebar\")}\n title={L(\"resizeSidebar\")}\n onPointerDown={onRightRailResizePointerDown}\n style={{\n width: 6,\n flexShrink: 0,\n cursor: \"col-resize\",\n touchAction: \"none\",\n alignSelf: \"stretch\",\n borderRadius: \"6px 0 0 6px\",\n background: `${C.border}33`,\n borderLeft: `1px solid ${C.border}`,\n borderTop: `1px solid ${C.border}`,\n borderBottom: `1px solid ${C.border}`,\n marginRight: -1,\n zIndex: 56,\n }}\n onPointerEnter={(ev) => {\n ev.currentTarget.style.background = `${C.accent}40`;\n }}\n onPointerLeave={(ev) => {\n ev.currentTarget.style.background = `${C.border}33`;\n }}\n />\n\n {/* ── UNIFIED SIDEBAR (Right Rail) ── */}\n <div id={eid(\"sidebar\")} style={{\n position:\"relative\",flexShrink:0,width:rightRailWidth,alignSelf:\"stretch\",\n minHeight:0,minWidth:RIGHT_RAIL_MIN_W,\n background:C.sidebar,border:`1px solid ${C.border}`,\n borderRadius: 12,maxHeight: \"calc(100% - 24px)\",overflow: \"auto\",\n display:\"flex\",flexDirection:\"column\",zIndex:55,\n }}>\n {selectedCB || selectedRow ? (\n /* Properties / Inspector View */\n <div id={eid(\"sidebar-properties\")} style={{display:\"flex\",flexDirection:\"column\",flex:1,minHeight:0,overflow:\"hidden\"}}>\n {/* Inspector Header */}\n <div id={eid(\"sidebar-inspector-header\")} style={{padding:\"9px 11px\",borderBottom:`1px solid ${C.border}`,flexShrink:0,background:C.toolbarBg,zIndex:5,display:\"flex\",alignItems:\"center\",gap:8}}>\n <button\n type=\"button\"\n onClick={()=>{setSelContentId(null);setSelMeta(null);setSelectedRowId(null);}}\n style={{background:C.surface,border:`1px solid ${C.border}`,borderRadius:8,color:C.text,cursor:\"pointer\",fontSize:10,padding:\"6px 10px\",fontWeight:700,display:\"flex\",alignItems:\"center\",gap:4,textTransform:\"uppercase\",letterSpacing:\".05em\"}}>\n <span>← Library</span>\n </button>\n <div style={{flex:1,textAlign:\"right\",fontSize:10,fontWeight:800,color:C.text,textTransform:\"uppercase\",letterSpacing:\".08em\",lineHeight:1.3}}>\n {selectedCB\n ? (selectedCB.type === \"layout\" && isSplitLayoutBlock(selectedCB)\n ? \"Layout · Customize\"\n : \"Block inspector\")\n : \"Row inspector\"}\n </div>\n </div>\n\n <div id={eid(\"sidebar-properties-content\")} style={{flex:1,minHeight:0,overflowY:\"auto\",overflowX:\"hidden\",...RAIL_BODY_PAD}}>\n {selectedCB && selContentMeta ? (\n <ContentBlockEditor\n block={selectedCB}\n onChange={upd=>updateContent(selContentMeta.rowId,selContentMeta.cellIdx,selContentMeta.contentIdx,upd,selContentMeta.inner||null)}\n onClose={()=>{setSelContentId(null);setSelMeta(null);setSelectedRowId(null);}}\n onUpload={onUpload}\n C={C}/>\n ) : (\n <LayoutRowEditor \n row={selectedRow} \n onChange={updateRow} \n onClose={()=>setSelectedRowId(null)} \n onUpload={onUpload} \n initialCol={selContentMeta?.rowId === selectedRowId ? selContentMeta.cellIdx : null}\n rowIndex={rows.findIndex((r) => r.id === selectedRowId)}\n rowCount={rows.length}\n onMoveUp={() => selectedRow && moveRow(selectedRow.id, -1)}\n onMoveDown={() => selectedRow && moveRow(selectedRow.id, 1)}\n C={C}\n />\n )}\n </div>\n </div>\n ) : (\n /* Main Tabs View (Library) */\n <>\n <div id={eid(\"sidebar-tabs\")} style={{display:\"flex\",gap:6,padding:\"8px 10px 0\",borderBottom:`1px solid ${C.border}`,flexShrink:0,position:\"sticky\",top:0,background:C.sidebar,zIndex:10}}>\n {([\"blocks\",\"settings\"] as const).map((tab) => (\n <button key={tab} id={eid(`tab-${tab}`)} type=\"button\" onClick={() => setActiveTab(tab)}\n style={{\n flex:1,\n padding:\"9px 8px 10px\",\n background:activeTab===tab?C.surface:\"transparent\",\n border:`1px solid ${activeTab===tab?C.border:\"transparent\"}`,\n borderBottom:activeTab===tab?`1px solid ${C.surface}`:`1px solid transparent`,\n marginBottom:-1,\n borderRadius:\"10px 10px 0 0\",\n color:activeTab===tab?C.accent:C.muted,\n cursor:\"pointer\",\n fontSize:10,\n fontWeight:800,\n textTransform:\"uppercase\",\n letterSpacing:\".06em\",\n }}>\n {L(tab)}\n </button>\n ))}\n </div>\n\n <div id={eid(\"sidebar-body\")} style={{flex:1,minHeight:0,overflowY:\"auto\",overflowX:\"hidden\",...RAIL_BODY_PAD}}>\n {activeTab===\"blocks\"&&<>\n {opt.blockLibrary?.groupHeadings?.blocks ? (\n <div id={eid(\"blocks-section-heading\")} style={{...sectionHeadingStyle,marginTop:0}}>\n {opt.blockLibrary.groupHeadings.blocks}\n </div>\n ) : null}\n {blockPaletteSections.map(({ groupKey, title, blocks }, gi) => (\n <div key={groupKey} id={eid(`blocks-group-${groupKey}`)}>\n <div\n id={eid(`blocks-group-heading-${groupKey}`)}\n style={{\n ...sectionHeadingStyle,\n marginTop: gi === 0 ? (opt.blockLibrary?.groupHeadings?.blocks ? 10 : 0) : 14,\n marginBottom: 8,\n }}>\n {title}\n </div>\n <div id={eid(`blocks-list-${groupKey}`)} style={{ display: \"flex\", flexDirection: \"column\", gap: 6, marginBottom: 4 }}>\n {blocks.map((bt) => (\n <div\n key={bt.type}\n id={eid(`block-palette-${bt.type}`)}\n draggable\n onDragStart={(e) => {\n e.dataTransfer.setData(\"application/json\", JSON.stringify({ contentType: bt.type }));\n }}\n onClick={() => insertBlockFromLibrary(bt.type)}\n title={\n selContentMeta?.inner\n ? \"Click to add inside the selected nested column\"\n : selContentMeta?.rowId\n ? \"Click to add in the selected column\"\n : selectedRowId\n ? \"Click to add to column 1 of the selected row\"\n : \"Click to add to the first row, first column\"\n }\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: 10,\n background: C.surface,\n border: `1px solid ${C.border}`,\n borderLeft: `3px solid ${C.text}`,\n borderRadius: 8,\n padding: \"8px 10px\",\n cursor: \"grab\",\n userSelect: \"none\",\n transition: \"background .15s, border-color .15s\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = C.canvas;\n e.currentTarget.style.borderColor = C.muted;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = C.surface;\n e.currentTarget.style.borderColor = C.border;\n }}>\n <div style={{ fontSize: 16, width: 28, textAlign: \"center\", flexShrink: 0, color: C.text }}>{bt.icon}</div>\n <div style={{ flex: 1, fontSize: 12, color: C.text, fontWeight: 600 }}>{bt.label}</div>\n </div>\n ))}\n </div>\n </div>\n ))}\n {filteredBlockTypes.length === 0 && (\n <div style={{ color: C.muted, fontSize: 12, padding: 12, textAlign: \"center\" }}>No blocks available</div>\n )}\n </>}\n\n {/* Settings */}\n {activeTab===\"settings\"&&<>\n <div\n id={eid(\"settings-heading\")}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n marginBottom: 10,\n padding: \"9px 11px\",\n background: C.toolbarBg,\n border: `1px solid ${C.border}`,\n borderRadius: 10,\n }}\n >\n <span style={{ fontSize: 10, fontWeight: 800, color: C.text, textTransform: \"uppercase\", letterSpacing: \".08em\" }}>{L(\"emailContentSettings\")}</span>\n <button\n type=\"button\"\n onClick={() => {\n setPageBgUiStep(null);\n setContentBgUiStep(null);\n setSettings({\n bgColor: \"#f1f5f9\",\n bgImage: \"\",\n bgSize: \"cover\",\n bgRepeat: \"no-repeat\",\n bgPosition: \"center\",\n bgGradient: null,\n contentBg: \"#ffffff\",\n contentBgImage: \"\",\n contentBgSize: \"cover\",\n contentBgRepeat: \"no-repeat\",\n contentBgPosition: \"center\",\n contentBgGradient: null,\n contentWidth: 600,\n padding: 24,\n borderRadius: 8,\n fontFamily: \"Arial, sans-serif\",\n } as any);\n }}\n style={{\n background: C.surface,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n padding: \"5px 10px\",\n cursor: \"pointer\",\n fontSize: 10,\n fontWeight: 700,\n color: C.muted,\n textTransform: \"uppercase\",\n letterSpacing: \".05em\",\n }}\n >\n Reset\n </button>\n </div>\n\n <details open className=\"rail-section\" style={railSectionCard}>\n <summary style={railSectionSummary}>Typography</summary>\n <div style={railSectionBody}>\n <PR label=\"Default Font Family\" C={C}>\n <select\n style={IS}\n value={(settings as any).fontFamily || \"Arial, sans-serif\"}\n onChange={(e) => setSettings((s) => ({ ...s, fontFamily: e.target.value }))}\n >\n {[\"Arial, sans-serif\", \"Georgia, serif\", \"Verdana, sans-serif\", \"'Inter', sans-serif\", \"'Courier New', monospace\"].map((f) => (\n <option key={f} value={f}>\n {f.replace(/'/g, \"\").split(\",\")[0]}\n </option>\n ))}\n </select>\n </PR>\n </div>\n </details>\n\n <details open className=\"rail-section\" style={railSectionCard}>\n <summary style={railSectionSummary}>Layout</summary>\n <div style={railSectionBody}>\n <NumRangePx label={L(\"width\")} value={(settings as any).contentWidth ?? 600} onChange={(n)=>setSettings((s)=>({...s,contentWidth:n}))} min={320} max={1200} step={10} C={C}/>\n <NumRangePx label={L(\"padding\")} value={(settings as any).padding ?? 24} onChange={(n)=>setSettings((s)=>({...s,padding:n}))} min={0} max={120} step={1} C={C}/>\n <NumRangePx label={L(\"radius\")} value={(settings as any).borderRadius ?? 8} onChange={(n)=>setSettings((s)=>({...s,borderRadius:n}))} min={0} max={80} step={1} C={C}/>\n </div>\n </details>\n\n <details open className=\"rail-section\" style={railSectionCard}>\n <summary style={railSectionSummary}>Background</summary>\n <div style={railSectionBody}>\n <div style={{fontSize:10,color:C.muted,fontWeight:800,textTransform:\"uppercase\",letterSpacing:\".06em\",marginBottom:6}}>Page background</div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, marginBottom: 8 }}>\n <label style={{ display: \"flex\", alignItems: \"center\", gap: 8, cursor: \"pointer\", userSelect: \"none\" }}>\n <input\n type=\"checkbox\"\n checked={pageBgIsOff}\n onChange={(e) => {\n const off = e.target.checked;\n if (off) {\n const cur = String((settings as any).bgColor ?? \"\").trim();\n if (cur) pageBgLastSolidRef.current = cur;\n setPageBgUiStep(null);\n setSettings((s) => ({ ...s, bgColor: \"\", bgImage: \"\", bgGradient: null }));\n } else {\n setPageBgUiStep(\"solid\");\n setSettings((s) => ({\n ...s,\n bgColor: pageBgLastSolidRef.current || \"#f1f5f9\",\n }));\n }\n }}\n style={{ width: 15, height: 15, accentColor: C.accent, cursor: \"pointer\" }}\n />\n <span style={{ color: C.muted, fontSize: 12 }}>No page background</span>\n </label>\n </div>\n <BgModeButtons\n value={pageBgIsOff ? null : pageBgUiStep}\n onChange={applyPageBgMode}\n C={C}\n />\n {pageBgUiStep === null ? (\n <div style={{ fontSize: 11, color: C.muted, marginBottom: 12, lineHeight: 1.45 }}>\n Choose Color, Gradient, or Image — then the matching settings appear below.\n </div>\n ) : null}\n\n {pageBgUiStep === \"solid\" ? (\n <ColorField\n label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><ColorIcon size={13} strokeWidth={2.25} aria-hidden />bg color</span>}\n value={(settings as any).bgColor}\n onChange={(v)=>{\n pageBgLastSolidRef.current = v;\n setSettings((s)=>({...s,bgColor:v}));\n }}\n placeholder=\"#f1f5f9\"\n C={C}\n />\n ) : null}\n {pageBgUiStep === \"image\" ? (\n <>\n <ImageUrlUploadField\n label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><ImageIcon size={13} strokeWidth={2.25} aria-hidden />bg image</span>}\n value={String((settings as any).bgImage || \"\")}\n onChange={(v)=>setSettings((s)=>({...s,bgImage:v}))}\n onUpload={onUpload}\n accept=\"image/*\"\n buttonLabel=\"upload\"\n inputId={eid(\"settings-page-bg-image-file\")}\n C={C}\n />\n <div style={{ display: \"flex\", gap: 8, marginBottom: 12 }}>\n <div style={{ flex: 1 }}>\n <PR label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><Scaling size={13} strokeWidth={2.25} aria-hidden />{L(\"objectFit\")}</span>} C={C}>\n <select style={IS} value={(settings as any).bgSize || \"cover\"} onChange={(e) => setSettings((s) => ({ ...s, bgSize: e.target.value }))}>\n <option value=\"auto\">Auto</option>\n <option value=\"cover\">Cover</option>\n <option value=\"contain\">Contain</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><RepeatIcon size={13} strokeWidth={2.25} aria-hidden />repeat</span>} C={C}>\n <select style={IS} value={(settings as any).bgRepeat || \"no-repeat\"} onChange={(e) => setSettings((s) => ({ ...s, bgRepeat: e.target.value }))}>\n <option value=\"no-repeat\">No repeat</option>\n <option value=\"repeat\">Repeat</option>\n <option value=\"repeat-x\">Repeat X</option>\n <option value=\"repeat-y\">Repeat Y</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><Crosshair size={13} strokeWidth={2.25} aria-hidden />{L(\"objectPosition\")}</span>} C={C}>\n <select style={IS} value={(settings as any).bgPosition || \"center\"} onChange={(e) => setSettings((s) => ({ ...s, bgPosition: e.target.value }))}>\n {[\"center\",\"top\",\"bottom\",\"left\",\"right\",\"top left\",\"top right\",\"bottom left\",\"bottom right\"].map((p)=>(\n <option key={p} value={p}>{p}</option>\n ))}\n </select>\n </PR>\n </div>\n </div>\n </>\n ) : null}\n\n {pageBgUiStep === \"gradient\" ? (\n <DynamicGradientField\n label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><GradientIcon size={13} strokeWidth={2.25} aria-hidden />gradient</span>}\n value={(settings as any).bgGradient}\n onChange={(g)=>setSettings((s)=>({...s,bgGradient:g}))}\n defaults={{ colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"] }}\n C={C}\n />\n ) : null}\n\n <div style={{height:1,background:C.border,margin:\"12px 0\"}} />\n <div style={{fontSize:10,color:C.muted,fontWeight:800,textTransform:\"uppercase\",letterSpacing:\".06em\",marginBottom:6}}>Content background</div>\n <BgModeButtons value={contentBgUiStep} onChange={applyContentBgMode} C={C} />\n {contentBgUiStep === null ? (\n <div style={{ fontSize: 11, color: C.muted, marginBottom: 12, lineHeight: 1.45 }}>\n Choose Color, Gradient, or Image — then the matching settings appear below.\n </div>\n ) : null}\n\n {contentBgUiStep === \"solid\" ? (\n <ColorField\n label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><ColorIcon size={13} strokeWidth={2.25} aria-hidden />content bg</span>}\n value={(settings as any).contentBg}\n onChange={(v)=>setSettings((s)=>({...s,contentBg:v}))}\n placeholder=\"#ffffff\"\n C={C}\n />\n ) : null}\n\n {contentBgUiStep === \"image\" ? (\n <>\n <ImageUrlUploadField\n label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><ImageIcon size={13} strokeWidth={2.25} aria-hidden />content image</span>}\n value={String((settings as any).contentBgImage || \"\")}\n onChange={(v)=>setSettings((s)=>({...s,contentBgImage:v}))}\n onUpload={onUpload}\n accept=\"image/*\"\n buttonLabel=\"upload\"\n inputId={eid(\"settings-content-bg-image-file\")}\n C={C}\n />\n <div style={{ display: \"flex\", gap: 8, marginBottom: 4 }}>\n <div style={{ flex: 1 }}>\n <PR label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><Scaling size={13} strokeWidth={2.25} aria-hidden />{L(\"contentBgSize\")}</span>} C={C}>\n <select\n style={IS}\n value={(settings as { contentBgSize?: string }).contentBgSize || \"cover\"}\n onChange={(e) => setSettings((s) => ({ ...s, contentBgSize: e.target.value }))}\n >\n <option value=\"auto\">Auto</option>\n <option value=\"cover\">Cover</option>\n <option value=\"contain\">Contain</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label={L(\"contentBgRepeat\")} C={C}>\n <select\n style={IS}\n value={(settings as { contentBgRepeat?: string }).contentBgRepeat || \"no-repeat\"}\n onChange={(e) => setSettings((s) => ({ ...s, contentBgRepeat: e.target.value }))}\n >\n <option value=\"no-repeat\">No repeat</option>\n <option value=\"repeat\">Repeat</option>\n <option value=\"repeat-x\">Repeat X</option>\n <option value=\"repeat-y\">Repeat Y</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><Crosshair size={13} strokeWidth={2.25} aria-hidden />{L(\"objectPosition\")}</span>} C={C}>\n <select\n style={IS}\n value={(settings as any).contentBgPosition || \"center\"}\n onChange={(e) => setSettings((s) => ({ ...s, contentBgPosition: e.target.value }))}\n >\n {[\"center\",\"top\",\"bottom\",\"left\",\"right\",\"top left\",\"top right\",\"bottom left\",\"bottom right\"].map((p)=>(\n <option key={p} value={p}>{p}</option>\n ))}\n </select>\n </PR>\n </div>\n </div>\n </>\n ) : null}\n\n {contentBgUiStep === \"gradient\" ? (\n <DynamicGradientField\n label={<span style={{display:\"inline-flex\",alignItems:\"center\",gap:6}}><GradientIcon size={13} strokeWidth={2.25} aria-hidden />gradient</span>}\n value={(settings as any).contentBgGradient}\n onChange={(g)=>setSettings((s)=>({...s,contentBgGradient:g}))}\n defaults={{ colors: [\"#ffffff\", \"#ffffff\", \"#ffffff\"] }}\n C={C}\n />\n ) : null}\n </div>\n </details>\n </>}\n </div>\n </>\n )}\n </div>\n </div>\n {jsonLoading ? (\n <div\n id={eid(\"json-loading\")}\n role=\"status\"\n aria-live=\"polite\"\n aria-busy={true}\n style={{\n position: \"absolute\",\n inset: 0,\n zIndex: 180,\n background: `${C.bg}f2`,\n backdropFilter: \"blur(2px)\",\n WebkitBackdropFilter: \"blur(2px)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 14,\n pointerEvents: \"auto\",\n }}\n >\n <div\n aria-hidden\n style={{\n width: 40,\n height: 40,\n borderRadius: \"50%\",\n border: `3px solid ${C.border}`,\n borderTopColor: C.accent,\n animation: \"email-editor-json-spin 0.65s linear infinite\",\n }}\n />\n <span style={{ fontSize: 13, fontWeight: 600, color: C.text }}>{L(\"loadingDesign\")}</span>\n </div>\n ) : null}\n </div>\n\n {/* ── STATUS BAR ──────────────────────────────────────────────────────── */}\n <div id={eid(\"status-bar\")} style={{display:\"flex\",alignItems:\"center\",gap:12,padding:\"3px 14px\",background:C.toolbarBg,borderTop:`1px solid ${C.border}`,fontSize:10,color:C.muted,flexShrink:0,position:\"sticky\",bottom:0,zIndex:100}}>\n <span>{rows.length} row{rows.length!==1?\"s\":\"\"}</span>\n <span style={{color:C.border}}>·</span>\n <span>{totalBlocks} block{totalBlocks!==1?\"s\":\"\"}</span>\n <span style={{color:C.border}}>·</span>\n <span>{settings.contentWidth}px</span>\n <span style={{color:C.border}}>·</span>\n <span>{zoom}%</span>\n <span style={{color:C.border}}>·</span>\n <span>{locale.toUpperCase()}</span>\n {selectedCB&&<><span style={{color:C.border}}>·</span><span style={{color:C.accent2}}>{selectedCB.type}</span></>}\n </div>\n\n {/* ── MODALS & OVERLAYS ───────────────────────────────────────────────── */}\n {showPreviewModal&&<PreviewModal html={designToHtml(rows, settings, options)} contentWidth={settings.contentWidth} rowCount={rows.length} blockCount={countBlocksInDesign(rows)} editorZoom={zoom} locale={locale} initialDevice={previewDevice} onClose={()=>setShowPreview(false)} C={C}/>}\n {ctxMenu &&<ContextMenu x={ctxMenu.x} y={ctxMenu.y} items={ctxMenu.items} onClose={()=>setCtxMenu(null)} C={C}/>}\n {confirm &&<ConfirmDialog message={confirm.msg} onConfirm={()=>{confirm.onConfirm();setConfirm(null);}} onCancel={()=>setConfirm(null)} C={C}/>}\n </div>\n );\n});\n\nconst ReactEmailEditor = Object.assign(ReactEmailEditorComponent, { jsonToHtml, htmlToJson });\n\nexport { ReactEmailEditor };\n","import React from \"react\";\r\nimport { DEFAULT_BLOCK_PROPS } from \"./defaultBlockProps\";\r\n\r\n// ─── THEMES (monochrome — black / white / gray only) ─────────────────────────\r\nexport const THEMES = {\r\n /** White chrome, dark type */\r\n light: {\r\n bg: \"#f5f5f5\",\r\n sidebar: \"#ffffff\",\r\n canvas: \"#ebebeb\",\r\n surface: \"#fafafa\",\r\n border: \"#d4d4d4\",\r\n accent: \"#0a0a0a\",\r\n accent2: \"#262626\",\r\n text: \"#0a0a0a\",\r\n muted: \"#525252\",\r\n danger: \"#171717\",\r\n success: \"#404040\",\r\n warn: \"#525252\",\r\n inputBg: \"#ffffff\",\r\n toolbarBg: \"#ffffff\",\r\n },\r\n /** Dark chrome, light type */\r\n dark: {\r\n bg: \"#0a0a0a\",\r\n sidebar: \"#141414\",\r\n canvas: \"#0a0a0a\",\r\n surface: \"#1a1a1a\",\r\n border: \"#404040\",\r\n accent: \"#fafafa\",\r\n accent2: \"#e5e5e5\",\r\n text: \"#fafafa\",\r\n muted: \"#a3a3a3\",\r\n danger: \"#f5f5f5\",\r\n success: \"#d4d4d4\",\r\n warn: \"#a3a3a3\",\r\n inputBg: \"#171717\",\r\n toolbarBg: \"#141414\",\r\n },\r\n /** @deprecated aliases — same palette family */\r\n modern_light: {\r\n bg: \"#f5f5f5\",\r\n sidebar: \"#ffffff\",\r\n canvas: \"#ebebeb\",\r\n surface: \"#fafafa\",\r\n border: \"#d4d4d4\",\r\n accent: \"#0a0a0a\",\r\n accent2: \"#262626\",\r\n text: \"#0a0a0a\",\r\n muted: \"#525252\",\r\n danger: \"#171717\",\r\n success: \"#404040\",\r\n warn: \"#525252\",\r\n inputBg: \"#ffffff\",\r\n toolbarBg: \"#ffffff\",\r\n },\r\n modern_dark: {\r\n bg: \"#0a0a0a\",\r\n sidebar: \"#141414\",\r\n canvas: \"#0a0a0a\",\r\n surface: \"#1a1a1a\",\r\n border: \"#404040\",\r\n accent: \"#fafafa\",\r\n accent2: \"#e5e5e5\",\r\n text: \"#fafafa\",\r\n muted: \"#a3a3a3\",\r\n danger: \"#f5f5f5\",\r\n success: \"#d4d4d4\",\r\n warn: \"#a3a3a3\",\r\n inputBg: \"#171717\",\r\n toolbarBg: \"#141414\",\r\n },\r\n};\r\n\r\n// ─── I18N ─────────────────────────────────────────────────────────────────────\r\nexport const I18N = {\r\n en: { layouts:\"Layouts\",blocks:\"Blocks\",settings:\"Settings\",addRow:\"Click layout to add row\",\r\n dragIntoCell:\"Drag into a cell\",dropHere:\"Drop here\",releaseHere:\"Release to drop\",\r\n nothingSelected:\"Nothing selected\",clickBlock:\"Click a row or block to edit.\",\r\n preview:\"Preview\",exportHtml:\"HTML\",save:\"Save\",load:\"Load\",newDesign:\"New\",\r\n undo:\"Undo\",redo:\"Redo\",desktop:\"Desktop\",tablet:\"Tablet\",mobile:\"Mobile\",\r\n copied:\"Copied!\",copyHtml:\"Copy HTML\",emailSettings:\"Email Settings\",\r\n background:\"Background\",contentBg:\"Content Bg\",contentBgImage:\"Content bg image URL\",contentBgSize:\"Content bg image size\",contentBgRepeat:\"Content bg image repeat\",\r\n objectFit:\"Object fit\",objectPosition:\"Object position\",width:\"Width\",\r\n padding:\"Padding\",radius:\"Radius\",row:\"Row\",duplicate:\"Duplicate\",\r\n delete:\"Delete\",moveUp:\"Move Up\",moveDown:\"Move Down\",\r\n autoSaved:\"Auto-saved\",search:\"Search blocks…\",\r\n zoomIn:\"Zoom In\",zoomOut:\"Zoom Out\",zoom:\"Zoom\",templates:\"Templates\",\r\n resizeSidebar:\"Resize sidebar\",\r\n colorScheme:\"Color scheme\",\r\n blockGroupLayouts:\"Row layouts\",\r\n blockGroupBlocks:\"Content blocks\",\r\n blockPaletteGroupText:\"Text & content\",\r\n blockPaletteGroupStructure:\"Layout & structure\",\r\n blockPaletteGroupMedia:\"Media\",\r\n blockPaletteGroupActions:\"Buttons & links\",\r\n blockPaletteGroupWidgets:\"Widgets\",\r\n closePanel:\"Close\",\r\n canvasEmptyHint:\"Drag row layouts or blocks from the library. Drop blocks into a column or onto the mail preview area.\",\r\n emailContentSettings:\"Email content\",\r\n loadingDesign:\"Loading design…\" },\r\n fr: { layouts:\"Mises en page\",blocks:\"Blocs\",settings:\"Paramètres\",addRow:\"Cliquer pour ajouter\",\r\n dragIntoCell:\"Glisser dans une cellule\",dropHere:\"Déposer ici\",releaseHere:\"Relâcher ici\",\r\n nothingSelected:\"Rien de sélectionné\",clickBlock:\"Cliquez sur une ligne ou un bloc.\",\r\n preview:\"Aperçu\",exportHtml:\"HTML\",save:\"Enregistrer\",load:\"Charger\",newDesign:\"Nouveau\",\r\n undo:\"Annuler\",redo:\"Refaire\",desktop:\"Bureau\",tablet:\"Tablette\",mobile:\"Mobile\",\r\n copied:\"Copié!\",copyHtml:\"Copier HTML\",emailSettings:\"Paramètres email\",\r\n background:\"Arrière-plan\",contentBg:\"Fond contenu\",contentBgImage:\"Image de fond du contenu (URL)\",contentBgSize:\"Taille de l’image de fond\",contentBgRepeat:\"Répétition de l’image\",\r\n objectFit:\"Remplissage\",objectPosition:\"Position\",width:\"Largeur\",\r\n padding:\"Rembourrage\",radius:\"Rayon\",row:\"Ligne\",duplicate:\"Dupliquer\",\r\n delete:\"Supprimer\",moveUp:\"Monter\",moveDown:\"Descendre\",\r\n autoSaved:\"Auto-sauvegardé\",search:\"Rechercher…\",\r\n colorScheme:\"Schéma de couleurs\",\r\n blockGroupLayouts:\"Mises en page\",\r\n blockGroupBlocks:\"Blocs de contenu\",\r\n blockPaletteGroupText:\"Texte et contenu\",\r\n blockPaletteGroupStructure:\"Mise en page\",\r\n blockPaletteGroupMedia:\"Médias\",\r\n blockPaletteGroupActions:\"Boutons et liens\",\r\n blockPaletteGroupWidgets:\"Widgets\",\r\n closePanel:\"Fermer\",\r\n canvasEmptyHint:\"Glissez des blocs dans la colonne, ou ajoutez un bloc Mise en page pour plusieurs colonnes.\",\r\n loadingDesign:\"Chargement du design…\",\r\n emailContentSettings:\"Contenu de l’e-mail\",\r\n zoomIn:\"Zoom +\",zoomOut:\"Zoom -\",zoom:\"Zoom\",\r\n resizeSidebar:\"Redimensionner le panneau\",\r\n copy:\"Copier\",paste:\"Coller\" },\r\n de: { layouts:\"Layouts\",blocks:\"Blöcke\",settings:\"Einstellungen\",addRow:\"Layout hinzufügen\",\r\n dragIntoCell:\"In Zelle ziehen\",dropHere:\"Hier ablegen\",releaseHere:\"Loslassen\",\r\n nothingSelected:\"Nichts ausgewählt\",clickBlock:\"Zeile oder Block anklicken.\",\r\n preview:\"Vorschau\",exportHtml:\"HTML\",save:\"Speichern\",load:\"Laden\",newDesign:\"Neu\",\r\n undo:\"Rückgängig\",redo:\"Wiederholen\",desktop:\"Desktop\",tablet:\"Tablet\",mobile:\"Mobil\",\r\n copied:\"Kopiert!\",copyHtml:\"HTML kopieren\",emailSettings:\"E-Mail-Einstellungen\",\r\n background:\"Hintergrund\",contentBg:\"Inhalts-Hintergrund\",contentBgImage:\"Hintergrundbild Inhalt (URL)\",contentBgSize:\"Größe Hintergrundbild\",contentBgRepeat:\"Wiederholung Hintergrundbild\",\r\n objectFit:\"Einpassen\",objectPosition:\"Position\",width:\"Breite\",\r\n padding:\"Innenabstand\",radius:\"Radius\",row:\"Zeile\",duplicate:\"Duplizieren\",\r\n delete:\"Löschen\",moveUp:\"Nach oben\",moveDown:\"Nach unten\",\r\n autoSaved:\"Auto-gespeichert\",search:\"Blöcke suchen…\",\r\n colorScheme:\"Farbschema\",\r\n blockGroupLayouts:\"Zeilenlayouts\",\r\n blockGroupBlocks:\"Inhaltsblöcke\",\r\n blockPaletteGroupText:\"Text & Inhalt\",\r\n blockPaletteGroupStructure:\"Layout & Struktur\",\r\n blockPaletteGroupMedia:\"Medien\",\r\n blockPaletteGroupActions:\"Buttons & Links\",\r\n blockPaletteGroupWidgets:\"Widgets\",\r\n closePanel:\"Schließen\",\r\n canvasEmptyHint:\"Blöcke in die Spalte ziehen oder Layout-Block für mehrspaltige Bereiche hinzufügen.\",\r\n loadingDesign:\"Design wird geladen…\",\r\n emailContentSettings:\"E-Mail-Inhalt\",\r\n zoomIn:\"Zoom +\",zoomOut:\"Zoom -\",zoom:\"Zoom\",\r\n resizeSidebar:\"Seitenleiste skalieren\" },\r\n es: { layouts:\"Diseños\",blocks:\"Bloques\",settings:\"Ajustes\",addRow:\"Haga clic para agregar\",\r\n dragIntoCell:\"Arrastrar a celda\",dropHere:\"Soltar aquí\",releaseHere:\"Soltar aquí\",\r\n nothingSelected:\"Nada seleccionado\",clickBlock:\"Haga clic en una fila o bloque.\",\r\n preview:\"Vista previa\",exportHtml:\"HTML\",save:\"Guardar\",load:\"Cargar\",newDesign:\"Nuevo\",\r\n undo:\"Deshacer\",redo:\"Rehacer\",desktop:\"Escritorio\",tablet:\"Tableta\",mobile:\"Móvil\",\r\n copied:\"¡Copiado!\",copyHtml:\"Copiar HTML\",emailSettings:\"Ajustes de email\",\r\n background:\"Fondo\",contentBg:\"Fondo contenido\",contentBgImage:\"Imagen de fondo del contenido (URL)\",contentBgSize:\"Tamaño imagen de fondo\",contentBgRepeat:\"Repetición imagen de fondo\",\r\n objectFit:\"Ajuste\",objectPosition:\"Posición\",width:\"Ancho\",\r\n padding:\"Relleno\",radius:\"Radio\",row:\"Fila\",duplicate:\"Duplicar\",\r\n delete:\"Eliminar\",moveUp:\"Subir\",moveDown:\"Bajar\",\r\n autoSaved:\"Auto-guardado\",search:\"Buscar bloques…\",\r\n zoomIn:\"Zoom +\",zoomOut:\"Zoom -\",zoom:\"Zoom\",\r\n colorScheme:\"Esquema de color\",\r\n blockGroupLayouts:\"Diseños de fila\",\r\n blockGroupBlocks:\"Bloques de contenido\",\r\n blockPaletteGroupText:\"Texto y contenido\",\r\n blockPaletteGroupStructure:\"Diseño y estructura\",\r\n blockPaletteGroupMedia:\"Medios\",\r\n blockPaletteGroupActions:\"Botones y enlaces\",\r\n blockPaletteGroupWidgets:\"Widgets\",\r\n closePanel:\"Cerrar\",\r\n canvasEmptyHint:\"Arrastra bloques a la columna o añade un bloque Diseño para varias columnas.\",\r\n loadingDesign:\"Cargando diseño…\",\r\n emailContentSettings:\"Contenido del correo\",\r\n resizeSidebar:\"Redimensionar panel\" },\r\n};\r\nexport const tr = (locale, key) => (I18N[locale] || I18N.en)[key] || key;\r\n\r\n// ─── LAYOUT PRESETS ───────────────────────────────────────────────────────────\r\nexport const LAYOUT_PRESETS = [\r\n { key:\"layout1\", label:\"Full Width\", cols:1, ratios:[1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"48\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout2\", label:\"2 Columns\", cols:2, ratios:[1,1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"22\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"28\" y=\"2\" width=\"22\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout3\", label:\"3 Columns\", cols:3, ratios:[1,1,1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"14\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"19\" y=\"2\" width=\"14\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"36\" y=\"2\" width=\"14\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout4\", label:\"4 Columns\", cols:4, ratios:[1,1,1,1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"15\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"28\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"41\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout13\", label:\"1:3 Split\", cols:2, ratios:[1,3], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"16\" y=\"2\" width=\"34\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout31\", label:\"3:1 Split\", cols:2, ratios:[3,1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"34\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"40\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout121\", label:\"1:2:1\", cols:3, ratios:[1,2,1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"16\" y=\"2\" width=\"20\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"40\" y=\"2\" width=\"10\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout212\", label:\"2:1:2\", cols:3, ratios:[2,1,2], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"2\" y=\"2\" width=\"18\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"24\" y=\"2\" width=\"8\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/><rect x=\"36\" y=\"2\" width=\"14\" height=\"24\" rx=\"2\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout_5\", label:\"5 Columns\", cols:5, ratios:[1,1,1,1,1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"1\" y=\"2\" width=\"8\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"11\" y=\"2\" width=\"8\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"21\" y=\"2\" width=\"8\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"31\" y=\"2\" width=\"8\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"41\" y=\"2\" width=\"9\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n { key:\"layout_6\", label:\"6 Columns\", cols:6, ratios:[1,1,1,1,1,1], svg:<svg viewBox=\"0 0 52 28\" width=\"52\" height=\"28\"><rect x=\"1\" y=\"2\" width=\"6\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"9\" y=\"2\" width=\"6\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"17\" y=\"2\" width=\"6\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"25\" y=\"2\" width=\"6\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"33\" y=\"2\" width=\"6\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/><rect x=\"41\" y=\"2\" width=\"9\" height=\"24\" rx=\"1\" fill=\"#171717\" opacity=\".9\"/></svg> },\r\n];\r\n\r\n// ─── CONTENT BLOCK TYPES ─────────────────────────────────────────────────────\r\n/** Sidebar palette groups: order = top to bottom. Each block uses `paletteGroup` + `paletteOrder` (ascending within group). */\r\nexport const BLOCK_PALETTE_GROUPS = [\r\n { key: \"text\", labelKey: \"blockPaletteGroupText\" as const },\r\n { key: \"structure\", labelKey: \"blockPaletteGroupStructure\" as const },\r\n { key: \"media\", labelKey: \"blockPaletteGroupMedia\" as const },\r\n { key: \"actions\", labelKey: \"blockPaletteGroupActions\" as const },\r\n { key: \"widgets\", labelKey: \"blockPaletteGroupWidgets\" as const },\r\n] as const;\r\n\r\nexport type BlockPaletteGroupKey = (typeof BLOCK_PALETTE_GROUPS)[number][\"key\"];\r\n\r\ntype PaletteMeta = {\r\n label: string;\r\n icon: string;\r\n color: string;\r\n paletteGroup: BlockPaletteGroupKey;\r\n paletteOrder: number;\r\n};\r\n\r\n/** Sidebar palette: one entry per `DEFAULT_BLOCK_PROPS` key (labels / groups for the block library). */\r\nconst PALETTE_META = {\r\n heading: { label: \"Heading\", icon: \"H\", color: \"#262626\", paletteGroup: \"text\", paletteOrder: 1 },\r\n text: { label: \"Text\", icon: \"T\", color: \"#262626\", paletteGroup: \"text\", paletteOrder: 2 },\r\n html: { label: \"Rich editor\", icon: \"Aa\", color: \"#262626\", paletteGroup: \"text\", paletteOrder: 3 },\r\n layout: { label: \"Layout\", icon: \"⊞\", color: \"#262626\", paletteGroup: \"structure\", paletteOrder: 1 },\r\n divider: { label: \"Divider\", icon: \"—\", color: \"#262626\", paletteGroup: \"structure\", paletteOrder: 2 },\r\n spacer: { label: \"Spacer\", icon: \"↕\", color: \"#262626\", paletteGroup: \"structure\", paletteOrder: 3 },\r\n table: { label: \"Table\", icon: \"▦\", color: \"#262626\", paletteGroup: \"structure\", paletteOrder: 4 },\r\n image: { label: \"Image\", icon: \"🖼\", color: \"#262626\", paletteGroup: \"media\", paletteOrder: 1 },\r\n video: { label: \"Video\", icon: \"▶\", color: \"#262626\", paletteGroup: \"media\", paletteOrder: 2 },\r\n button: { label: \"Button\", icon: \"⬜\", color: \"#262626\", paletteGroup: \"actions\", paletteOrder: 1 },\r\n link: { label: \"Link\", icon: \"🔗\", color: \"#262626\", paletteGroup: \"actions\", paletteOrder: 2 },\r\n menu: { label: \"Menu\", icon: \"☰\", color: \"#262626\", paletteGroup: \"actions\", paletteOrder: 3 },\r\n social: { label: \"Social\", icon: \"◎\", color: \"#262626\", paletteGroup: \"widgets\", paletteOrder: 1 },\r\n timer: { label: \"Countdown\", icon: \"⏱\", color: \"#262626\", paletteGroup: \"widgets\", paletteOrder: 2 },\r\n} satisfies Record<keyof typeof DEFAULT_BLOCK_PROPS, PaletteMeta>;\r\n\r\nexport const CONTENT_BLOCK_TYPES = (\r\n Object.keys(PALETTE_META) as (keyof typeof PALETTE_META)[]\r\n).map((type) => ({\r\n type,\r\n ...PALETTE_META[type],\r\n}));\r\n\r\nexport const SC = { twitter:\"#000000\",facebook:\"#1877F2\",instagram:\"#E1306C\",linkedin:\"#0A66C2\",youtube:\"#FF0000\",pinterest:\"#E60023\",tiktok:\"#000000\",snapchat:\"#FFFC00\",github:\"#24292e\",discord:\"#5865F2\" };\r\nexport const ALL_NETWORKS = Object.keys(SC);\r\n\r\nexport function pickPresetByColCount(n) {\r\n const exact = LAYOUT_PRESETS.find((p) => p.cols === n);\r\n if (exact) return exact;\r\n if (n <= 1) return LAYOUT_PRESETS[0];\r\n return LAYOUT_PRESETS.find((p) => p.cols === Math.min(n, 6)) || LAYOUT_PRESETS[0];\r\n}\r\n","/** Shared defaults for a multi-column block inside a cell (`type: \"layout\"` with `props.cells`). */\r\nconst LAYOUT_IN_CELL_DEFAULTS = {\r\n cols: 2,\r\n ratios: [1, 1],\r\n gap: 12,\r\n padding: 8,\r\n bgColor: \"\",\r\n bgImage: \"\",\r\n bgSize: \"cover\",\r\n bgRepeat: \"no-repeat\",\r\n bgPosition: \"center\",\r\n bgGradient: null as { angle: number; colors: string[]; stops: number[] } | null,\r\n cells: [[], []],\r\n} as const;\r\n\r\nconst BOX0 = { top: 0, right: 0, bottom: 0, left: 0 } as const;\r\nconst boxAll = (n: number) => ({ top: n, right: n, bottom: n, left: n });\r\n\r\nconst BLOCK_BG = {\r\n bgColor: \"\",\r\n bgImage: \"\",\r\n bgGradient: null as { angle: number; colors: string[]; stops: number[] } | null,\r\n bgSize: \"cover\",\r\n bgRepeat: \"no-repeat\",\r\n bgPosition: \"center\",\r\n} as const;\r\n\r\nconst BACKDROP_BG = {\r\n backdropColor: \"\",\r\n backdropImage: \"\",\r\n backdropGradient: null as { angle: number; colors: string[]; stops: number[] } | null,\r\n backdropSize: \"cover\",\r\n backdropRepeat: \"no-repeat\",\r\n backdropPosition: \"center\",\r\n} as const;\r\n\r\n/** Plain defaults for `makeContentBlock` — `text.content` is plain text. */\r\nexport const DEFAULT_BLOCK_PROPS = {\r\n heading: {\r\n ...BLOCK_BG,\r\n content: \"Your Headline Here\",\r\n level: \"h2\",\r\n fontSize: 28,\r\n color: \"#1e293b\",\r\n align: \"center\",\r\n fontWeight: \"700\",\r\n padding: boxAll(16),\r\n letterSpacing: 0,\r\n lineHeight: 1.2,\r\n fontFamily: \"Georgia,serif\",\r\n margin: { ...BOX0 },\r\n },\r\n text: {\r\n ...BLOCK_BG,\r\n content: \"Simple text block for plain messaging.\",\r\n fontSize: 15,\r\n color: \"#1e293b\",\r\n align: \"left\",\r\n fontWeight: \"400\",\r\n italic: false,\r\n underline: false,\r\n padding: boxAll(12),\r\n lineHeight: 1.65,\r\n letterSpacing: 0,\r\n fontFamily: \"Georgia,serif\",\r\n margin: { ...BOX0 },\r\n },\r\n /** Rich HTML body lives on the block root as `content` (string), not in `props`. */\r\n html: {\r\n ...BLOCK_BG,\r\n fontSize: 15,\r\n color: \"#1e293b\",\r\n align: \"left\",\r\n padding: boxAll(12),\r\n lineHeight: 1.65,\r\n letterSpacing: 0,\r\n fontFamily: \"Georgia,serif\",\r\n margin: { ...BOX0 },\r\n },\r\n image: {\r\n ...BLOCK_BG,\r\n src: \"https://placehold.co/600x160/e2e8f0/94a3b8?text=Image\",\r\n alt: \"Image\",\r\n width: \"100%\",\r\n objectFit: \"cover\",\r\n objectPosition: \"center\",\r\n align: \"center\",\r\n padding: boxAll(8),\r\n link: \"\",\r\n linkEnabled: false,\r\n linkTarget: \"_blank\",\r\n borderRadius: { tl: 0, tr: 0, br: 0, bl: 0 },\r\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\r\n },\r\n button: {\r\n ...BACKDROP_BG,\r\n label: \"Click Here\",\r\n href: \"#\",\r\n bgColor: \"#6366f1\",\r\n textColor: \"#ffffff\",\r\n align: \"center\",\r\n borderRadius: { tl: 6, tr: 6, br: 6, bl: 6 },\r\n paddingV: 11,\r\n paddingH: 24,\r\n fontSize: 14,\r\n fontWeight: 600,\r\n fullWidth: false,\r\n borderColor: \"transparent\",\r\n borderWidth: 0,\r\n linkTarget: \"_blank\",\r\n /** Space around the button block (outside the CTA). */\r\n padding: { ...BOX0 },\r\n margin: { ...BOX0 },\r\n },\r\n link: {\r\n ...BLOCK_BG,\r\n label: \"Link text\",\r\n href: \"#\",\r\n linkTarget: \"_blank\",\r\n color: \"#2563eb\",\r\n fontSize: 15,\r\n align: \"left\",\r\n fontWeight: \"700\",\r\n padding: boxAll(8),\r\n underline: true,\r\n fontFamily: \"Arial, Helvetica, sans-serif\",\r\n margin: { ...BOX0 },\r\n },\r\n divider: {\r\n ...BLOCK_BG,\r\n color: \"#e2e8f0\",\r\n thickness: 1,\r\n padding: boxAll(12),\r\n style: \"solid\",\r\n margin: { ...BOX0 },\r\n },\r\n spacer: { ...BLOCK_BG, height: 24, padding: { ...BOX0 }, margin: { ...BOX0 } },\r\n social: {\r\n ...BLOCK_BG,\r\n networks: [\"twitter\", \"facebook\", \"instagram\", \"linkedin\"],\r\n socialUrls: {},\r\n iconSize: 30,\r\n align: \"center\",\r\n padding: boxAll(12),\r\n shape: \"circle\",\r\n gap: 6,\r\n margin: { ...BOX0 },\r\n },\r\n video: {\r\n ...BLOCK_BG,\r\n src: \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\r\n height: 280,\r\n padding: boxAll(8),\r\n margin: { ...BOX0 },\r\n },\r\n menu: {\r\n ...BLOCK_BG,\r\n items: [\r\n { label: \"Home\", href: \"#\" },\r\n { label: \"About\", href: \"#\" },\r\n { label: \"Contact\", href: \"#\" },\r\n ],\r\n align: \"center\",\r\n fontSize: 14,\r\n color: \"#6366f1\",\r\n padding: boxAll(12),\r\n gap: 20,\r\n margin: { ...BOX0 },\r\n },\r\n timer: {\r\n ...BACKDROP_BG,\r\n endDate: new Date(Date.now() + 7 * 864e5).toISOString(),\r\n align: \"center\",\r\n bgColor: \"#6366f1\",\r\n textColor: \"#ffffff\",\r\n padding: boxAll(12),\r\n borderRadius: { tl: 6, tr: 6, br: 6, bl: 6 },\r\n label: \"Offer ends in:\",\r\n showLabels: true,\r\n margin: { ...BOX0 },\r\n },\r\n layout: {\r\n ...LAYOUT_IN_CELL_DEFAULTS,\r\n preset: \"custom\",\r\n },\r\n table: {\r\n ...BLOCK_BG,\r\n header: false,\r\n tableRole: \"data\",\r\n rows: 3,\r\n cols: 3,\r\n /** Padding around the whole table (outside cells). */\r\n padding: boxAll(10),\r\n /** Padding inside each table cell (same shape as block padding). */\r\n cellPadding: boxAll(10),\r\n headerBg: \"#1a5fbe\",\r\n headerColor: \"#ffffff\",\r\n cellBg: \"#ffffff\",\r\n cellBorder: \"#d0dff0\",\r\n stripedBg: \"#f4f8ff\",\r\n striped: true,\r\n data: [\r\n [\"Col A\", \"Col B\", \"Col C\"],\r\n [\"Row 2 A\", \"Row 2 B\", \"Row 2 C\"],\r\n [\"Row 3 A\", \"Row 3 B\", \"Row 3 C\"],\r\n ],\r\n fontSize: 13,\r\n fontFamily: \"sans-serif\",\r\n margin: { ...BOX0 },\r\n },\r\n} as const;\r\n\r\n/** Default markup for new `html` blocks (`makeContentBlock(\"html\")`). */\r\nexport const DEFAULT_HTML_BLOCK_MARKUP =\r\n \"<p>Rich HTML content. Edit with the rich editor.</p>\" as const;\r\n\r\nexport function imageLinkActive(p: { linkEnabled?: boolean; link?: string }): boolean {\r\n const url = typeof p.link === \"string\" ? p.link.trim() : \"\";\r\n const enabled = p.linkEnabled ?? !!url;\r\n return enabled && !!url;\r\n}\r\n\r\nexport type BlockPropKey = keyof typeof DEFAULT_BLOCK_PROPS;\r\n\r\n/** Content blocks allowed in design JSON / editor (same keys as {@link DEFAULT_BLOCK_PROPS}). */\r\nexport function isKnownBlockType(type: unknown): type is BlockPropKey {\r\n return typeof type === \"string\" && type in DEFAULT_BLOCK_PROPS;\r\n}\r\n","const BOX0 = { top: 0, right: 0, bottom: 0, left: 0 } as const;\r\n\r\n/** Per-column surface defaults (matches former `columnStyles[i]` fields). */\r\nexport const DEFAULT_COLUMN_PROPS = {\r\n bgColor: \"\",\r\n bgImage: \"\",\r\n bgGradient: null as { angle: number; colors: string[]; stops: number[] } | null,\r\n bgSize: \"cover\",\r\n bgRepeat: \"no-repeat\",\r\n bgPosition: \"center\",\r\n padding: { ...BOX0 },\r\n borderRadius: 0 as number | { tl: number; tr: number; br: number; bl: number },\r\n} as const;\r\n\r\nexport type ColumnProps = typeof DEFAULT_COLUMN_PROPS;\r\nexport type ColumnEntry = { props: ColumnProps };\r\n\r\nfunction isObj(x: unknown): x is Record<string, unknown> {\r\n return x !== null && typeof x === \"object\" && !Array.isArray(x);\r\n}\r\n\r\nfunction colCountFromContainer(c: { cells?: unknown[]; ratios?: unknown[]; cols?: number }) {\r\n const cells = Array.isArray(c.cells) ? c.cells.length : 0;\r\n const ratios = Array.isArray(c.ratios) ? c.ratios.length : 0;\r\n const cols = typeof c.cols === \"number\" && c.cols > 0 ? c.cols : 0;\r\n return Math.max(1, cells, ratios, cols);\r\n}\r\n\r\n/** Legacy `columnStyles` map → `columns[]`. */\r\nexport function columnsFromLegacyMap(\r\n map: unknown,\r\n count: number,\r\n): ColumnEntry[] {\r\n const n = Math.max(1, count);\r\n const src = isObj(map) ? map : {};\r\n return Array.from({ length: n }, (_, i) => {\r\n const raw = (src[i] ?? src[String(i)]) as Record<string, unknown> | undefined;\r\n return { props: { ...DEFAULT_COLUMN_PROPS, ...(isObj(raw) ? raw : {}) } as ColumnProps };\r\n });\r\n}\r\n\r\n/** Normalize row or layout `props` to `columns[]` (supports legacy `columnStyles`). */\r\nexport function getColumns(container: {\r\n columns?: unknown;\r\n columnStyles?: unknown;\r\n cells?: unknown[];\r\n ratios?: unknown[];\r\n cols?: number;\r\n}): ColumnEntry[] {\r\n const count = colCountFromContainer(container);\r\n if (Array.isArray(container.columns)) {\r\n const cols = container.columns as unknown[];\r\n return Array.from({ length: count }, (_, i) => {\r\n const entry = cols[i];\r\n if (isObj(entry) && isObj(entry.props)) {\r\n return { props: { ...DEFAULT_COLUMN_PROPS, ...entry.props } as ColumnProps };\r\n }\r\n if (isObj(entry)) {\r\n return { props: { ...DEFAULT_COLUMN_PROPS, ...entry } as ColumnProps };\r\n }\r\n return { props: { ...DEFAULT_COLUMN_PROPS } };\r\n });\r\n }\r\n if (container.columnStyles) {\r\n return columnsFromLegacyMap(container.columnStyles, count);\r\n }\r\n return columnsFromLegacyMap({}, count);\r\n}\r\n\r\nexport function getColumnPropsAt(\r\n container: Parameters<typeof getColumns>[0],\r\n index: number,\r\n): ColumnProps {\r\n const cols = getColumns(container);\r\n const i = Math.max(0, Math.min(index, cols.length - 1));\r\n return cols[i]?.props ?? { ...DEFAULT_COLUMN_PROPS };\r\n}\r\n\r\nexport function patchColumnPropsAt(\r\n container: Parameters<typeof getColumns>[0],\r\n index: number,\r\n patch: Partial<ColumnProps>,\r\n): ColumnEntry[] {\r\n const cols = getColumns(container);\r\n const i = Math.max(0, index);\r\n while (cols.length <= i) cols.push({ props: { ...DEFAULT_COLUMN_PROPS } });\r\n cols[i] = { props: { ...cols[i].props, ...patch } };\r\n return cols;\r\n}\r\n\r\n/** Strip legacy `columnStyles` when persisting `columns`. */\r\nexport function withColumnsOnly<T extends Record<string, unknown>>(\r\n row: T,\r\n columns: ColumnEntry[],\r\n): T & { columns: ColumnEntry[] } {\r\n const { columnStyles: _drop, ...rest } = row as T & { columnStyles?: unknown };\r\n return { ...rest, columns };\r\n}\r\n\r\nexport function columnPaddingNonZero(pad: { top: number; right: number; bottom: number; left: number }) {\r\n return pad.top !== 0 || pad.right !== 0 || pad.bottom !== 0 || pad.left !== 0;\r\n}\r\n\r\nexport function columnRadiusNonZero(r: unknown) {\r\n if (typeof r === \"number\") return r !== 0;\r\n if (isObj(r)) {\r\n return !!(r.tl || r.tr || r.br || r.bl);\r\n }\r\n return false;\r\n}\r\n\r\nexport function columnEntryHasSurface(entry: ColumnEntry) {\r\n const p = entry.props;\r\n const pad = p.padding;\r\n const hasPad =\r\n pad && typeof pad === \"object\"\r\n ? columnPaddingNonZero(pad as { top: number; right: number; bottom: number; left: number })\r\n : false;\r\n return !!(\r\n p.bgColor ||\r\n hasPad ||\r\n columnRadiusNonZero(p.borderRadius) ||\r\n p.bgImage ||\r\n p.bgGradient\r\n );\r\n}\r\n","import { DEFAULT_BLOCK_PROPS, DEFAULT_HTML_BLOCK_MARKUP } from \"../defaultBlockProps\";\r\nimport { DEFAULT_COLUMN_PROPS } from \"./columnProps\";\r\n\r\nexport function uid() { return Math.random().toString(36).slice(2,10); }\r\nexport function makeLayoutRow(preset) {\r\n return {\r\n id: uid(),\r\n type: \"layout\",\r\n preset: preset.key,\r\n cols: preset.cols,\r\n ratios: [...preset.ratios],\r\n gap: 12,\r\n padding: 8,\r\n bgColor: \"\",\r\n bgImage: \"\",\r\n bgSize: \"cover\",\r\n bgRepeat: \"no-repeat\",\r\n bgPosition: \"center\",\r\n bgGradient: null,\r\n cells: preset.ratios.map(() => []),\r\n };\r\n}\r\n\r\n/** Content block: columns inside a column (`layout` with cells; preset from row layout). */\r\nexport function makeNestedRowBlock(preset) {\r\n const row = makeLayoutRow(preset);\r\n return {\r\n id: uid(),\r\n type: \"layout\",\r\n props: {\r\n preset: row.preset,\r\n cols: row.cols,\r\n ratios: [...row.ratios],\r\n gap: row.gap,\r\n padding: row.padding,\r\n bgColor: row.bgColor,\r\n bgImage: row.bgImage,\r\n bgSize: row.bgSize ?? \"cover\",\r\n bgRepeat: row.bgRepeat ?? \"no-repeat\",\r\n bgPosition: (row as any).bgPosition ?? \"center\",\r\n bgGradient: (row as any).bgGradient ?? null,\r\n columns: (row as any).columns ?? (row as any).cells?.map(() => ({ props: { ...DEFAULT_COLUMN_PROPS } })),\r\n cells: row.cells,\r\n },\r\n };\r\n}\r\n\r\nexport function makeContentBlock(type) {\r\n if (type === \"html\") {\r\n return {\r\n id: uid(),\r\n type,\r\n content: DEFAULT_HTML_BLOCK_MARKUP,\r\n props: { ...DEFAULT_BLOCK_PROPS.html, content: DEFAULT_HTML_BLOCK_MARKUP },\r\n };\r\n }\r\n return { id: uid(), type, props: { ...DEFAULT_BLOCK_PROPS[type] } };\r\n}\r\n\r\n/** Editor row with one content block — exports as a flat root block in `blocks[]`. */\r\nexport function makeRootContentRow(contentType: string, preset: { key: string; cols: number; ratios: number[] }) {\r\n const row = makeLayoutRow(preset);\r\n row.gap = 0;\r\n row.padding = 0;\r\n const block = makeContentBlock(contentType);\r\n row.cells[0] = [block];\r\n return { row, block };\r\n}\r\n","/**\n * Maximum layout nesting the editor supports for moves/drops/selection.\n * `ColumnLoc` is only `top` or one `nested` hop (row → outer cell → layout → inner cell).\n * Deeper `layout` blocks in JSON are clamped on hydrate/export (see `emailDesignJson`).\n */\nexport const MAX_NESTED_LAYOUT_DEPTH = 1;\n\n/** 0 = top-level row column; 1 = column inside a nested `layout` block. */\nexport function nestedLayoutDepth(\n nested: { parentBlockIdx?: number; innerCellIdx?: number } | null | undefined,\n): number {\n return nested != null && nested.parentBlockIdx != null && nested.innerCellIdx != null ? 1 : 0;\n}\n\n/** Content blocks that contain multiple columns (`cells` / `ratios`). */\nexport function isSplitLayoutBlock(b) {\n return b && b.type === \"layout\" && b.props && Array.isArray(b.props.cells);\n}\n\n/** Canvas row with a single root content block (one section = one block at export). */\nexport function isRootContentRow(row: { cells?: unknown[][] }) {\n if (!row?.cells || row.cells.length !== 1) return false;\n const col = row.cells[0];\n if (!Array.isArray(col) || col.length !== 1) return false;\n const b = col[0] as { type?: string } | null;\n return !!b && typeof b.type === \"string\" && b.type !== \"layout\" && b.type !== \"nestedRow\";\n}\n\n/**\n * Address a column of blocks: top-level row column, or a column inside a nested `layout` block.\n * @typedef {{ type: 'top', rowId: string, cellIdx: number }} TopColumnLoc\n * @typedef {{ type: 'nested', rowId: string, outerCellIdx: number, blockIdx: number, innerCellIdx: number }} NestedColumnLoc\n * @typedef {TopColumnLoc | NestedColumnLoc} ColumnLoc\n */\n\n/** @param {ColumnLoc} loc */\nexport function getColumnBlocks(rows, loc) {\n const r = rows.find((x) => x.id === loc.rowId);\n if (!r) return [];\n if (loc.type === \"top\") return r.cells[loc.cellIdx] || [];\n const col = r.cells[loc.outerCellIdx];\n if (!col) return [];\n const b = col[loc.blockIdx];\n if (!isSplitLayoutBlock(b)) return [];\n return b.props.cells[loc.innerCellIdx] || [];\n}\n\n/** @param {ColumnLoc} loc @param {(col: object[]) => object[]} updater */\nexport function updateColumnAt(rows, loc, updater) {\n return rows.map((r) => {\n if (r.id !== loc.rowId) return r;\n if (loc.type === \"top\") {\n return {\n ...r,\n cells: r.cells.map((c, ci) => (ci === loc.cellIdx ? updater(c) : c)),\n };\n }\n return {\n ...r,\n cells: r.cells.map((col, oci) => {\n if (oci !== loc.outerCellIdx) return col;\n return col.map((b, bi) => {\n if (bi !== loc.blockIdx || !isSplitLayoutBlock(b)) return b;\n const nextInner = b.props.cells.map((ic, ici) =>\n ici === loc.innerCellIdx ? updater(ic) : ic,\n );\n return { ...b, props: { ...b.props, cells: nextInner } };\n });\n }),\n };\n });\n}\n\n/**\n * @param {object[]} rows\n * @param {string} rowId\n * @param {number} cellIdx outer column\n * @param {{ parentBlockIdx: number, innerCellIdx: number }|null|undefined} nested\n * @returns {ColumnLoc}\n */\nexport function toColumnLoc(rowId, cellIdx, nested) {\n if (nested && nested.parentBlockIdx != null && nested.innerCellIdx != null) {\n return {\n type: \"nested\",\n rowId,\n outerCellIdx: cellIdx,\n blockIdx: nested.parentBlockIdx,\n innerCellIdx: nested.innerCellIdx,\n };\n }\n return { type: \"top\", rowId, cellIdx };\n}\n\n/** True when both locs refer to the same block column (for move index math). */\nexport function sameColumnLoc(a, b) {\n if (!a || !b || a.rowId !== b.rowId) return false;\n if (a.type === \"top\" && b.type === \"top\") return a.cellIdx === b.cellIdx;\n if (a.type === \"nested\" && b.type === \"nested\") {\n return (\n a.outerCellIdx === b.outerCellIdx &&\n a.blockIdx === b.blockIdx &&\n a.innerCellIdx === b.innerCellIdx\n );\n }\n return false;\n}\n\nexport function countBlocksInDesign(rows) {\n const colBlocks = (blocks) =>\n blocks.reduce((n, b) => {\n if (isSplitLayoutBlock(b)) {\n const inner = (b.props.cells || []).reduce((m, c) => m + c.length, 0);\n return n + 1 + inner;\n }\n return n + 1;\n }, 0);\n return rows.reduce((sum, r) => sum + r.cells.reduce((s, c) => s + colBlocks(c), 0), 0);\n}\n","// --- HTML text safety ---\r\nexport function escHtmlAttr(s: unknown) {\r\n return String(s ?? \"\")\r\n .replace(/&/g, \"&\")\r\n .replace(/\"/g, \""\")\r\n .replace(/</g, \"<\")\r\n .replace(/>/g, \">\");\r\n}\r\n\r\nexport function escHtml(s: unknown) {\r\n return String(s ?? \"\")\r\n .replace(/&/g, \"&\")\r\n .replace(/</g, \"<\")\r\n .replace(/>/g, \">\");\r\n}\r\n\r\n// --- Base64 (UTF-8) for embedded design blobs / tooling ---\r\nexport function utf8ToBase64(raw: string): string {\r\n const bytes = new TextEncoder().encode(raw);\r\n let bin = \"\";\r\n for (let i = 0; i < bytes.length; i++) bin += String.fromCharCode(bytes[i]!);\r\n return btoa(bin);\r\n}\r\n\r\nexport function base64ToUtf8(b64: string): string {\r\n try {\r\n const bin = atob(b64.trim());\r\n const bytes = new Uint8Array(bin.length);\r\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\r\n return new TextDecoder().decode(bytes);\r\n } catch {\r\n return \"\";\r\n }\r\n}\r\n\r\n// --- Video URLs (YouTube / Vimeo) ---\r\nexport function videoSrcForEditorDisplay(src: unknown) {\r\n if (!src || typeof src !== \"string\") return \"\";\r\n const ytEmb = src.match(/youtube\\.com\\/embed\\/([A-Za-z0-9_-]{11})/);\r\n if (ytEmb) return `https://www.youtube.com/watch?v=${ytEmb[1]}`;\r\n const viEmb = src.match(/player\\.vimeo\\.com\\/video\\/(\\d+)/);\r\n if (viEmb) return `https://vimeo.com/${viEmb[1]}`;\r\n return src;\r\n}\r\n\r\nexport function videoUrlToEmbedSrc(url: unknown) {\r\n if (!url || typeof url !== \"string\") return \"\";\r\n const yt = url.match(/(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/)([A-Za-z0-9_-]{11})/);\r\n if (yt) return `https://www.youtube.com/embed/${yt[1]}`;\r\n const sh = url.match(/youtube\\.com\\/shorts\\/([A-Za-z0-9_-]{11})/);\r\n if (sh) return `https://www.youtube.com/embed/${sh[1]}`;\r\n const vi = url.match(/vimeo\\.com\\/(\\d+)/);\r\n if (vi) return `https://player.vimeo.com/video/${vi[1]}`;\r\n return url;\r\n}\r\n\r\n// --- Rich HTML (TipTap / canvas storage) ---\r\nconst EMPTY_RICH_HTML = \"\";\r\n\r\nfunction unwrapAllDivElements(container: HTMLElement) {\r\n let el: HTMLDivElement | null;\r\n while ((el = container.querySelector(\"div\"))) {\r\n const parent = el.parentNode;\r\n if (!parent) break;\r\n while (el.firstChild) parent.insertBefore(el.firstChild, el);\r\n parent.removeChild(el);\r\n }\r\n}\r\n\r\n/** Collapse empty rich HTML to a canonical body; strip layout `<div>` wrappers in the browser. */\r\nexport function normalizeRichHtmlForStorage(html: string | undefined | null): string {\r\n const raw = String(html ?? \"\").trim();\r\n if (!raw) return EMPTY_RICH_HTML;\r\n if (typeof document === \"undefined\") {\r\n if (/^<p[^>]*>\\s*(<br\\s*\\/?\\s*>)?\\s*<\\/p>$/i.test(raw)) return EMPTY_RICH_HTML;\r\n return raw;\r\n }\r\n const tmp = document.createElement(\"div\");\r\n tmp.innerHTML = raw;\r\n unwrapAllDivElements(tmp);\r\n const text = (tmp.textContent || \"\").replace(/\\u00a0/g, \" \").trim();\r\n if (!text && !tmp.querySelector(\"img,video,iframe,svg\")) return EMPTY_RICH_HTML;\r\n return tmp.innerHTML.trim();\r\n}\r\n\r\nexport function isEffectivelyEmptyRichHtml(html: string | undefined | null): boolean {\r\n return normalizeRichHtmlForStorage(html) === EMPTY_RICH_HTML;\r\n}\r\n\r\n/** Shared rich HTML presentation (lists, headings, quotes) for canvas + email preview. */\r\nexport const RICH_HTML_CONTENT_CSS = `\r\n.email-rich-html-content ul,\r\n.email-rich-html-content ol {\r\n margin: 0.35em 0;\r\n padding-left: 1.35rem;\r\n list-style-position: outside;\r\n}\r\n.email-rich-html-content ul { list-style-type: disc; }\r\n.email-rich-html-content ol { list-style-type: decimal; }\r\n.email-rich-html-content li { margin: 0.2em 0; }\r\n.email-rich-html-content li > p { margin: 0; }\r\n.email-rich-html-content p { margin: 0.35em 0; }\r\n.email-rich-html-content h2,\r\n.email-rich-html-content h3,\r\n.email-rich-html-content h4 {\r\n margin: 0.5em 0 0.25em;\r\n line-height: 1.25;\r\n font-weight: 700;\r\n}\r\n.email-rich-html-content blockquote {\r\n margin: 0.35em 0;\r\n padding-left: 0.75rem;\r\n border-left: 3px solid #cbd5e1;\r\n}\r\n.email-rich-html-content hr {\r\n border: none;\r\n border-top: 1px solid #e2e8f0;\r\n margin: 0.75em 0;\r\n}\r\n.email-rich-html-content code {\r\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\r\n font-size: 0.92em;\r\n background: rgba(0, 0, 0, 0.06);\r\n padding: 0.1em 0.35em;\r\n border-radius: 3px;\r\n}\r\n.email-rich-html-inner ul,\r\n.email-rich-html-inner ol {\r\n margin: 0.35em 0;\r\n padding-left: 1.35rem;\r\n list-style-position: outside;\r\n}\r\n.email-rich-html-inner ul { list-style-type: disc; }\r\n.email-rich-html-inner ol { list-style-type: decimal; }\r\n.email-rich-html-inner li { margin: 0.2em 0; }\r\n.email-rich-html-inner li > p { margin: 0; }\r\n.email-rich-html-inner p { margin: 0.35em 0; }\r\n.email-rich-html-inner h2,\r\n.email-rich-html-inner h3,\r\n.email-rich-html-inner h4 {\r\n margin: 0.5em 0 0.25em;\r\n line-height: 1.25;\r\n font-weight: 700;\r\n}\r\n.email-rich-html-inner blockquote {\r\n margin: 0.35em 0;\r\n padding-left: 0.75rem;\r\n border-left: 3px solid #cbd5e1;\r\n}\r\n.email-rich-html-inner hr {\r\n border: none;\r\n border-top: 1px solid #e2e8f0;\r\n margin: 0.75em 0;\r\n}\r\n`.trim();\r\n\r\nfunction applyInlineListStyles(root: HTMLElement) {\r\n root.querySelectorAll(\"ul\").forEach((ul) => {\r\n const el = ul as HTMLElement;\r\n el.style.margin = el.style.margin || \"0.35em 0\";\r\n el.style.paddingLeft = el.style.paddingLeft || \"1.35rem\";\r\n el.style.listStyleType = el.style.listStyleType || \"disc\";\r\n el.style.listStylePosition = el.style.listStylePosition || \"outside\";\r\n });\r\n root.querySelectorAll(\"ol\").forEach((ol) => {\r\n const el = ol as HTMLElement;\r\n el.style.margin = el.style.margin || \"0.35em 0\";\r\n el.style.paddingLeft = el.style.paddingLeft || \"1.35rem\";\r\n el.style.listStyleType = el.style.listStyleType || \"decimal\";\r\n el.style.listStylePosition = el.style.listStylePosition || \"outside\";\r\n });\r\n root.querySelectorAll(\"li\").forEach((li) => {\r\n const el = li as HTMLElement;\r\n if (!el.style.margin) el.style.margin = \"0.2em 0\";\r\n });\r\n root.querySelectorAll(\"li > p\").forEach((p) => {\r\n const el = p as HTMLElement;\r\n if (!el.style.margin) el.style.margin = \"0\";\r\n });\r\n}\r\n\r\n/** Inline list/quote styles for HTML email clients that strip `<style>` rules. */\r\nexport function enhanceRichHtmlForEmail(html: string | undefined | null): string {\r\n const raw = String(html ?? \"\").trim();\r\n if (!raw || raw === EMPTY_RICH_HTML) return raw || EMPTY_RICH_HTML;\r\n if (typeof document === \"undefined\") return raw;\r\n const tmp = document.createElement(\"div\");\r\n tmp.innerHTML = raw;\r\n if (!tmp.querySelector(\"ul,ol,blockquote,h2,h3,h4,hr\")) return raw;\r\n applyInlineListStyles(tmp);\r\n tmp.querySelectorAll(\"blockquote\").forEach((bq) => {\r\n const el = bq as HTMLElement;\r\n if (!el.style.margin) el.style.margin = \"0.35em 0\";\r\n if (!el.style.paddingLeft) el.style.paddingLeft = \"0.75rem\";\r\n if (!el.style.borderLeft) el.style.borderLeft = \"3px solid #cbd5e1\";\r\n });\r\n return tmp.innerHTML.trim();\r\n}\r\n","import React from \"react\";\r\n\r\n/** viewBox 0 0 24 24 — paths adapted from Simple Icons (MIT) */\r\nconst GLYPHS = {\r\n facebook:\r\n \"M24 12.073C24 5.446 18.627 0 12 0S0 5.446 0 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z\",\r\n /** X (formerly Twitter) — Simple Icons “X” */\r\n twitter:\r\n \"M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z\",\r\n instagram:\r\n \"M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.98-6.98.072-1.28.07-1.689.07-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z\",\r\n linkedin:\r\n \"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\",\r\n youtube:\r\n \"M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\",\r\n pinterest:\r\n \"M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.174-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.966-2.901 2.165-2.901 1.021 0 1.512.765 1.512 1.682 0 1.025-.653 2.555-.99 3.978-.281 1.189.597 2.159 1.775 2.159 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.085.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.402.165-1.495-.698-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.354-.629-2.758-1.379l-.749 2.848c-.269 1.045-1.004 2.352-1.498 3.146 1.123.345 2.306.535 3.55.535 6.607 0 11.985-5.365 11.985-11.987C23.97 5.39 18.592.026 11.985.026z\",\r\n tiktok:\r\n \"M19.59 6.69a4.83 4.83 0 01-3.77-4.245V2h-3.45v13.672a2.896 2.896 0 01-5.201 1.743 2.895 2.895 0 012.31-4.629 2.89 2.89 0 01.878.14V9.4a6.84 6.84 0 00-1-.05A6.33 6.33 0 005 20.1a6.34 6.34 0 0010.86-4.43v-7.36a8.16 8.16 0 004.77 1.52v-3.4a4.85 4.85 0 01-1-.1z\",\r\n snapchat:\r\n \"M12 0C5.373 0 0 5.372 0 12c0 4.991 3.657 9.128 8.438 9.879-.118-.949-.227-2.422.045-3.461.222-.95 1.444-6.037 1.444-6.037s-.367-.744-.367-1.844c0-1.726.999-3.012 2.243-3.012 1.058 0 1.569.795 1.569 1.748 0 1.065-.679 2.653-1.029 4.13-.292 1.237.618 2.246 1.835 2.246 2.203 0 3.895-2.323 3.895-5.67 0-2.965-2.129-5.038-5.167-5.038-3.52 0-5.585 2.643-5.585 5.589 0 1.106.425 2.295.956 2.943a.77.77 0 01.194.569c-.21.997-.679 3.135-.769 3.568-.121.588-.402.712-.929.431-3.485-1.624-5.667-6.731-5.667-10.839C2.5 6.506 6.847 2.344 12.001 2.344c4.391 0 7.809 2.776 7.809 6.586 0 4.308-2.694 7.635-6.369 7.635-1.271 0-2.464-.677-2.871-1.475 0 0-.669 2.562-.828 3.193-.301 1.301-1.12 2.929-1.668 3.922.125.047.256.07.395.07 1 0 1.826-.827 2.13-1.856.169-.617.982-3.857.982-3.857z\",\r\n github:\r\n \"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\",\r\n discord:\r\n \"M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z\",\r\n};\r\n\r\nfunction iconFillForNetwork(network) {\r\n return network === \"snapchat\" ? \"#000000\" : \"#ffffff\";\r\n}\r\n\r\nfunction glyphPath(network) {\r\n return GLYPHS[network] || null;\r\n}\r\n\r\n/** Inline SVG string for exported email HTML (Gmail-friendly) */\r\nexport function socialIconSvgString(network, pixelSize) {\r\n const d = glyphPath(network);\r\n const fill = iconFillForNetwork(network);\r\n const s = Math.max(8, Math.round(pixelSize));\r\n if (!d) {\r\n const letter = (network && network[0] ? network[0] : \"?\").toUpperCase();\r\n return `<span style=\"font-size:${Math.floor(s * 0.44)}px;font-weight:800;line-height:1;\">${letter}</span>`;\r\n }\r\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"${s}\" height=\"${s}\" style=\"display:block;flex-shrink:0;\" aria-hidden=\"true\"><path fill=\"${fill}\" d=\"${d}\"/></svg>`;\r\n}\r\n\r\nexport function SocialGlyph({ network, size }) {\r\n const d = glyphPath(network);\r\n const s = Math.max(8, Math.round(size));\r\n if (!d) {\r\n return (\r\n <span style={{ fontSize: Math.floor(s * 0.44), fontWeight: 800, lineHeight: 1 }}>\r\n {(network && network[0] ? network[0] : \"?\").toUpperCase()}\r\n </span>\r\n );\r\n }\r\n return (\r\n <svg\r\n width={s}\r\n height={s}\r\n viewBox=\"0 0 24 24\"\r\n style={{ display: \"block\", flexShrink: 0 }}\r\n aria-hidden\r\n >\r\n <path fill=\"currentColor\" d={d} />\r\n </svg>\r\n );\r\n}\r\n","import type { CSSProperties } from \"react\";\r\n\r\n/** Parsed gradient object from editor JSON */\r\nexport type GradientSpec = {\r\n angle?: number;\r\n colors?: unknown[];\r\n stops?: unknown[];\r\n};\r\n\r\nexport function linearGradientCssInner(g: unknown): string {\r\n if (!g || typeof g !== \"object\" || Array.isArray(g)) return \"\";\r\n const o = g as GradientSpec;\r\n if (!Array.isArray(o.colors) || !Array.isArray(o.stops)) return \"\";\r\n if (o.colors.length < 2 || o.stops.length !== o.colors.length) return \"\";\r\n const angle = typeof o.angle === \"number\" ? o.angle : 135;\r\n const pairs = o.colors\r\n .map((c, i) => [String(c ?? \"\").trim(), Number(o.stops![i])] as const)\r\n .filter(([c, s]) => c && Number.isFinite(s))\r\n .map(([c, s]) => `${c} ${Math.max(0, Math.min(100, s))}%`);\r\n if (pairs.length < 2) return \"\";\r\n return `linear-gradient(${angle}deg, ${pairs.join(\", \")})`;\r\n}\r\n\r\nexport type SurfaceBgProps = {\r\n bgColor?: string;\r\n bgImage?: string;\r\n bgSize?: string;\r\n bgRepeat?: string;\r\n bgPosition?: string;\r\n bgGradient?: unknown;\r\n};\r\n\r\nexport function backgroundLayerStyle(p: SurfaceBgProps): CSSProperties {\r\n const pos =\r\n typeof p.bgPosition === \"string\" && p.bgPosition.trim()\r\n ? p.bgPosition.trim()\r\n : \"center\";\r\n const gradInner = linearGradientCssInner(p.bgGradient);\r\n if (gradInner) {\r\n return {\r\n backgroundColor:\r\n p.bgColor && String(p.bgColor).trim() ? p.bgColor : \"transparent\",\r\n backgroundImage: gradInner,\r\n backgroundRepeat: \"no-repeat\",\r\n backgroundPosition: pos,\r\n backgroundSize: \"cover\",\r\n };\r\n }\r\n const img = String(p.bgImage ?? \"\").trim();\r\n if (img) {\r\n return {\r\n backgroundColor:\r\n p.bgColor && String(p.bgColor).trim() ? p.bgColor : \"transparent\",\r\n backgroundImage: `url(${img})`,\r\n backgroundSize: p.bgSize || \"cover\",\r\n backgroundRepeat: p.bgRepeat || \"no-repeat\",\r\n backgroundPosition: pos,\r\n };\r\n }\r\n if (p.bgColor && String(p.bgColor).trim()) {\r\n return { backgroundColor: p.bgColor };\r\n }\r\n return {};\r\n}\r\n\r\n/** Inline CSS fragment for email HTML `style=\"\"` (no leading/trailing semicolons required). */\r\nexport function emailSurfaceBgCss(p: SurfaceBgProps): string {\r\n const pos =\r\n typeof p.bgPosition === \"string\" && p.bgPosition.trim()\r\n ? p.bgPosition.trim()\r\n : \"center\";\r\n const gradInner = linearGradientCssInner(p.bgGradient);\r\n if (gradInner) {\r\n const bc =\r\n p.bgColor && String(p.bgColor).trim()\r\n ? `background-color:${p.bgColor};`\r\n : \"\";\r\n return `${bc}background-image:${gradInner};background-repeat:no-repeat;background-position:${pos};background-size:cover;`;\r\n }\r\n const img = String(p.bgImage ?? \"\").trim();\r\n if (img) {\r\n const bc =\r\n p.bgColor && String(p.bgColor).trim()\r\n ? `background-color:${p.bgColor};`\r\n : \"\";\r\n return `${bc}background-image:url(${img});background-size:${p.bgSize || \"cover\"};background-repeat:${p.bgRepeat || \"no-repeat\"};background-position:${pos};`;\r\n }\r\n if (p.bgColor && String(p.bgColor).trim())\r\n return `background-color:${p.bgColor};`;\r\n return \"\";\r\n}\r\n\r\nexport type BackdropBgProps = {\r\n backdropColor?: string;\r\n backdropImage?: string;\r\n backdropSize?: string;\r\n backdropRepeat?: string;\r\n backdropPosition?: string;\r\n backdropGradient?: unknown;\r\n};\r\n\r\nexport function backdropLayerStyle(p: BackdropBgProps): CSSProperties {\r\n return backgroundLayerStyle({\r\n bgColor: p.backdropColor,\r\n bgImage: p.backdropImage,\r\n bgSize: p.backdropSize,\r\n bgRepeat: p.backdropRepeat,\r\n bgPosition: p.backdropPosition,\r\n bgGradient: p.backdropGradient,\r\n });\r\n}\r\n\r\nexport function emailBackdropBgCss(p: BackdropBgProps): string {\r\n return emailSurfaceBgCss({\r\n bgColor: p.backdropColor,\r\n bgImage: p.backdropImage,\r\n bgSize: p.backdropSize,\r\n bgRepeat: p.backdropRepeat,\r\n bgPosition: p.backdropPosition,\r\n bgGradient: p.backdropGradient,\r\n });\r\n}\r\n","import { imageLinkActive } from \"../defaultBlockProps\";\r\nimport { enhanceRichHtmlForEmail, RICH_HTML_CONTENT_CSS } from \"./htmlUtils\";\r\nimport { getColumnPropsAt, getColumns } from \"./columnProps\";\r\nimport { socialIconSvgString } from \"../socialIcons\";\r\nimport { SC } from \"../constants\";\r\nimport { escHtmlAttr, escHtml, utf8ToBase64, videoUrlToEmbedSrc } from \"./htmlUtils\";\r\nimport { emailBackdropBgCss, emailSurfaceBgCss } from \"./blockBackground\";\r\n\r\nfunction blockToHtml(cb) {\r\n const p = cb.props;\r\n const numOr = (n: unknown, fallback: number) => (typeof n === \"number\" && Number.isFinite(n) ? n : fallback);\r\n const boxPx = (m: any) => {\r\n const top = numOr(m?.top, 0);\r\n const right = numOr(m?.right, top);\r\n const bottom = numOr(m?.bottom, top);\r\n const left = numOr(m?.left, right);\r\n return `${top}px ${right}px ${bottom}px ${left}px`;\r\n };\r\n /** Padding is always px (UI forces px; keep backward compatibility with number). */\r\n const pd = (v: unknown) =>\r\n v && typeof v === \"object\" && !Array.isArray(v) ? `padding:${boxPx(v)}` : `padding:${numOr(v, 0)}px`;\r\n const lenPx = (v: unknown) => `${numOr(v, 0)}px`;\r\n const lh = (v: unknown, u?: unknown) => {\r\n // Always unitless in export (email clients expect unitless line-height for text).\r\n return String(numOr(v, 1.65));\r\n };\r\n const box = (m: any, u?: unknown) => {\r\n const top = numOr(m?.top, 0);\r\n const right = numOr(m?.right, top);\r\n const bottom = numOr(m?.bottom, top);\r\n const left = numOr(m?.left, right);\r\n return `${top}px ${right}px ${bottom}px ${left}px`;\r\n };\r\n const marginCss = () => `margin:${box(p.margin)};`;\r\n const radiusPx = (r: any) => {\r\n if (typeof r === \"number\") return `${numOr(r, 0)}px`;\r\n if (r && typeof r === \"object\" && !Array.isArray(r)) {\r\n const tl = numOr(r.tl, 0);\r\n const tr = numOr(r.tr, tl);\r\n const br = numOr(r.br, tl);\r\n const bl = numOr(r.bl, tr);\r\n return `${tl}px ${tr}px ${br}px ${bl}px`;\r\n }\r\n return \"0px\";\r\n };\r\n switch (cb.type) {\r\n case \"heading\": {\r\n const shell = emailSurfaceBgCss(p);\r\n const tag = p.level || \"h2\";\r\n const typo = `font-size:${lenPx(p.fontSize)};color:${p.color};text-align:${p.align};font-weight:${p.fontWeight ?? (p.bold ? 700 : 400)};letter-spacing:${lenPx(p.letterSpacing)};line-height:${lh(p.lineHeight)};font-family:${p.fontFamily || \"Georgia,serif\"}`;\r\n if (shell) {\r\n return `<div style=\"${pd(p.padding)};${marginCss()}${shell}\"><${tag} style=\"margin:0;${typo}\">${p.content}</${tag}></div>`;\r\n }\r\n return `<${tag} style=\"${pd(p.padding)};${typo};${marginCss()}\">${p.content}</${tag}>`;\r\n }\r\n case \"text\": {\r\n const shell = emailSurfaceBgCss(p);\r\n const inner = `font-size:${lenPx(p.fontSize)};color:${p.color};text-align:${p.align};font-weight:${p.fontWeight || 400};font-style:${p.italic ? \"italic\" : \"normal\"};text-decoration:${p.underline ? \"underline\" : \"none\"};line-height:${lh(p.lineHeight)};letter-spacing:${lenPx(p.letterSpacing)};font-family:${p.fontFamily || \"Georgia,serif\"}`;\r\n const content = typeof p.content === \"string\" ? p.content : \"\";\r\n const body = /^\\s*<[^>]+>/.test(content)\r\n ? content\r\n : escHtml(content).replace(/\\r?\\n/g, \"<br/>\");\r\n return `<div style=\"${pd(p.padding)};${marginCss()}${shell}\"><div style=\"${inner}\">${body}</div></div>`;\r\n }\r\n case \"html\": {\r\n const shell = emailSurfaceBgCss(p);\r\n const inner = `font-size:${lenPx(p.fontSize)};color:${p.color};text-align:${p.align};line-height:${lh(p.lineHeight)};letter-spacing:${lenPx(p.letterSpacing)};font-family:${p.fontFamily || \"Georgia,serif\"}`;\r\n const bodyRaw =\r\n typeof (cb as { content?: unknown }).content === \"string\"\r\n ? (cb as { content: string }).content\r\n : typeof p.content === \"string\"\r\n ? p.content\r\n : \"\";\r\n const body = enhanceRichHtmlForEmail(bodyRaw || \"\");\r\n return `<div style=\"${pd(p.padding)};${marginCss()}${shell}\"><div class=\"email-rich-html-inner\" style=\"${inner}\">${body}</div></div>`;\r\n }\r\n case \"image\": {\r\n const of = typeof p.objectFit === \"string\" && p.objectFit.trim() ? p.objectFit.trim() : \"cover\";\r\n const op = typeof p.objectPosition === \"string\" && p.objectPosition.trim() ? p.objectPosition.trim() : \"center\";\r\n const img = `<img src=\"${p.src}\" alt=\"${p.alt || \"\"}\" style=\"max-width:${p.width};width:${p.width || \"100%\"};display:inline-block;border-radius:${radiusPx(p.borderRadius)};object-fit:${of};object-position:${op};\"/>`;\r\n const shell = emailSurfaceBgCss(p);\r\n return `<div style=\"${pd(p.padding)};text-align:${p.align};${marginCss()}${shell}\">${imageLinkActive(p) ? `<a href=\"${escHtmlAttr(p.link)}\" target=\"${escHtmlAttr(p.linkTarget || \"_blank\")}\">${img}</a>` : img}</div>`;\r\n }\r\n case \"button\": {\r\n const bd = emailBackdropBgCss(p);\r\n return `<div class=\"email-btn-wrap\" style=\"${pd(p.padding)};text-align:${p.fullWidth ? \"center\" : p.align};${marginCss()}${bd}\"><a class=\"email-btn-cta\" href=\"${escHtmlAttr(p.href)}\" target=\"${escHtmlAttr(p.linkTarget || \"_blank\")}\" style=\"display:${p.fullWidth ? \"block\" : \"inline-block\"};background:${p.bgColor};color:${p.textColor};border-radius:${radiusPx(p.borderRadius)};padding:${p.paddingV || 11}px ${p.paddingH || 24}px;text-decoration:none;font-size:${lenPx(p.fontSize)};font-weight:${p.fontWeight || 600};font-family:sans-serif;border:${p.borderWidth || 0}px solid ${p.borderColor || \"transparent\"};${p.fullWidth ? \"width:100%;text-align:center;box-sizing:border-box;\" : \"\"}\">${escHtml(p.label)}</a></div>`;\r\n }\r\n case \"link\": {\r\n const dec = p.underline ? \"underline\" : \"none\";\r\n const fw = p.fontWeight ?? (p.bold ? 700 : 400);\r\n const shell = emailSurfaceBgCss(p);\r\n return `<div style=\"${pd(p.padding)};text-align:${p.align};${marginCss()}${shell}\"><a href=\"${escHtmlAttr(p.href)}\" target=\"${escHtmlAttr(p.linkTarget || \"_blank\")}\" rel=\"noopener noreferrer\" style=\"color:${p.color};font-size:${lenPx(p.fontSize)};font-weight:${fw};text-decoration:${dec};font-family:${p.fontFamily || \"Arial, Helvetica, sans-serif\"};\">${escHtml(p.label)}</a></div>`;\r\n }\r\n case \"divider\": {\r\n const shell = emailSurfaceBgCss(p);\r\n return `<div style=\"${pd(p.padding)};${marginCss()}${shell}\"><hr style=\"border:none;border-top:${p.thickness}px ${p.style || \"solid\"} ${p.color};margin:0;\"/></div>`;\r\n }\r\n case \"spacer\": {\r\n const shell = emailSurfaceBgCss(p);\r\n return `<div style=\"height:${p.height}px;line-height:${p.height}px;${pd(p.padding)};${marginCss()}${shell}\"> </div>`;\r\n }\r\n case \"social\": {\r\n const urls = p.socialUrls || {};\r\n const shell = emailSurfaceBgCss(p);\r\n return `<div class=\"email-social-row\" style=\"${pd(p.padding)};text-align:${p.align};${marginCss()}${shell}\">${(p.networks || []).map(n => {\r\n const raw = urls[n] && String(urls[n]).trim();\r\n const href = escHtmlAttr(raw || \"#\");\r\n const glyphPx = Math.round((p.iconSize || 24) * 0.56);\r\n const svg = socialIconSvgString(n, glyphPx);\r\n const tag = `<span style=\"display:inline-flex;align-items:center;justify-content:center;width:${p.iconSize}px;height:${p.iconSize}px;border-radius:${p.shape === \"square\" ? \"4px\" : \"50%\"};background:${SC[n] || \"#64748b\"};color:${n === \"snapchat\" ? \"#000\" : \"#fff\"};margin:0 ${p.gap || 4}px;text-decoration:none;\">${svg}</span>`;\r\n return raw ? `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"display:inline-flex;text-decoration:none;\">${tag}</a>` : tag;\r\n }).join(\"\")}</div>`;\r\n }\r\n case \"video\": {\r\n const embedSrc = videoUrlToEmbedSrc(p.src);\r\n const shell = emailSurfaceBgCss(p);\r\n return `<div style=\"${pd(p.padding)};text-align:center;${marginCss()}${shell}\"><iframe src=\"${embedSrc}\" width=\"100%\" height=\"${p.height}\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen style=\"max-width:100%;border-radius:5px;display:block;\"></iframe></div>`;\r\n }\r\n case \"menu\": {\r\n const shell = emailSurfaceBgCss(p);\r\n return `<nav class=\"email-nav-menu\" style=\"${pd(p.padding)};text-align:${p.align};${marginCss()}${shell}\">${(p.items || []).map(item => `<a href=\"${item.href}\" style=\"font-size:${lenPx(p.fontSize)};color:${p.color};margin:0 ${p.gap || 10}px;text-decoration:none;font-family:sans-serif;font-weight:600;\">${item.label}</a>`).join(\"\")}</nav>`;\r\n }\r\n case \"timer\": {\r\n const end = new Date(p.endDate).getTime(), now = Date.now(), diff = Math.max(0, end - now);\r\n const d = Math.floor(diff / 86400000), h = Math.floor((diff % 86400000) / 3600000), m = Math.floor((diff % 3600000) / 60000), s = Math.floor((diff % 60000) / 1000);\r\n const cell = (val, lbl) => `<td align=\"center\" style=\"background:${p.bgColor};color:${p.textColor};border-radius:${radiusPx(p.borderRadius)};padding:8px 14px;font-family:monospace;font-weight:700;font-size:20px;min-width:52px;text-align:center;\"><div>${String(val).padStart(2, \"0\")}</div>${p.showLabels ? `<div style=\"font-size:9px;opacity:.75;letter-spacing:.08em;margin-top:3px;\">${lbl}</div>` : \"\"}</td>`;\r\n const bd = emailBackdropBgCss(p);\r\n return `<div class=\"email-timer-wrap\" style=\"${pd(p.padding)};text-align:${p.align};${marginCss()}${bd}\">${p.label ? `<div style=\"font-size:12px;color:#64748b;margin-bottom:6px;font-family:sans-serif;\">${p.label}</div>` : \"\"}<table cellpadding=\"0\" cellspacing=\"6\" style=\"display:inline-table;max-width:100%;\"><tr>${cell(d, \"DAYS\")}${cell(h, \"HRS\")}${cell(m, \"MIN\")}${cell(s, \"SEC\")}</tr></table></div>`;\r\n }\r\n case \"table\": {\r\n const rows2 = p.data || [];\r\n const role = p.tableRole === \"presentation\" ? \"presentation\" : \"table\";\r\n const cellPaddingCss = (() => {\r\n const cp = p.cellPadding;\r\n if (cp && typeof cp === \"object\" && !Array.isArray(cp)) {\r\n return `padding:${boxPx(cp)}`;\r\n }\r\n const cellPadPx =\r\n typeof cp === \"number\" && Number.isFinite(cp)\r\n ? cp\r\n : typeof p.padding === \"number\" && Number.isFinite(p.padding)\r\n ? p.padding\r\n : numOr((p.padding as { top?: number })?.top, 8);\r\n return `padding:${cellPadPx}px`;\r\n })();\r\n const rowsHtml = rows2.map((row, ri) => {\r\n const isHeaderRow = !!p.header && ri === 0;\r\n const isStriped =\r\n p.striped &&\r\n (p.header ? ri > 1 && ri % 2 === 0 : ri > 0 && ri % 2 === 1);\r\n const cells = row\r\n .map((cell) => {\r\n const tag = isHeaderRow ? \"th\" : \"td\";\r\n const scope = isHeaderRow ? \" scope=\\\"col\\\"\" : \"\";\r\n const bg = isHeaderRow\r\n ? p.headerBg || \"#1a5fbe\"\r\n : isStriped\r\n ? p.stripedBg || \"#f4f8ff\"\r\n : p.cellBg || \"#ffffff\";\r\n const color = isHeaderRow ? p.headerColor || \"#ffffff\" : \"inherit\";\r\n const fw = isHeaderRow ? 700 : 400;\r\n return `<${tag}${scope} style=\"${cellPaddingCss};border:1px solid ${p.cellBorder || \"#d0dff0\"};background:${bg};color:${color};font-weight:${fw};font-size:${p.fontSize || 13}px;font-family:${p.fontFamily || \"sans-serif\"};text-align:left;word-break:break-word;\">${cell}</${tag}>`;\r\n })\r\n .join(\"\");\r\n return `<tr>${cells}</tr>`;\r\n }).join(\"\");\r\n const shell = emailSurfaceBgCss(p);\r\n return `<div style=\"${pd(p.padding)};overflow:auto;${marginCss()}${shell}\"><table role=\"${escHtmlAttr(role)}\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse:collapse;\">${rowsHtml}</table></div>`;\r\n }\r\n case \"layout\": {\r\n const pseudo = {\r\n id: \"\",\r\n type: \"layout\",\r\n cols: p.cols,\r\n ratios: p.ratios || [1],\r\n gap: p.gap ?? 12,\r\n padding: p.padding ?? 8,\r\n bgColor: p.bgColor || \"\",\r\n bgImage: p.bgImage || \"\",\r\n bgSize: p.bgSize || \"cover\",\r\n bgRepeat: p.bgRepeat || \"no-repeat\",\r\n bgPosition: typeof p.bgPosition === \"string\" ? p.bgPosition : \"center\",\r\n bgGradient: p.bgGradient ?? null,\r\n columns: getColumns(p),\r\n cells: p.cells || [],\r\n };\r\n return rowToHtml(pseudo);\r\n }\r\n default: return \"\";\r\n }\r\n}\r\nfunction rowToHtml(row) {\r\n const numOr = (v: unknown, fb: number) => (typeof v === \"number\" && Number.isFinite(v) ? v : fb);\r\n const shellBg = emailSurfaceBgCss(row);\r\n /** Multi-column layout row = horizontal flex (matches editor canvas). */\r\n const inner =\r\n row.cells.length === 1\r\n ? row.cells[0].map(blockToHtml).join(\"\")\r\n : `<div class=\"email-row-flex\" style=\"display:flex;flex-direction:row;flex-wrap:nowrap;align-items:flex-start;gap:${row.gap ?? 12}px;width:100%;max-width:100%;box-sizing:border-box;\">${row.cells\r\n .map((cell, i) => {\r\n const r = row.ratios[i] ?? 1;\r\n const cs = getColumnPropsAt(row, i);\r\n const colShell = emailSurfaceBgCss(cs);\r\n const pad =\r\n cs.padding && typeof cs.padding === \"object\" && !Array.isArray(cs.padding)\r\n ? `padding:${(() => {\r\n const o = cs.padding as Record<string, number>;\r\n const t = numOr(o.top, 0);\r\n const rgt = numOr(o.right, t);\r\n const b = numOr(o.bottom, t);\r\n const l = numOr(o.left, rgt);\r\n return `${t}px ${rgt}px ${b}px ${l}px`;\r\n })()};`\r\n : typeof cs.padding === \"number\" && Number.isFinite(cs.padding)\r\n ? `padding:${cs.padding}px;`\r\n : \"\";\r\n const rad =\r\n cs.borderRadius && typeof cs.borderRadius === \"object\" && !Array.isArray(cs.borderRadius)\r\n ? (() => {\r\n const x = cs.borderRadius as Record<string, number>;\r\n const tl = numOr(x.tl, 0);\r\n const tr = numOr(x.tr, tl);\r\n const br = numOr(x.br, tl);\r\n const bl = numOr(x.bl, tr);\r\n return `border-radius:${tl}px ${tr}px ${br}px ${bl}px;`;\r\n })()\r\n : typeof cs.borderRadius === \"number\" && Number.isFinite(cs.borderRadius)\r\n ? `border-radius:${cs.borderRadius}px;`\r\n : \"\";\r\n return `<div style=\"flex:${r} 1 0;min-width:0;box-sizing:border-box;${pad}${rad}${colShell}\">${cell.map(blockToHtml).join(\"\")}</div>`;\r\n })\r\n .join(\"\")}</div>`;\r\n const innerTrim = inner.replace(/>\\s+</g, \"><\").trim();\r\n /** Keep the row shell in HTML even when all columns/blocks are empty (email clients may still show padding/bg). */\r\n const body = innerTrim || \" \";\r\n return `<div class=\"email-row-shell\" style=\"padding:${row.padding}px;width:100%;max-width:100%;box-sizing:border-box;${shellBg}\">${body}</div>`;\r\n}\r\n\r\n/** Options passed to {@link designToHtml} and {@link jsonToHtml} (from `emailDesignJson`). */\r\nexport type EmailHtmlOptions = {\r\n /** Injected as a `<style>` block in the document `<head>`. */\r\n customCSS?: string;\r\n};\r\n\r\n/**\r\n * Full email HTML document: outer shell uses tables for width/centering; each layout row uses flex for columns.\r\n * {@code opts.customCSS} injects a {@code <style>} block in the head.\r\n */\r\n/** Injected so narrow viewports stack columns, shrink tables, and avoid horizontal scroll. */\r\nconst RESPONSIVE_EMAIL_CSS = `<style>\r\nhtml{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}\r\nbody{margin:0!important;padding:0;overflow-x:hidden;word-break:break-word;overflow-wrap:anywhere;-webkit-font-smoothing:antialiased;}\r\nimg,video,iframe{max-width:100%!important;height:auto!important;}\r\ntable{max-width:100%!important;}\r\ntable[role=\"presentation\"]{width:100%!important;}\r\ntable.email-shell-table{table-layout:fixed!important;}\r\ntable[role=\"presentation\"] td{min-width:0!important;word-break:break-word;}\r\n.email-row-shell{width:100%!important;max-width:100%!important;box-sizing:border-box!important;}\r\n@media screen and (max-width:600px){\r\n .email-row-flex{flex-wrap:wrap!important;align-items:stretch!important;}\r\n .email-row-flex>div{flex:1 1 100%!important;max-width:100%!important;min-width:0!important;width:100%!important;}\r\n .email-content-td{padding-left:max(12px,env(safe-area-inset-left))!important;padding-right:max(12px,env(safe-area-inset-right))!important;}\r\n .email-btn-cta{max-width:100%!important;box-sizing:border-box!important;}\r\n .email-nav-menu{display:flex!important;flex-direction:column!important;align-items:stretch!important;gap:10px!important;}\r\n .email-nav-menu a{display:block!important;margin:0!important;padding:6px 0!important;}\r\n .email-social-row a,.email-social-row span{margin:6px!important;}\r\n .email-timer-wrap table{display:block!important;width:100%!important;max-width:100%!important;}\r\n .email-timer-wrap tr{display:flex!important;flex-wrap:wrap!important;justify-content:center!important;gap:6px!important;}\r\n .email-timer-wrap td{display:inline-block!important;flex:0 0 auto!important;min-width:0!important;}\r\n}\r\n@media screen and (max-width:480px){\r\n .email-content-td{padding-left:max(10px,env(safe-area-inset-left))!important;padding-right:max(10px,env(safe-area-inset-right))!important;}\r\n}\r\n${RICH_HTML_CONTENT_CSS}\r\n</style>`;\r\n\r\n/**\r\n * Adjust email HTML for a preview iframe with a known CSS width so layout viewport\r\n * matches the iframe (fixes mobile/tablet where `width=device-width` stays too wide).\r\n */\r\nexport function previewEmailSrcDoc(html: string, viewportWidthPx: number): string {\r\n const viewportTag = `<meta name=\"viewport\" content=\"width=${viewportWidthPx},initial-scale=1\"/>`;\r\n let out = /<meta[^>]*\\bname\\s*=\\s*[\"']viewport[\"'][^>]*>/i.test(html)\r\n ? html.replace(/<meta[^>]*\\bname\\s*=\\s*[\"']viewport[\"'][^>]*>/i, viewportTag)\r\n : html.replace(/<head[^>]*>/i, (open) => `${open}${viewportTag}`);\r\n\r\n const previewFix = `<style data-email-preview-iframe=\"1\">\r\nhtml,body{overflow-x:hidden!important;max-width:100%!important;}\r\nhtml{height:100%;overflow-y:auto;-webkit-overflow-scrolling:touch;}\r\nbody{min-height:100%;overflow-y:auto!important;-webkit-overflow-scrolling:touch;}\r\ntable.email-shell-table{overflow:visible!important;}\r\n</style>`;\r\n if (/<\\/head>/i.test(out)) {\r\n out = out.replace(/<\\/head>/i, `${previewFix}</head>`);\r\n }\r\n return out;\r\n}\r\n\r\nexport function designToHtml(rows: any, settings: any, opts: EmailHtmlOptions = {}) {\r\n const css = opts.customCSS ? `<style>${opts.customCSS}</style>` : \"\";\r\n const cw = settings.contentWidth || 600;\r\n const contentBg = settings.contentBg || \"#fff\";\r\n const bgImgRaw =\r\n typeof settings.contentBgImage === \"string\" ? String(settings.contentBgImage).trim() : \"\";\r\n const contentShellStyle = [\r\n \"width:100%\",\r\n `max-width:${cw}px`,\r\n `background-color:${contentBg}`,\r\n `border-radius:${settings.borderRadius || 8}px`,\r\n \"overflow:hidden\",\r\n \"box-sizing:border-box\",\r\n ];\r\n if (bgImgRaw) {\r\n const u = bgImgRaw.replace(/'/g, \"%27\");\r\n const sz = typeof settings.contentBgSize === \"string\" && settings.contentBgSize.trim() ? settings.contentBgSize.trim() : \"cover\";\r\n const rep =\r\n typeof settings.contentBgRepeat === \"string\" && settings.contentBgRepeat.trim()\r\n ? settings.contentBgRepeat.trim()\r\n : \"no-repeat\";\r\n contentShellStyle.push(`background-image:url('${u}')`);\r\n contentShellStyle.push(`background-size:${sz}`);\r\n contentShellStyle.push(`background-position:${typeof settings.contentBgPosition === \"string\" && settings.contentBgPosition.trim() ? settings.contentBgPosition.trim() : \"center\"}`);\r\n contentShellStyle.push(`background-repeat:${rep}`);\r\n }\r\n\r\n const pagePos = typeof settings.bgPosition === \"string\" && settings.bgPosition.trim() ? settings.bgPosition.trim() : \"center\";\r\n const pageGrad = settings.bgGradient && typeof settings.bgGradient === \"object\" ? settings.bgGradient : null;\r\n const pageGradCss = (() => {\r\n if (!pageGrad || typeof pageGrad !== \"object\") return \"\";\r\n if (!Array.isArray((pageGrad as any).colors) || !Array.isArray((pageGrad as any).stops)) return \"\";\r\n const colors = (pageGrad as any).colors as any[];\r\n const stops = (pageGrad as any).stops as any[];\r\n if (colors.length < 2 || stops.length !== colors.length) return \"\";\r\n const angle = typeof (pageGrad as any).angle === \"number\" ? (pageGrad as any).angle : 135;\r\n const pairs = colors\r\n .map((c, i) => [String(c || \"\").trim(), Number(stops[i])] as const)\r\n .filter(([c, s]) => c && Number.isFinite(s))\r\n .map(([c, s]) => `${c} ${Math.max(0, Math.min(100, s))}%`);\r\n if (pairs.length < 2) return \"\";\r\n return `background-image:linear-gradient(${angle}deg, ${pairs.join(\", \")});background-repeat:no-repeat;background-position:${pagePos};background-size:cover;`;\r\n })();\r\n const pageBgImgRaw = typeof settings.bgImage === \"string\" ? String(settings.bgImage).trim() : \"\";\r\n const pageBgColorRaw = typeof settings.bgColor === \"string\" ? String(settings.bgColor).trim() : \"\";\r\n const pageBgColor = pageBgColorRaw ? pageBgColorRaw : \"transparent\";\r\n const pageBgImgCss =\r\n !pageGradCss && pageBgImgRaw\r\n ? `background-image:url('${pageBgImgRaw.replace(/'/g, \"%27\")}');background-size:${settings.bgSize || \"cover\"};background-repeat:${settings.bgRepeat || \"no-repeat\"};background-position:${pagePos};`\r\n : \"\";\r\n const contentPos =\r\n typeof settings.contentBgPosition === \"string\" && settings.contentBgPosition.trim()\r\n ? settings.contentBgPosition.trim()\r\n : \"center\";\r\n const contentGrad = settings.contentBgGradient && typeof settings.contentBgGradient === \"object\" ? settings.contentBgGradient : null;\r\n const contentGradCss = (() => {\r\n if (!contentGrad || typeof contentGrad !== \"object\") return \"\";\r\n if (!Array.isArray((contentGrad as any).colors) || !Array.isArray((contentGrad as any).stops)) return \"\";\r\n const colors = (contentGrad as any).colors as any[];\r\n const stops = (contentGrad as any).stops as any[];\r\n if (colors.length < 2 || stops.length !== colors.length) return \"\";\r\n const angle = typeof (contentGrad as any).angle === \"number\" ? (contentGrad as any).angle : 135;\r\n const pairs = colors\r\n .map((c, i) => [String(c || \"\").trim(), Number(stops[i])] as const)\r\n .filter(([c, s]) => c && Number.isFinite(s))\r\n .map(([c, s]) => `${c} ${Math.max(0, Math.min(100, s))}%`);\r\n if (pairs.length < 2) return \"\";\r\n return `background-image:linear-gradient(${angle}deg, ${pairs.join(\", \")});background-repeat:no-repeat;background-position:${contentPos};background-size:cover;`;\r\n })();\r\n\r\n if (contentGradCss) {\r\n contentShellStyle.push(contentGradCss);\r\n }\r\n\r\n return `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head><meta charset=\"UTF-8\"/><meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\"/>\r\n<title>Email</title>${RESPONSIVE_EMAIL_CSS}${css}\r\n</head>\r\n<body style=\"margin:0;padding:0;background:${pageBgColor};${pageGradCss || pageBgImgCss}\">\r\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" style=\"width:100%;max-width:100%;background-color:${pageBgColor};${pageGradCss || pageBgImgCss}\">\r\n<tr><td align=\"center\" style=\"padding:0;max-width:100%;\">\r\n<table class=\"email-shell-table\" role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\"\r\n style=\"${contentShellStyle.join(\";\")}\">\r\n<tr><td class=\"email-content-td\" style=\"${[\r\n `padding:${settings.padding || 24}px`,\r\n settings.pageFontFamily && `font-family:${settings.pageFontFamily}`,\r\n settings.pageTextColor && `color:${settings.pageTextColor}`,\r\n settings.pageFontSize && `font-size:${settings.pageFontSize}`,\r\n settings.pageFontWeight && `font-weight:${settings.pageFontWeight}`,\r\n settings.pageLineHeight && `line-height:${settings.pageLineHeight}`,\r\n ]\r\n .filter(Boolean)\r\n .join(\";\")}\">${rows.map(rowToHtml).filter(Boolean).join(\"\\n\")}</td></tr>\r\n</table></td></tr></table>\r\n</body></html>`;\r\n}\r\n","import { uid } from \"../lib/factories\";\r\n\r\nexport type Padding = {\r\n top?: number;\r\n right?: number;\r\n bottom?: number;\r\n left?: number;\r\n};\r\n\r\nexport type EmailDocumentSettings = {\r\n width?: number;\r\n backgroundColor?: string;\r\n backgroundImage?: string;\r\n backgroundRepeat?: string;\r\n backgroundSize?: string;\r\n backgroundPosition?: string;\r\n /** 3-stop linear gradient (editor-specific extension). */\r\n backgroundGradient?: {\r\n angle?: number;\r\n colors?: [string, string, string];\r\n stops?: [number, number, number];\r\n };\r\n contentBackgroundColor?: string;\r\n contentBackgroundImage?: string;\r\n contentBackgroundRepeat?: string;\r\n contentBackgroundSize?: string;\r\n contentBackgroundPosition?: string;\r\n /** 3-stop linear gradient (editor-specific extension). */\r\n contentBackgroundGradient?: {\r\n angle?: number;\r\n colors?: [string, string, string];\r\n stops?: [number, number, number];\r\n };\r\n fontFamily?: string;\r\n lineHeightBase?: number;\r\n color?: string;\r\n responsive?: boolean;\r\n rtl?: boolean;\r\n /** Content card inner padding (editor `settings.padding`). */\r\n contentPadding?: number;\r\n /** Content card corner radius (editor `settings.borderRadius`). */\r\n contentBorderRadius?: number;\r\n /** Studio snapshot for round-trip with the visual editor (settings + editor chrome). */\r\n _reactEmailStudio?: {\r\n contentPadding?: number;\r\n contentBorderRadius?: number;\r\n editorSettings?: Record<string, unknown>;\r\n };\r\n};\r\n\r\nexport type RowLayout = {\r\n columns?: number;\r\n gap?: number;\r\n stackOnMobile?: boolean;\r\n align?: \"left\" | \"center\" | \"right\";\r\n /** Editor layout preset key (e.g. `layout2`, `custom`) — optional on `email_document` rows. */\r\n preset?: string;\r\n /** Column width ratios; length should match `columns`. */\r\n ratios?: number[];\r\n};\r\n\r\n/** Row shell on `email_document` (editor field names). */\r\nexport type RowProps = {\r\n bgColor?: string;\r\n bgImage?: string;\r\n bgRepeat?: string;\r\n bgSize?: string;\r\n bgPosition?: string;\r\n bgGradient?: {\r\n angle?: number;\r\n colors?: [string, string, string];\r\n stops?: [number, number, number];\r\n } | null;\r\n padding?: Padding;\r\n borderRadius?: number;\r\n borderWidth?: number;\r\n borderColor?: string;\r\n textAlign?: \"left\" | \"center\" | \"right\" | \"justify\";\r\n};\r\n\r\n/** Legacy row shell (`backgroundColor`, …) — import only. */\r\nexport type RowStyles = {\r\n backgroundColor?: string;\r\n backgroundImage?: string;\r\n backgroundRepeat?: string;\r\n backgroundSize?: string;\r\n backgroundPosition?: string;\r\n backgroundGradient?: RowProps[\"bgGradient\"];\r\n padding?: Padding;\r\n borderRadius?: number;\r\n borderWidth?: number;\r\n borderColor?: string;\r\n textAlign?: \"left\" | \"center\" | \"right\" | \"justify\";\r\n};\r\n\r\nexport type ColumnLayout = {\r\n width?: string;\r\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\r\n mobileWidth?: string;\r\n};\r\n\r\nexport type ColumnBorderRadius =\r\n | number\r\n | {\r\n tl?: number;\r\n tr?: number;\r\n br?: number;\r\n bl?: number;\r\n };\r\n\r\n/** Column shell on `email_document` (editor field names). */\r\nexport type ColumnProps = {\r\n padding?: Padding;\r\n bgColor?: string;\r\n bgImage?: string;\r\n bgRepeat?: string;\r\n bgSize?: string;\r\n bgPosition?: string;\r\n bgGradient?: RowProps[\"bgGradient\"];\r\n borderRadius?: ColumnBorderRadius;\r\n};\r\n\r\n/** Legacy column shell — import only. */\r\nexport type ColumnStyles = {\r\n padding?: Padding;\r\n backgroundColor?: string;\r\n backgroundImage?: string;\r\n backgroundRepeat?: string;\r\n backgroundSize?: string;\r\n backgroundPosition?: string;\r\n backgroundGradient?: RowProps[\"bgGradient\"];\r\n borderRadius?: ColumnBorderRadius;\r\n};\r\n\r\nexport type BlockBase = {\r\n id?: string;\r\n type: string;\r\n /** Payload: object for most blocks; plain HTML string for `type: \"html\"`. */\r\n content?: Record<string, unknown> | string;\r\n /** Full editor block props (export + preferred import). */\r\n props?: Record<string, unknown>;\r\n /** Legacy block styling — import only when `props` is absent. */\r\n styles?: Record<string, unknown>;\r\n behavior?: Record<string, unknown>;\r\n responsive?: Record<string, unknown>;\r\n};\r\n\r\nexport type EmailDocumentColumn = {\r\n id?: string;\r\n layout?: ColumnLayout;\r\n /** Column surface (padding, backgrounds, radius). */\r\n props?: ColumnProps;\r\n /** Legacy column shell — import only. */\r\n styles?: ColumnStyles;\r\n blocks?: BlockBase[];\r\n};\r\n\r\nexport type EmailDocumentRow = {\r\n id?: string;\r\n type?: \"row\";\r\n layout?: RowLayout;\r\n /** Row shell (padding, backgrounds). */\r\n props?: RowProps;\r\n /** Legacy row shell — import only. */\r\n styles?: RowStyles;\r\n columns?: EmailDocumentColumn[];\r\n /** Editor row snapshot (`preset`, `ratios`, column props, …) for round-trip. */\r\n _reactEmailStudio?: {\r\n row?: Record<string, unknown>;\r\n };\r\n};\r\n\r\nexport type EmailDocument = {\r\n type: \"email_document\";\r\n settings?: EmailDocumentSettings;\r\n /** Flat root blocks (optional interchange; `rows` is the primary LMS/export shape). */\r\n blocks?: BlockBase[];\r\n /** Layout rows with `columns[].blocks[]` (primary import/export shape). */\r\n rows?: EmailDocumentRow[];\r\n globalStyles?: Record<string, unknown>;\r\n responsive?: Record<string, unknown>;\r\n};\r\n\r\nexport function normalizePadding(p?: unknown): Required<Padding> | undefined {\r\n if (!p || typeof p !== \"object\" || Array.isArray(p)) return undefined;\r\n const o = p as Padding;\r\n const top = typeof o.top === \"number\" ? o.top : 0;\r\n const right = typeof o.right === \"number\" ? o.right : top;\r\n const bottom = typeof o.bottom === \"number\" ? o.bottom : top;\r\n const left = typeof o.left === \"number\" ? o.left : right;\r\n return { top, right, bottom, left };\r\n}\r\n\r\nexport function paddingToUniform(p?: Padding, fallback = 0): number {\r\n const n = normalizePadding(p);\r\n if (!n) return fallback;\r\n return Math.round((n.top + n.right + n.bottom + n.left) / 4);\r\n}\r\n\r\nexport function ensureId(id: unknown, prefix: string): string {\r\n return typeof id === \"string\" && id.trim() ? id : `${prefix}_${uid()}`;\r\n}\r\n\r\nfunction normalizeDocBlock(b: unknown, prefix: string): BlockBase {\r\n const raw = b && typeof b === \"object\" && !Array.isArray(b) ? (b as BlockBase) : ({} as BlockBase);\r\n const base: BlockBase = {\r\n id: ensureId(raw.id, prefix),\r\n type: typeof raw.type === \"string\" ? raw.type : \"text\",\r\n content:\r\n typeof raw.content === \"string\"\r\n ? raw.content\r\n : raw.content && typeof raw.content === \"object\" && !Array.isArray(raw.content)\r\n ? raw.content\r\n : {},\r\n ...(raw.behavior && typeof raw.behavior === \"object\" && !Array.isArray(raw.behavior)\r\n ? { behavior: raw.behavior }\r\n : {}),\r\n ...(raw.responsive && typeof raw.responsive === \"object\" && !Array.isArray(raw.responsive)\r\n ? { responsive: raw.responsive }\r\n : {}),\r\n };\r\n if (raw.props && typeof raw.props === \"object\" && !Array.isArray(raw.props)) {\r\n base.props = { ...raw.props };\r\n } else if (raw.styles && typeof raw.styles === \"object\" && !Array.isArray(raw.styles)) {\r\n base.styles = { ...raw.styles };\r\n }\r\n return base;\r\n}\r\n\r\nfunction normalizeDocSettings(settings: unknown): EmailDocumentSettings {\r\n if (!settings || typeof settings !== \"object\" || Array.isArray(settings)) return {};\r\n const s = { ...(settings as EmailDocumentSettings) };\r\n delete (s as { _reactEmailStudio?: unknown })._reactEmailStudio;\r\n return s;\r\n}\r\n\r\nexport function normalizeEmailDocument(input: unknown): EmailDocument | null {\r\n if (input == null || typeof input !== \"object\" || Array.isArray(input)) return null;\r\n const doc = input as Partial<EmailDocument>;\r\n if (doc.type !== \"email_document\") return null;\r\n\r\n const rawBlocks = Array.isArray(doc.blocks) ? doc.blocks : [];\r\n const useBlocks = rawBlocks.length > 0;\r\n const rows = Array.isArray(doc.rows) ? doc.rows : [];\r\n\r\n const base: EmailDocument = {\r\n type: \"email_document\",\r\n settings: normalizeDocSettings(doc.settings),\r\n globalStyles:\r\n doc.globalStyles && typeof doc.globalStyles === \"object\" && !Array.isArray(doc.globalStyles)\r\n ? doc.globalStyles\r\n : undefined,\r\n responsive:\r\n doc.responsive && typeof doc.responsive === \"object\" && !Array.isArray(doc.responsive)\r\n ? doc.responsive\r\n : undefined,\r\n };\r\n\r\n if (useBlocks) {\r\n return {\r\n ...base,\r\n blocks: rawBlocks.map((b, bi) => normalizeDocBlock(b, `block${bi + 1}`)),\r\n };\r\n }\r\n\r\n return {\r\n ...base,\r\n rows: rows.map((r, ri) => {\r\n const columns = Array.isArray(r.columns) ? r.columns : [];\r\n const layoutColCount =\r\n typeof r.layout?.columns === \"number\" && r.layout.columns > 0\r\n ? Math.floor(r.layout.columns)\r\n : 0;\r\n const colCount = Math.max(1, columns.length, layoutColCount);\r\n const colsNormalized: EmailDocumentColumn[] = (() => {\r\n if (columns.length >= colCount) return columns;\r\n if (columns.length > 0) {\r\n return [\r\n ...columns,\r\n ...Array.from({ length: colCount - columns.length }).map(() => ({} as EmailDocumentColumn)),\r\n ];\r\n }\r\n return Array.from({ length: colCount }).map(() => ({} as EmailDocumentColumn));\r\n })();\r\n\r\n return {\r\n id: ensureId(r.id, `row${ri + 1}`),\r\n type: \"row\",\r\n layout: {\r\n columns: colCount,\r\n gap: typeof r.layout?.gap === \"number\" ? r.layout.gap : 0,\r\n stackOnMobile: r.layout?.stackOnMobile !== false,\r\n align: (r.layout?.align as any) || \"center\",\r\n ...(typeof r.layout?.preset === \"string\" && r.layout.preset.trim()\r\n ? { preset: r.layout.preset.trim() }\r\n : {}),\r\n ...(Array.isArray(r.layout?.ratios) && r.layout.ratios.length\r\n ? {\r\n ratios: r.layout.ratios.filter(\r\n (x) => typeof x === \"number\" && Number.isFinite(x),\r\n ) as number[],\r\n }\r\n : {}),\r\n },\r\n props: (() => {\r\n const p = r.props;\r\n if (p && typeof p === \"object\" && !Array.isArray(p)) return { ...p };\r\n const s = r.styles;\r\n if (s && typeof s === \"object\" && !Array.isArray(s)) {\r\n return {\r\n bgColor: typeof s.backgroundColor === \"string\" ? s.backgroundColor : \"\",\r\n bgImage: typeof s.backgroundImage === \"string\" ? s.backgroundImage : \"\",\r\n bgRepeat: s.backgroundRepeat || \"no-repeat\",\r\n bgSize: s.backgroundSize || \"cover\",\r\n bgPosition: s.backgroundPosition || \"center\",\r\n bgGradient: s.backgroundGradient ?? null,\r\n padding: s.padding,\r\n borderRadius: s.borderRadius,\r\n borderWidth: s.borderWidth,\r\n borderColor: s.borderColor,\r\n textAlign: s.textAlign,\r\n };\r\n }\r\n return {};\r\n })(),\r\n columns: colsNormalized.map((c, ci) => ({\r\n id: ensureId(c.id, `col${ri + 1}_${ci + 1}`),\r\n layout: (c.layout && typeof c.layout === \"object\" && !Array.isArray(c.layout)) ? c.layout : {},\r\n ...((): { props?: ColumnProps } => {\r\n const p = c.props;\r\n if (p && typeof p === \"object\" && !Array.isArray(p)) return { props: { ...p } };\r\n const s = c.styles;\r\n if (s && typeof s === \"object\" && !Array.isArray(s)) {\r\n return {\r\n props: {\r\n bgColor: typeof s.backgroundColor === \"string\" ? s.backgroundColor : \"\",\r\n bgImage: typeof s.backgroundImage === \"string\" ? s.backgroundImage : \"\",\r\n bgRepeat: s.backgroundRepeat || \"no-repeat\",\r\n bgSize: s.backgroundSize || \"cover\",\r\n bgPosition: s.backgroundPosition || \"center\",\r\n bgGradient: s.backgroundGradient ?? null,\r\n padding: s.padding,\r\n borderRadius: s.borderRadius,\r\n },\r\n };\r\n }\r\n return {};\r\n })(),\r\n blocks: Array.isArray(c.blocks)\r\n ? c.blocks.map((b, bi) => {\r\n const base: BlockBase = {\r\n id: ensureId(b?.id, `b${ri + 1}_${ci + 1}_${bi + 1}`),\r\n type: typeof b?.type === \"string\" ? b.type : \"text\",\r\n content:\r\n typeof b?.content === \"string\"\r\n ? b.content\r\n : b?.content && typeof b.content === \"object\" && !Array.isArray(b.content)\r\n ? b.content\r\n : {},\r\n ...(b?.behavior && typeof b.behavior === \"object\" && !Array.isArray(b.behavior)\r\n ? { behavior: b.behavior }\r\n : {}),\r\n ...(b?.responsive && typeof b.responsive === \"object\" && !Array.isArray(b.responsive)\r\n ? { responsive: b.responsive }\r\n : {}),\r\n };\r\n if (b?.props && typeof b.props === \"object\" && !Array.isArray(b.props)) {\r\n base.props = { ...b.props };\r\n } else if (b?.styles && typeof b.styles === \"object\" && !Array.isArray(b.styles)) {\r\n base.styles = { ...b.styles };\r\n }\r\n return base;\r\n })\r\n : [],\r\n })),\r\n };\r\n }),\r\n };\r\n}\r\n\r\n","import { uid, makeLayoutRow, makeContentBlock } from \"./factories\";\r\nimport {\r\n columnsFromLegacyMap,\r\n DEFAULT_COLUMN_PROPS,\r\n getColumns,\r\n type ColumnEntry,\r\n} from \"./columnProps\";\r\nimport { designToHtml, type EmailHtmlOptions } from \"./emailHtml\";\r\nimport { LAYOUT_PRESETS, pickPresetByColCount } from \"../constants\";\r\nimport { DEFAULT_BLOCK_PROPS, isKnownBlockType, type BlockPropKey } from \"../defaultBlockProps\";\r\nimport { normalizeRichHtmlForStorage } from \"./htmlUtils\";\r\nimport {\r\n normalizeEmailDocument,\r\n normalizePadding,\r\n paddingToUniform,\r\n type EmailDocument,\r\n type EmailDocumentSettings,\r\n type EmailDocumentRow,\r\n type EmailDocumentColumn,\r\n type BlockBase,\r\n type RowProps,\r\n type RowStyles,\r\n type ColumnProps,\r\n} from \"../schema/emailDocument\";\r\n\r\n/** Guard pathological or over-deep `layout` trees in JSON (stack safety). */\r\nconst MAX_LAYOUT_TREE_DEPTH = 32;\r\n\r\nfunction cloneJson<T>(v: T): T {\r\n try {\r\n return JSON.parse(JSON.stringify(v)) as T;\r\n } catch {\r\n return v;\r\n }\r\n}\r\n\r\nfunction legacyRowStylesToProps(s: RowStyles | undefined): RowProps {\r\n if (!s || typeof s !== \"object\" || Array.isArray(s)) return {};\r\n return {\r\n bgColor: typeof s.backgroundColor === \"string\" ? s.backgroundColor : \"\",\r\n bgImage: typeof s.backgroundImage === \"string\" ? s.backgroundImage : \"\",\r\n bgRepeat: s.backgroundRepeat || \"no-repeat\",\r\n bgSize: s.backgroundSize || \"cover\",\r\n bgPosition: s.backgroundPosition || \"center\",\r\n bgGradient: s.backgroundGradient ?? null,\r\n padding: s.padding,\r\n borderRadius: s.borderRadius,\r\n borderWidth: s.borderWidth,\r\n borderColor: s.borderColor,\r\n textAlign: s.textAlign,\r\n };\r\n}\r\n\r\nfunction rowPropsFromDocRow(r: EmailDocumentRow): RowProps {\r\n const p = r.props;\r\n if (p && typeof p === \"object\" && !Array.isArray(p)) {\r\n return { ...p };\r\n }\r\n return legacyRowStylesToProps(r.styles);\r\n}\r\n\r\nfunction applyRowPropsToEditorRow(row: Record<string, unknown>, r: EmailDocumentRow) {\r\n const p = rowPropsFromDocRow(r);\r\n if (p.padding !== undefined && p.padding !== null) {\r\n row.padding = paddingToUniform(p.padding, row.padding as number);\r\n }\r\n if (typeof p.bgColor === \"string\") row.bgColor = p.bgColor.trim();\r\n if (typeof p.bgImage === \"string\") row.bgImage = p.bgImage.trim();\r\n if (typeof p.bgRepeat === \"string\") row.bgRepeat = p.bgRepeat;\r\n if (typeof p.bgSize === \"string\") row.bgSize = p.bgSize;\r\n if (typeof p.bgPosition === \"string\") row.bgPosition = p.bgPosition;\r\n if (p.bgGradient !== undefined) row.bgGradient = p.bgGradient;\r\n}\r\n\r\nfunction editorRowToDocProps(r: Record<string, unknown>): RowProps {\r\n const rowPad =\r\n r.padding && typeof r.padding === \"object\" && !Array.isArray(r.padding)\r\n ? layoutColumnPaddingForDoc(r.padding)\r\n : (() => {\r\n const n = typeof r.padding === \"number\" && Number.isFinite(r.padding) ? r.padding : 0;\r\n return { top: n, right: n, bottom: n, left: n };\r\n })();\r\n return {\r\n bgColor: typeof r.bgColor === \"string\" ? r.bgColor : \"\",\r\n bgImage: typeof r.bgImage === \"string\" ? r.bgImage : \"\",\r\n bgRepeat: (r.bgRepeat as string) || \"no-repeat\",\r\n bgSize: (r.bgSize as string) || \"cover\",\r\n bgPosition: (r.bgPosition as string) || \"center\",\r\n bgGradient: (r.bgGradient as RowProps[\"bgGradient\"]) ?? null,\r\n padding: rowPad,\r\n borderRadius: 0,\r\n borderWidth: 0,\r\n borderColor: \"#e5e7eb\",\r\n textAlign: \"left\",\r\n };\r\n}\r\n\r\n/** Column padding for exported JSON (same shape as block padding). */\r\nfunction layoutColumnPaddingForDoc(p: unknown): { top: number; right: number; bottom: number; left: number } {\r\n if (typeof p === \"number\" && Number.isFinite(p)) {\r\n const n = Math.max(0, p);\r\n return { top: n, right: n, bottom: n, left: n };\r\n }\r\n return normalizePadding(p as any) ?? { top: 0, right: 0, bottom: 0, left: 0 };\r\n}\r\n\r\n/** Column border radius for exported JSON (scalar or per-corner). */\r\nfunction layoutColumnBorderRadiusForDoc(r: unknown): number | { tl: number; tr: number; br: number; bl: number } {\r\n if (typeof r === \"number\" && Number.isFinite(r)) return Math.max(0, r);\r\n if (r && typeof r === \"object\" && !Array.isArray(r)) {\r\n const o = r as Record<string, number>;\r\n const tl = typeof o.tl === \"number\" && Number.isFinite(o.tl) ? Math.max(0, o.tl) : 0;\r\n const tr = typeof o.tr === \"number\" && Number.isFinite(o.tr) ? Math.max(0, o.tr) : tl;\r\n const br = typeof o.br === \"number\" && Number.isFinite(o.br) ? Math.max(0, o.br) : tl;\r\n const bl = typeof o.bl === \"number\" && Number.isFinite(o.bl) ? Math.max(0, o.bl) : tr;\r\n return { tl, tr, br, bl };\r\n }\r\n return 0;\r\n}\r\n\r\nfunction normalizeLayoutContainerProps(props: Record<string, unknown>) {\r\n const columns = getColumns(props as Parameters<typeof getColumns>[0]);\r\n const { columnStyles: _drop, ...rest } = props;\r\n return { ...rest, columns };\r\n}\r\n\r\nfunction cloneColumns(cols: ColumnEntry[]): ColumnEntry[] {\r\n try {\r\n return JSON.parse(JSON.stringify(cols)) as ColumnEntry[];\r\n } catch {\r\n return cols;\r\n }\r\n}\r\n\r\nfunction mergeLayoutColumns(fromContent: unknown, fromHydrated: unknown): ColumnEntry[] | undefined {\r\n const norm = (x: unknown): ColumnEntry[] => {\r\n if (Array.isArray(x)) {\r\n return x.map((entry) => {\r\n const e = entry as { props?: Record<string, unknown> };\r\n const raw = e?.props && typeof e.props === \"object\" ? e.props : (entry as Record<string, unknown>);\r\n return { props: { ...DEFAULT_COLUMN_PROPS, ...raw } as ColumnEntry[\"props\"] };\r\n });\r\n }\r\n if (x && typeof x === \"object\" && !Array.isArray(x)) {\r\n return columnsFromLegacyMap(x, Object.keys(x as object).length);\r\n }\r\n return [];\r\n };\r\n const a = norm(fromContent);\r\n const b = norm(fromHydrated);\r\n const len = Math.max(a.length, b.length, 1);\r\n const out: ColumnEntry[] = [];\r\n for (let i = 0; i < len; i++) {\r\n out.push({\r\n props: { ...DEFAULT_COLUMN_PROPS, ...(a[i]?.props ?? {}), ...(b[i]?.props ?? {}) },\r\n });\r\n }\r\n return out.length ? out : undefined;\r\n}\r\n\r\nfunction columnPropsFromDocColumn(c: EmailDocumentColumn | undefined) {\r\n const p = c?.props;\r\n if (p && typeof p === \"object\" && !Array.isArray(p)) {\r\n return { ...DEFAULT_COLUMN_PROPS, ...p } as ColumnEntry[\"props\"];\r\n }\r\n const s = c?.styles;\r\n if (!s || typeof s !== \"object\" || Array.isArray(s)) {\r\n return { ...DEFAULT_COLUMN_PROPS };\r\n }\r\n const padding = layoutColumnPaddingForDoc(s.padding);\r\n const borderRadius = layoutColumnBorderRadiusForDoc(s.borderRadius);\r\n return {\r\n ...DEFAULT_COLUMN_PROPS,\r\n bgColor: typeof s.backgroundColor === \"string\" ? s.backgroundColor : \"\",\r\n bgImage: typeof (s as { backgroundImage?: string }).backgroundImage === \"string\"\r\n ? String((s as { backgroundImage?: string }).backgroundImage).trim()\r\n : \"\",\r\n bgRepeat: (s as { backgroundRepeat?: string }).backgroundRepeat || \"no-repeat\",\r\n bgSize: (s as { backgroundSize?: string }).backgroundSize || \"cover\",\r\n bgPosition: (s as { backgroundPosition?: string }).backgroundPosition || \"center\",\r\n bgGradient: (s as { backgroundGradient?: unknown }).backgroundGradient ?? null,\r\n padding,\r\n borderRadius,\r\n } as ColumnEntry[\"props\"];\r\n}\r\n\r\nfunction asNum(v: unknown): number | undefined {\r\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined;\r\n}\r\n\r\nfunction asStr(v: unknown): string | undefined {\r\n return typeof v === \"string\" ? v : undefined;\r\n}\r\n\r\nfunction numOr(v: unknown, fb: number) {\r\n return typeof v === \"number\" && Number.isFinite(v) ? v : fb;\r\n}\r\n\r\n/** Uniform fallback from default padding (number or box). */\r\nfunction uniformPadDefault(defPad: unknown): number {\r\n if (typeof defPad === \"number\" && Number.isFinite(defPad)) return Math.max(0, defPad);\r\n if (defPad && typeof defPad === \"object\" && !Array.isArray(defPad)) {\r\n return Math.max(0, numOr((defPad as { top?: number }).top, 0));\r\n }\r\n return 0;\r\n}\r\n\r\nfunction boxPad(v: unknown, uniformFallback: number) {\r\n if (typeof v === \"number\" && Number.isFinite(v)) {\r\n const n = Math.max(0, v);\r\n return { top: n, right: n, bottom: n, left: n };\r\n }\r\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\r\n const o = v as Record<string, unknown>;\r\n const t = numOr(o.top, uniformFallback);\r\n const r = numOr(o.right, t);\r\n const b = numOr(o.bottom, t);\r\n const l = numOr(o.left, r);\r\n return { top: t, right: r, bottom: b, left: l };\r\n }\r\n return { top: uniformFallback, right: uniformFallback, bottom: uniformFallback, left: uniformFallback };\r\n}\r\n\r\nfunction boxMargin(v: unknown) {\r\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\r\n const o = v as Record<string, unknown>;\r\n const t = numOr(o.top, 0);\r\n const r = numOr(o.right, t);\r\n const b = numOr(o.bottom, t);\r\n const l = numOr(o.left, r);\r\n return { top: t, right: r, bottom: b, left: l };\r\n }\r\n return { top: 0, right: 0, bottom: 0, left: 0 };\r\n}\r\n\r\n/** Coerce legacy numeric padding + ensure margin object for all content blocks (not nested `layout`). */\r\nfunction normalizeBoxStyles(props: any, t: BlockPropKey) {\r\n if (t === \"layout\") return;\r\n const def = DEFAULT_BLOCK_PROPS[t] as any;\r\n props.margin = boxMargin(props.margin ?? def?.margin);\r\n\r\n if (t === \"table\") {\r\n const defPad = uniformPadDefault(def?.padding);\r\n const defCellRaw = (def as { cellPadding?: unknown })?.cellPadding;\r\n const defCellUniform =\r\n typeof defCellRaw === \"number\" && Number.isFinite(defCellRaw)\r\n ? defCellRaw\r\n : uniformPadDefault(defCellRaw ?? 10);\r\n props.cellPadding = boxPad(props.cellPadding, defCellUniform);\r\n props.padding = boxPad(props.padding, defPad);\r\n return;\r\n }\r\n\r\n props.padding = boxPad(props.padding, uniformPadDefault(def?.padding));\r\n}\r\n\r\n/** Editor block → `email_document` block (matches fields read by {@link mapBlockToInternal}). */\r\nfunction internalBlockToEmailDoc(b: any, depth = 0): BlockBase {\r\n const p = b?.props && typeof b.props === \"object\" ? b.props : {};\r\n const id = typeof b?.id === \"string\" ? b.id : uid();\r\n const type = b?.type === \"nestedRow\" ? \"layout\" : b?.type;\r\n if (!isKnownBlockType(type)) {\r\n return { id, type: String(type || \"text\"), content: {}, styles: {} };\r\n }\r\n\r\n switch (type) {\r\n case \"heading\": {\r\n const fw =\r\n typeof p.fontWeight === \"number\"\r\n ? p.fontWeight\r\n : typeof p.fontWeight === \"string\"\r\n ? Number.parseInt(String(p.fontWeight), 10) || (p.bold ? 700 : 400)\r\n : p.bold\r\n ? 700\r\n : 400;\r\n const padUniform =\r\n typeof p.padding === \"number\" && Number.isFinite(p.padding)\r\n ? p.padding\r\n : uniformPadDefault(p.padding);\r\n return {\r\n id,\r\n type,\r\n content: { text: typeof p.content === \"string\" ? p.content : \"\", tag: p.level || \"h2\" },\r\n styles: {\r\n fontSize: p.fontSize,\r\n fontWeight: fw,\r\n color: p.color,\r\n lineHeight: p.lineHeight,\r\n textAlign: p.align,\r\n letterSpacing: p.letterSpacing,\r\n marginBottom: padUniform,\r\n },\r\n };\r\n }\r\n case \"text\":\r\n return {\r\n id,\r\n type,\r\n content: { html: typeof p.content === \"string\" ? p.content : \"\" },\r\n styles: {\r\n fontSize: p.fontSize,\r\n color: p.color,\r\n lineHeight: p.lineHeight,\r\n textAlign: p.align,\r\n ...(p.padding && typeof p.padding === \"object\" && !Array.isArray(p.padding)\r\n ? { padding: layoutColumnPaddingForDoc(p.padding) }\r\n : {}),\r\n },\r\n };\r\n case \"html\": {\r\n const body =\r\n typeof b.content === \"string\"\r\n ? b.content\r\n : typeof p.content === \"string\"\r\n ? p.content\r\n : \"\";\r\n return {\r\n id,\r\n type,\r\n content: { html: normalizeRichHtmlForStorage(body) },\r\n styles:\r\n p.padding && typeof p.padding === \"object\" && !Array.isArray(p.padding)\r\n ? { padding: layoutColumnPaddingForDoc(p.padding) }\r\n : {},\r\n };\r\n }\r\n case \"image\": {\r\n const br = p.borderRadius;\r\n const borderRadius =\r\n typeof br === \"number\" && Number.isFinite(br)\r\n ? br\r\n : br && typeof br === \"object\" && !Array.isArray(br)\r\n ? Math.round(\r\n (numOr((br as { tl?: number }).tl, 0) +\r\n numOr((br as { tr?: number }).tr, numOr((br as { tl?: number }).tl, 0)) +\r\n numOr((br as { br?: number }).br, numOr((br as { tl?: number }).tl, 0)) +\r\n numOr((br as { bl?: number }).bl, numOr((br as { tr?: number }).tr, 0))) /\r\n 4,\r\n )\r\n : 0;\r\n return {\r\n id,\r\n type,\r\n content: {\r\n src: p.src || \"\",\r\n alt: p.alt || \"\",\r\n link: p.link || \"\",\r\n },\r\n styles: {\r\n width: p.width,\r\n align: p.align,\r\n borderRadius,\r\n },\r\n ...(p.linkTarget === \"_blank\" ? { behavior: { openInNewTab: true } } : {}),\r\n };\r\n }\r\n case \"button\": {\r\n let borderRadiusOut: number | undefined;\r\n if (typeof p.borderRadius === \"number\" && Number.isFinite(p.borderRadius)) {\r\n borderRadiusOut = p.borderRadius;\r\n } else if (p.borderRadius && typeof p.borderRadius === \"object\" && !Array.isArray(p.borderRadius)) {\r\n const br = p.borderRadius as Record<string, number>;\r\n const tl = numOr(br.tl, 0);\r\n const tr = numOr(br.tr, tl);\r\n const brc = numOr(br.br, tl);\r\n const bl = numOr(br.bl, tr);\r\n borderRadiusOut =\r\n tl === tr && tr === brc && brc === bl ? tl : Math.round((tl + tr + brc + bl) / 4);\r\n }\r\n return {\r\n id,\r\n type,\r\n content: { text: p.label || \"\", href: p.href || \"#\" },\r\n styles: {\r\n backgroundColor: p.bgColor,\r\n color: p.textColor,\r\n fontSize: p.fontSize,\r\n fontWeight: p.fontWeight,\r\n ...(borderRadiusOut !== undefined ? { borderRadius: borderRadiusOut } : {}),\r\n textAlign: p.align,\r\n padding: {\r\n top: p.paddingV ?? 11,\r\n right: p.paddingH ?? 24,\r\n bottom: p.paddingV ?? 11,\r\n left: p.paddingH ?? 24,\r\n },\r\n },\r\n ...(p.linkTarget === \"_blank\" ? { behavior: { openInNewTab: true } } : {}),\r\n };\r\n }\r\n case \"divider\": {\r\n const padY =\r\n typeof p.padding === \"number\" && Number.isFinite(p.padding)\r\n ? p.padding\r\n : p.padding && typeof p.padding === \"object\" && !Array.isArray(p.padding)\r\n ? numOr((p.padding as { top?: number }).top, 12)\r\n : 12;\r\n return {\r\n id,\r\n type,\r\n content: {},\r\n styles: { color: p.color, thickness: p.thickness, paddingY: padY },\r\n };\r\n }\r\n case \"spacer\":\r\n return { id, type, content: {}, styles: { height: p.height } };\r\n case \"social\": {\r\n const urls = (\r\n p.socialUrls && typeof p.socialUrls === \"object\" && !Array.isArray(p.socialUrls)\r\n ? p.socialUrls\r\n : {}\r\n ) as Record<string, string>;\r\n const networks: Record<string, string> = {};\r\n const ordered =\r\n Array.isArray(p.networks) ? p.networks.filter((n): n is string => typeof n === \"string\" && !!n) : [];\r\n const seen = new Set<string>();\r\n for (const n of ordered) {\r\n const u = urls[n];\r\n networks[n] = typeof u === \"string\" && u.trim() ? u : \"\";\r\n seen.add(n);\r\n }\r\n for (const key of Object.keys(urls)) {\r\n if (seen.has(key)) continue;\r\n const v = urls[key];\r\n if (typeof v === \"string\" && v.trim()) {\r\n networks[key] = v;\r\n seen.add(key);\r\n }\r\n }\r\n const padStyles =\r\n p.padding != null\r\n ? typeof p.padding === \"number\" && Number.isFinite(p.padding)\r\n ? { padding: layoutColumnPaddingForDoc(p.padding) }\r\n : p.padding && typeof p.padding === \"object\" && !Array.isArray(p.padding)\r\n ? { padding: layoutColumnPaddingForDoc(p.padding) }\r\n : {}\r\n : {};\r\n return {\r\n id,\r\n type,\r\n content: { networks },\r\n styles: {\r\n iconSize: p.iconSize,\r\n gap: p.gap,\r\n shape: p.shape,\r\n align: p.align,\r\n ...padStyles,\r\n },\r\n };\r\n }\r\n case \"table\":\r\n return {\r\n id,\r\n type,\r\n content: { data: Array.isArray(p.data) ? p.data : [] },\r\n styles: {\r\n borderColor: p.cellBorder,\r\n cellPadding: p.cellPadding,\r\n headerBg: p.headerBg,\r\n striped: p.striped,\r\n },\r\n };\r\n case \"video\":\r\n return {\r\n id,\r\n type,\r\n content: { url: p.src || \"\" },\r\n styles: { height: p.height },\r\n };\r\n case \"timer\": {\r\n let timerBr: number | undefined;\r\n if (typeof p.borderRadius === \"number\" && Number.isFinite(p.borderRadius)) {\r\n timerBr = p.borderRadius;\r\n } else if (p.borderRadius && typeof p.borderRadius === \"object\" && !Array.isArray(p.borderRadius)) {\r\n const br = p.borderRadius as Record<string, number>;\r\n const tl = numOr(br.tl, 0);\r\n const tr = numOr(br.tr, tl);\r\n const brc = numOr(br.br, tl);\r\n const bl = numOr(br.bl, tr);\r\n timerBr = tl === tr && tr === brc && brc === bl ? tl : Math.round((tl + tr + brc + bl) / 4);\r\n }\r\n return {\r\n id,\r\n type,\r\n content: { endDate: p.endDate || \"\" },\r\n styles: {\r\n backgroundColor: p.bgColor,\r\n color: p.textColor,\r\n padding: typeof p.padding === \"number\" ? p.padding : uniformPadDefault(p.padding),\r\n ...(timerBr !== undefined ? { borderRadius: timerBr } : {}),\r\n textAlign: p.align,\r\n },\r\n };\r\n }\r\n case \"menu\":\r\n return {\r\n id,\r\n type,\r\n content: { items: Array.isArray(p.items) ? p.items : [] },\r\n styles: { fontSize: p.fontSize, color: p.color },\r\n };\r\n case \"link\":\r\n return {\r\n id,\r\n type,\r\n content: { text: p.label || \"\", href: p.href || \"#\" },\r\n styles: { color: p.color, fontSize: p.fontSize, textAlign: p.align },\r\n ...(p.linkTarget === \"_blank\" ? { behavior: { openInNewTab: true } } : {}),\r\n };\r\n case \"layout\": {\r\n const ratios = Array.isArray(p.ratios) ? [...p.ratios] : [1];\r\n const emptyCells = ratios.map(() => [] as BlockBase[]);\r\n const rawCells = Array.isArray(p.cells) ? p.cells : [];\r\n const cellsOut =\r\n depth >= MAX_LAYOUT_TREE_DEPTH\r\n ? emptyCells\r\n : ratios.map((_, i) => {\r\n const col = rawCells[i];\r\n return Array.isArray(col) ? col.map((child) => internalBlockToEmailDoc(child, depth + 1)) : [];\r\n });\r\n return {\r\n id,\r\n type,\r\n content: {\r\n preset: p.preset,\r\n cols: p.cols,\r\n ratios,\r\n gap: p.gap,\r\n padding: p.padding,\r\n bgColor: p.bgColor,\r\n bgImage: p.bgImage,\r\n bgSize: p.bgSize,\r\n bgRepeat: p.bgRepeat,\r\n bgPosition: p.bgPosition,\r\n bgGradient: p.bgGradient ?? null,\r\n columns: getColumns(p).map((col) => ({ props: cloneJson(col.props) })),\r\n cells: cellsOut,\r\n },\r\n styles: {},\r\n };\r\n }\r\n default:\r\n return { id, type, content: {}, styles: {} };\r\n }\r\n}\r\n\r\nfunction mapBlockToInternal(b: BlockBase, layoutDepth = 0) {\r\n const t = b.type;\r\n if (!isKnownBlockType(t)) return null;\r\n const block = makeContentBlock(t);\r\n block.id = typeof b.id === \"string\" ? b.id : uid();\r\n\r\n const c = (b.content || {}) as any;\r\n const s = (b.styles || {}) as any;\r\n const beh = (b.behavior || {}) as any;\r\n\r\n switch (t) {\r\n case \"heading\":\r\n block.props.content = asStr(c.text) ?? block.props.content;\r\n block.props.level = asStr(c.tag) ?? block.props.level;\r\n if (asNum(s.fontSize) != null) block.props.fontSize = s.fontSize;\r\n if (asNum(s.fontWeight) != null) block.props.bold = s.fontWeight >= 600;\r\n if (asStr(s.color)) block.props.color = s.color;\r\n if (asNum(s.lineHeight) != null) block.props.lineHeight = s.lineHeight;\r\n if (asStr(s.textAlign)) block.props.align = s.textAlign;\r\n if (asNum(s.letterSpacing) != null) block.props.letterSpacing = s.letterSpacing;\r\n if (asNum(s.marginBottom) != null) block.props.padding = Math.max(0, Math.round(s.marginBottom));\r\n break;\r\n case \"text\":\r\n block.props.content = asStr(c.html) ?? asStr(c.text) ?? block.props.content;\r\n if (asNum(s.fontSize) != null) block.props.fontSize = s.fontSize;\r\n if (asStr(s.color)) block.props.color = s.color;\r\n if (asNum(s.lineHeight) != null) block.props.lineHeight = s.lineHeight;\r\n if (asStr(s.textAlign)) block.props.align = s.textAlign;\r\n if (s.padding && typeof s.padding === \"object\") {\r\n block.props.padding = paddingToUniform(s.padding as any, block.props.padding);\r\n }\r\n break;\r\n case \"html\": {\r\n const br = b as unknown as { content?: unknown; props?: { content?: unknown } };\r\n const fromDoc = asStr(c.html);\r\n const fromRoot = typeof br.content === \"string\" ? String(br.content) : undefined;\r\n const fromLegacyProps =\r\n br.props && typeof br.props.content === \"string\" ? String(br.props.content) : undefined;\r\n const htmlNorm = normalizeRichHtmlForStorage(fromDoc ?? fromRoot ?? fromLegacyProps ?? \"\");\r\n (block as { content: string }).content = htmlNorm;\r\n (block.props as { content?: string }).content = htmlNorm;\r\n if (s.padding && typeof s.padding === \"object\") {\r\n block.props.padding = paddingToUniform(s.padding as any, block.props.padding);\r\n }\r\n break;\r\n }\r\n case \"image\":\r\n block.props.src = asStr(c.src) ?? block.props.src;\r\n if (asStr(c.alt)) block.props.alt = c.alt;\r\n if (asStr(c.link)) {\r\n block.props.link = c.link;\r\n block.props.linkEnabled = true;\r\n }\r\n if (beh.openInNewTab === true) block.props.linkTarget = \"_blank\";\r\n if (asStr(s.width)) block.props.width = s.width;\r\n if (asStr(s.align)) block.props.align = s.align;\r\n if (asNum(s.borderRadius) != null) block.props.borderRadius = s.borderRadius;\r\n break;\r\n case \"button\":\r\n block.props.label = asStr(c.text) ?? block.props.label;\r\n block.props.href = asStr(c.href) ?? block.props.href;\r\n if (beh.openInNewTab === true) block.props.linkTarget = \"_blank\";\r\n if (asStr(s.backgroundColor)) block.props.bgColor = s.backgroundColor;\r\n if (asStr(s.color)) block.props.textColor = s.color;\r\n if (asNum(s.fontSize) != null) block.props.fontSize = s.fontSize;\r\n if (asNum(s.fontWeight) != null) block.props.fontWeight = s.fontWeight;\r\n if (asNum(s.borderRadius) != null) block.props.borderRadius = s.borderRadius;\r\n if (s.padding && typeof s.padding === \"object\") {\r\n const pad = s.padding as any;\r\n block.props.paddingV = asNum(pad.top) ?? block.props.paddingV;\r\n block.props.paddingH = asNum(pad.right) ?? block.props.paddingH;\r\n }\r\n if (asStr(s.textAlign)) block.props.align = s.textAlign;\r\n break;\r\n case \"divider\":\r\n if (asStr(s.color)) block.props.color = s.color;\r\n if (asNum(s.thickness) != null) block.props.thickness = s.thickness;\r\n if (asNum(s.paddingY) != null) block.props.padding = s.paddingY;\r\n break;\r\n case \"spacer\":\r\n if (asNum(s.height) != null) block.props.height = s.height;\r\n break;\r\n case \"social\": {\r\n const networksRaw = c.networks;\r\n let networksObj: Record<string, string> = {};\r\n\r\n if (Array.isArray(networksRaw)) {\r\n const urlMap =\r\n c.socialUrls && typeof c.socialUrls === \"object\" && !Array.isArray(c.socialUrls)\r\n ? (c.socialUrls as Record<string, unknown>)\r\n : {};\r\n for (const n of networksRaw) {\r\n if (typeof n !== \"string\" || !n) continue;\r\n const u = urlMap[n];\r\n networksObj[n] = typeof u === \"string\" ? u : \"\";\r\n }\r\n for (const key of Object.keys(urlMap)) {\r\n if (key in networksObj) continue;\r\n const u = urlMap[key];\r\n if (typeof u === \"string\" && u.trim()) networksObj[key] = u;\r\n }\r\n } else if (networksRaw && typeof networksRaw === \"object\" && !Array.isArray(networksRaw)) {\r\n networksObj = { ...(networksRaw as Record<string, unknown>) } as Record<string, string>;\r\n for (const k of Object.keys(networksObj)) {\r\n const v = networksObj[k];\r\n networksObj[k] = typeof v === \"string\" ? v : \"\";\r\n }\r\n }\r\n\r\n const keys = Object.keys(networksObj);\r\n if (keys.length) {\r\n block.props.networks = keys;\r\n block.props.socialUrls = networksObj;\r\n }\r\n if (asNum(s.iconSize) != null) block.props.iconSize = s.iconSize;\r\n if (asNum(s.gap) != null) block.props.gap = s.gap;\r\n if (asStr(s.shape)) block.props.shape = s.shape;\r\n if (asStr(s.align)) block.props.align = s.align;\r\n if (s.padding != null) {\r\n if (typeof s.padding === \"number\" && Number.isFinite(s.padding)) {\r\n block.props.padding = s.padding;\r\n } else if (s.padding && typeof s.padding === \"object\" && !Array.isArray(s.padding)) {\r\n block.props.padding = layoutColumnPaddingForDoc(s.padding);\r\n }\r\n }\r\n break;\r\n }\r\n case \"table\":\r\n if (Array.isArray(c.data)) block.props.data = c.data;\r\n if (asStr(s.borderColor)) block.props.cellBorder = s.borderColor;\r\n if (s.cellPadding != null) {\r\n if (typeof s.cellPadding === \"number\" && Number.isFinite(s.cellPadding)) {\r\n block.props.cellPadding = s.cellPadding;\r\n } else if (s.cellPadding && typeof s.cellPadding === \"object\" && !Array.isArray(s.cellPadding)) {\r\n block.props.cellPadding = s.cellPadding as typeof block.props.cellPadding;\r\n }\r\n }\r\n if (asStr(s.headerBg)) block.props.headerBg = s.headerBg;\r\n if (s.striped === true || s.striped === false) block.props.striped = !!s.striped;\r\n break;\r\n case \"video\":\r\n block.props.src = asStr(c.url) ?? block.props.src;\r\n if (asNum(s.height) != null) block.props.height = s.height;\r\n break;\r\n case \"timer\":\r\n block.props.endDate = asStr(c.endDate) ?? block.props.endDate;\r\n if (asStr(s.backgroundColor)) block.props.bgColor = s.backgroundColor;\r\n if (asStr(s.color)) block.props.textColor = s.color;\r\n if (asNum(s.padding) != null) block.props.padding = s.padding;\r\n if (asNum(s.borderRadius) != null) block.props.borderRadius = s.borderRadius;\r\n if (asStr(s.textAlign)) block.props.align = s.textAlign;\r\n break;\r\n case \"menu\":\r\n if (Array.isArray(c.items)) block.props.items = c.items;\r\n if (asNum(s.fontSize) != null) block.props.fontSize = s.fontSize;\r\n if (asStr(s.color)) block.props.color = s.color;\r\n break;\r\n case \"link\":\r\n block.props.label = asStr(c.text) ?? block.props.label;\r\n block.props.href = asStr(c.href) ?? block.props.href;\r\n if (beh.openInNewTab === true) block.props.linkTarget = \"_blank\";\r\n if (asStr(s.color)) block.props.color = s.color;\r\n if (asNum(s.fontSize) != null) block.props.fontSize = s.fontSize;\r\n if (asStr(s.textAlign)) block.props.align = s.textAlign;\r\n break;\r\n case \"layout\": {\r\n if (Array.isArray(c.cells)) {\r\n const d = DEFAULT_BLOCK_PROPS.layout;\r\n block.props.preset = asStr(c.preset) ?? block.props.preset;\r\n if (typeof c.cols === \"number\") block.props.cols = c.cols;\r\n if (Array.isArray(c.ratios)) block.props.ratios = [...c.ratios];\r\n if (typeof c.gap === \"number\") block.props.gap = c.gap;\r\n if (c.padding !== undefined && c.padding !== null) block.props.padding = c.padding;\r\n if (typeof c.bgColor === \"string\") block.props.bgColor = c.bgColor;\r\n if (typeof c.bgImage === \"string\") block.props.bgImage = c.bgImage;\r\n if (typeof c.bgSize === \"string\") block.props.bgSize = c.bgSize;\r\n if (typeof c.bgRepeat === \"string\") block.props.bgRepeat = c.bgRepeat;\r\n if (typeof c.bgPosition === \"string\") block.props.bgPosition = c.bgPosition;\r\n if (c.bgGradient !== undefined) block.props.bgGradient = c.bgGradient;\r\n if (c.bgGradient !== undefined) block.props.bgGradient = c.bgGradient;\r\n if (Array.isArray(c.columns)) {\r\n block.props.columns = c.columns.map((col: { props?: Record<string, unknown> }) => ({\r\n props: {\r\n ...DEFAULT_COLUMN_PROPS,\r\n ...(col?.props && typeof col.props === \"object\" ? col.props : {}),\r\n },\r\n }));\r\n } else if (c.columnStyles && typeof c.columnStyles === \"object\" && !Array.isArray(c.columnStyles)) {\r\n const ratios = Array.isArray(c.ratios) ? c.ratios : [1];\r\n block.props.columns = columnsFromLegacyMap(c.columnStyles, ratios.length);\r\n }\r\n block.props.cells = c.cells.map((col: unknown[]) =>\r\n Array.isArray(col)\r\n ? col.map((raw) => mapEmbeddedLayoutCellBlock(raw, layoutDepth + 1)).filter((x) => x != null)\r\n : [],\r\n );\r\n } else {\r\n block.props.preset = asStr(c.preset) ?? block.props.preset;\r\n }\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n\r\n const styleObj = s && typeof s === \"object\" && !Array.isArray(s) ? s : {};\r\n const hasDocStyles = Object.keys(styleObj).some((k) => {\r\n const v = (styleObj as any)[k];\r\n return v !== undefined && v !== null && v !== \"\";\r\n });\r\n /** Keys in `content` that map from document schema — do not treat as internal props when merging legacy flat `content`. */\r\n const skipContentMergeKeys: Partial<Record<BlockPropKey, Set<string>>> = {\r\n heading: new Set([\"text\", \"tag\"]),\r\n text: new Set([\"html\", \"text\"]),\r\n html: new Set([\"html\"]),\r\n image: new Set([\"src\", \"alt\", \"link\"]),\r\n button: new Set([\"text\", \"href\"]),\r\n link: new Set([\"text\", \"href\"]),\r\n social: new Set([\"networks\", \"socialUrls\"]),\r\n table: new Set([\"data\"]),\r\n menu: new Set([\"items\"]),\r\n video: new Set([\"url\"]),\r\n timer: new Set([\"endDate\"]),\r\n };\r\n if (!hasDocStyles && c && typeof c === \"object\" && t !== \"layout\") {\r\n const known = DEFAULT_BLOCK_PROPS[t as BlockPropKey];\r\n const skip = skipContentMergeKeys[t as BlockPropKey];\r\n if (known && typeof known === \"object\" && !Array.isArray(known)) {\r\n for (const key of Object.keys(known)) {\r\n if (skip?.has(key)) continue;\r\n if (key in c && (c as any)[key] !== undefined) {\r\n (block.props as any)[key] = (c as any)[key];\r\n }\r\n }\r\n }\r\n }\r\n\r\n applyImportedEditorPropsFromDoc(block, t as BlockPropKey, b, layoutDepth);\r\n if (t === \"image\") {\r\n const link = asStr(block.props.link);\r\n if (link && block.props.linkEnabled == null) block.props.linkEnabled = true;\r\n }\r\n return block;\r\n}\r\n\r\nfunction rowToInternal(r: EmailDocumentRow) {\r\n const columns: EmailDocumentColumn[] = Array.isArray(r.columns) ? r.columns : [];\r\n const layoutColCount =\r\n typeof r.layout?.columns === \"number\" && r.layout.columns > 0 ? Math.floor(r.layout.columns) : 0;\r\n const cols = Math.max(1, columns.length, layoutColCount);\r\n const colList: EmailDocumentColumn[] = (() => {\r\n if (columns.length >= cols) return columns;\r\n if (columns.length > 0) {\r\n return [\r\n ...columns,\r\n ...Array.from({ length: cols - columns.length }).map(() => ({} as EmailDocumentColumn)),\r\n ];\r\n }\r\n return Array.from({ length: cols }).map(() => ({} as EmailDocumentColumn));\r\n })();\r\n const preset = pickPresetByColCount(cols) || LAYOUT_PRESETS[0];\r\n const row: any = makeLayoutRow(preset);\r\n row.id = typeof r.id === \"string\" ? r.id : uid();\r\n row.cols = cols;\r\n row.gap = typeof r.layout?.gap === \"number\" ? r.layout.gap : row.gap;\r\n applyRowPropsToEditorRow(row, r);\r\n\r\n const lay = r.layout as Record<string, unknown> | undefined;\r\n if (lay && typeof lay === \"object\" && !Array.isArray(lay)) {\r\n if (typeof lay.preset === \"string\" && lay.preset.trim()) row.preset = lay.preset.trim();\r\n if (Array.isArray(lay.ratios) && lay.ratios.length) {\r\n const rr = lay.ratios.filter((x) => typeof x === \"number\" && Number.isFinite(x)) as number[];\r\n if (rr.length) row.ratios = rr;\r\n }\r\n }\r\n\r\n row.cells = colList.map((c) => {\r\n const blocks = Array.isArray(c.blocks) ? c.blocks : [];\r\n return blocks.map((blk) => mapBlockToInternal(blk, 0)).filter((x) => x != null);\r\n });\r\n\r\n const studio = (r as any)._reactEmailStudio;\r\n const snap = studio?.row;\r\n const columnsFromDoc: ColumnEntry[] = colList.map((c) => ({\r\n props: columnPropsFromDocColumn(c),\r\n }));\r\n\r\n if (snap && typeof snap === \"object\" && !Array.isArray(snap)) {\r\n const {\r\n cells: _omitCells,\r\n columnStyles: legacyCs,\r\n columns: snapCols,\r\n ...rest\r\n } = snap as Record<string, unknown> & { columnStyles?: unknown; columns?: unknown };\r\n Object.assign(row, rest);\r\n const fromSnap = Array.isArray(snapCols)\r\n ? (snapCols as ColumnEntry[]).map((col) => ({\r\n props: {\r\n ...DEFAULT_COLUMN_PROPS,\r\n ...(col?.props && typeof col.props === \"object\" ? col.props : {}),\r\n },\r\n }))\r\n : columnsFromLegacyMap(legacyCs, cols);\r\n row.columns = mergeLayoutColumns(fromSnap, columnsFromDoc) ?? columnsFromDoc;\r\n delete row.columnStyles;\r\n } else {\r\n row.columns = columnsFromDoc;\r\n }\r\n\r\n return row;\r\n}\r\n\r\n/** Coerce fragment / array input into `email_document` before normalize. */\r\nexport function coerceEmailDocumentInput(input: unknown): unknown {\r\n if (input == null) return input;\r\n if (Array.isArray(input)) {\r\n if (input.length === 0) return input;\r\n return { type: \"email_document\", settings: {}, blocks: input };\r\n }\r\n if (typeof input !== \"object\") return input;\r\n const o = input as Record<string, unknown>;\r\n if (o.type === \"email_document\") return input;\r\n if (Array.isArray(o.blocks)) {\r\n return {\r\n type: \"email_document\",\r\n settings: o.settings && typeof o.settings === \"object\" ? o.settings : {},\r\n blocks: o.blocks,\r\n };\r\n }\r\n return input;\r\n}\r\n\r\nfunction rootLayoutBlockToDocRow(block: BlockBase): EmailDocumentRow {\r\n const p = block.props && typeof block.props === \"object\" ? block.props : {};\r\n const c =\r\n block.content && typeof block.content === \"object\" && !Array.isArray(block.content)\r\n ? (block.content as Record<string, unknown>)\r\n : {};\r\n const cols = Math.max(\r\n 1,\r\n typeof p.cols === \"number\" && p.cols > 0 ? Math.floor(p.cols) : 0,\r\n typeof c.cols === \"number\" && c.cols > 0 ? Math.floor(c.cols as number) : 0,\r\n Array.isArray(p.cells) ? p.cells.length : 0,\r\n Array.isArray(c.cells) ? (c.cells as unknown[]).length : 0,\r\n );\r\n const rawCells = Array.isArray(c.cells)\r\n ? (c.cells as unknown[])\r\n : Array.isArray(p.cells)\r\n ? (p.cells as unknown[])\r\n : [];\r\n const contentColumns = Array.isArray(c.columns) ? (c.columns as { props?: ColumnProps }[]) : [];\r\n const propsColumns = getColumns(p as Parameters<typeof getColumns>[0]);\r\n const columns: EmailDocumentColumn[] = Array.from({ length: cols }, (_, ci) => {\r\n const cellRaw = rawCells[ci];\r\n const blocks: BlockBase[] = Array.isArray(cellRaw)\r\n ? cellRaw\r\n .filter((x) => x && typeof x === \"object\")\r\n .map((x, bi) => {\r\n const blk = x as BlockBase;\r\n return {\r\n id: ensureBlockId(blk.id, `b_${ci}_${bi}`),\r\n type: typeof blk.type === \"string\" ? blk.type : \"text\",\r\n content: blk.content,\r\n ...(blk.props ? { props: blk.props } : {}),\r\n ...(blk.styles ? { styles: blk.styles } : {}),\r\n ...(blk.behavior ? { behavior: blk.behavior } : {}),\r\n };\r\n })\r\n : [];\r\n const colProps = {\r\n ...DEFAULT_COLUMN_PROPS,\r\n ...(propsColumns[ci]?.props ?? contentColumns[ci]?.props ?? {}),\r\n } as ColumnProps;\r\n return {\r\n id: `col_${ci + 1}`,\r\n layout: { width: \"100%\", verticalAlign: \"top\" as const, mobileWidth: \"100%\" },\r\n props: cloneJson(colProps) as ColumnProps,\r\n blocks,\r\n };\r\n });\r\n const rowProps: RowProps = {\r\n bgColor: typeof p.bgColor === \"string\" ? p.bgColor : \"\",\r\n bgImage: typeof p.bgImage === \"string\" ? p.bgImage : \"\",\r\n bgRepeat: (p.bgRepeat as string) || \"no-repeat\",\r\n bgSize: (p.bgSize as string) || \"cover\",\r\n bgPosition: (p.bgPosition as string) || \"center\",\r\n bgGradient: (p.bgGradient as RowProps[\"bgGradient\"]) ?? null,\r\n padding:\r\n typeof p.padding === \"number\"\r\n ? { top: p.padding, right: p.padding, bottom: p.padding, left: p.padding }\r\n : normalizePadding(p.padding),\r\n };\r\n const ratios = Array.isArray(p.ratios)\r\n ? (p.ratios as number[])\r\n : Array.isArray(c.ratios)\r\n ? (c.ratios as number[])\r\n : undefined;\r\n return {\r\n id: typeof block.id === \"string\" ? block.id : uid(),\r\n type: \"row\",\r\n layout: {\r\n columns: cols,\r\n gap: typeof p.gap === \"number\" ? p.gap : typeof c.gap === \"number\" ? (c.gap as number) : 0,\r\n stackOnMobile: true,\r\n align: \"center\",\r\n ...(typeof p.preset === \"string\" && p.preset.trim()\r\n ? { preset: p.preset.trim() }\r\n : typeof c.preset === \"string\" && (c.preset as string).trim()\r\n ? { preset: (c.preset as string).trim() }\r\n : {}),\r\n ...(ratios?.length ? { ratios: [...ratios] } : {}),\r\n },\r\n props: rowProps,\r\n columns,\r\n };\r\n}\r\n\r\nfunction ensureBlockId(id: unknown, prefix: string): string {\r\n return typeof id === \"string\" && id.trim() ? id : `${prefix}_${uid()}`;\r\n}\r\n\r\nfunction wrapRootContentBlock(block: BlockBase) {\r\n const row = makeLayoutRow(pickPresetByColCount(1));\r\n const internal = mapBlockToInternal(block, 0);\r\n if (internal) row.cells[0] = [internal];\r\n return row;\r\n}\r\n\r\nfunction rootBlockToEditorRow(block: BlockBase) {\r\n const t = block.type === \"nestedRow\" ? \"layout\" : block.type;\r\n if (t === \"layout\") {\r\n return rowToInternal(rootLayoutBlockToDocRow(block));\r\n }\r\n return wrapRootContentBlock(block);\r\n}\r\n\r\nfunction blocksToEditorRows(blocks: BlockBase[]) {\r\n return blocks.map(rootBlockToEditorRow);\r\n}\r\n\r\nfunction editorRowToRootBlock(row: Record<string, unknown>): BlockBase {\r\n const cellArrays = Array.isArray(row.cells) ? (row.cells as unknown[][]) : [];\r\n const declaredCols = typeof row.cols === \"number\" && row.cols > 0 ? row.cols : 0;\r\n const cols = Math.max(1, cellArrays.length, declaredCols);\r\n const rowColumns = getColumns(row as Parameters<typeof getColumns>[0]);\r\n const ratios =\r\n Array.isArray(row.ratios) && row.ratios.length\r\n ? [...(row.ratios as number[])]\r\n : Array.from({ length: cols }, () => 1);\r\n const layoutBlock = {\r\n id: typeof row.id === \"string\" ? row.id : uid(),\r\n type: \"layout\",\r\n props: {\r\n preset: row.preset,\r\n cols,\r\n ratios,\r\n gap: row.gap ?? 12,\r\n padding: row.padding ?? 8,\r\n bgColor: row.bgColor ?? \"\",\r\n bgImage: row.bgImage ?? \"\",\r\n bgSize: row.bgSize ?? \"cover\",\r\n bgRepeat: row.bgRepeat ?? \"no-repeat\",\r\n bgPosition: row.bgPosition ?? \"center\",\r\n bgGradient: row.bgGradient ?? null,\r\n columns: rowColumns,\r\n cells: cellArrays,\r\n },\r\n };\r\n return exportEmailDocBlock(layoutBlock);\r\n}\r\n\r\nfunction isSingleContentBlockRow(row: Record<string, unknown>): boolean {\r\n const cells = row.cells;\r\n if (!Array.isArray(cells) || cells.length !== 1) return false;\r\n const col = cells[0];\r\n if (!Array.isArray(col) || col.length !== 1) return false;\r\n const b = col[0] as { type?: string } | null;\r\n return !!b && typeof b.type === \"string\" && b.type !== \"layout\" && b.type !== \"nestedRow\";\r\n}\r\n\r\nfunction editorRowsToBlocks(rows: Record<string, unknown>[]) {\r\n const out: BlockBase[] = [];\r\n for (const row of rows) {\r\n if (isSingleContentBlockRow(row)) {\r\n const child = (row.cells as unknown[][])[0][0];\r\n out.push(exportEmailDocBlock(child));\r\n } else {\r\n out.push(editorRowToRootBlock(row));\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nfunction rowPropsToLegacyStyles(p: RowProps): RowStyles {\r\n return {\r\n backgroundColor: p.bgColor ?? \"\",\r\n backgroundImage: p.bgImage ?? \"\",\r\n backgroundRepeat: p.bgRepeat ?? \"no-repeat\",\r\n backgroundSize: p.bgSize ?? \"cover\",\r\n backgroundPosition: p.bgPosition ?? \"center\",\r\n backgroundGradient: p.bgGradient ?? null,\r\n padding: p.padding,\r\n borderRadius: p.borderRadius ?? 0,\r\n borderWidth: p.borderWidth ?? 0,\r\n borderColor: p.borderColor ?? \"#e5e7eb\",\r\n textAlign: p.textAlign ?? \"left\",\r\n };\r\n}\r\n\r\nfunction columnPropsToLegacyStyles(cp: ColumnEntry[\"props\"]) {\r\n return {\r\n padding: layoutColumnPaddingForDoc(cp.padding),\r\n backgroundColor: cp.bgColor ?? \"\",\r\n backgroundImage: cp.bgImage ?? \"\",\r\n backgroundRepeat: cp.bgRepeat ?? \"no-repeat\",\r\n backgroundSize: cp.bgSize ?? \"cover\",\r\n backgroundPosition: cp.bgPosition ?? \"center\",\r\n backgroundGradient: cp.bgGradient ?? null,\r\n borderRadius: layoutColumnBorderRadiusForDoc(cp.borderRadius),\r\n };\r\n}\r\n\r\nfunction editorRowStudioSnapshot(r: Record<string, unknown>) {\r\n const p = editorRowToDocProps(r);\r\n const columns = getColumns(r).map((col) => ({\r\n props: cloneJson(col.props ?? DEFAULT_COLUMN_PROPS),\r\n }));\r\n return {\r\n id: r.id,\r\n type: \"layout\",\r\n preset: r.preset,\r\n cols: r.cols,\r\n ratios: Array.isArray(r.ratios) ? [...(r.ratios as number[])] : [1],\r\n gap: typeof r.gap === \"number\" ? r.gap : 0,\r\n padding: p.padding,\r\n bgColor: p.bgColor ?? \"\",\r\n bgImage: p.bgImage ?? \"\",\r\n bgSize: p.bgSize ?? \"cover\",\r\n bgRepeat: p.bgRepeat ?? \"no-repeat\",\r\n bgPosition: p.bgPosition ?? \"center\",\r\n bgGradient: p.bgGradient ?? null,\r\n columns,\r\n };\r\n}\r\n\r\n/** Block in `rows[].columns[].blocks[]` — `content`, `props`, and optional `behavior` (no block `styles` on export). */\r\nfunction exportBlockForLegacyRow(b: any, depth = 0): BlockBase {\r\n if (!b || typeof b !== \"object\") {\r\n return { id: uid(), type: \"text\", content: {}, props: {} };\r\n }\r\n const rawProps =\r\n b.props && typeof b.props === \"object\" && !Array.isArray(b.props)\r\n ? (cloneJson(b.props) as Record<string, unknown>)\r\n : {};\r\n\r\n if (b.type === \"layout\" && Array.isArray(b.props?.cells)) {\r\n rawProps.cells = (b.props.cells as any[][]).map((col) =>\r\n Array.isArray(col) ? col.map((child) => exportBlockForLegacyRow(child, depth + 1)) : [],\r\n );\r\n }\r\n\r\n if (b.type === \"html\") {\r\n const body =\r\n typeof b.content === \"string\"\r\n ? b.content\r\n : typeof rawProps.content === \"string\"\r\n ? rawProps.content\r\n : \"\";\r\n const html = normalizeRichHtmlForStorage(body);\r\n rawProps.content = html;\r\n return {\r\n id: typeof b.id === \"string\" ? b.id : uid(),\r\n type: \"html\",\r\n content: { html },\r\n props: rawProps,\r\n };\r\n }\r\n\r\n const doc = internalBlockToEmailDoc(b, depth);\r\n const out: BlockBase = {\r\n id: doc.id!,\r\n type: doc.type!,\r\n content: doc.content ?? {},\r\n props: rawProps,\r\n };\r\n if (doc.behavior) out.behavior = doc.behavior;\r\n return out;\r\n}\r\n\r\nfunction editorRowToEmailDocumentRow(r: Record<string, unknown>, rowIndex: number): EmailDocumentRow {\r\n const rowProps = editorRowToDocProps(r);\r\n const cellArrays = Array.isArray(r.cells) ? (r.cells as unknown[][]) : [];\r\n const declaredCols = typeof r.cols === \"number\" && r.cols > 0 ? Math.floor(r.cols) : 0;\r\n const colCount = Math.max(1, cellArrays.length, declaredCols);\r\n const rowColumns = getColumns(r);\r\n\r\n const columns: EmailDocumentColumn[] = Array.from({ length: colCount }, (_, ci) => {\r\n const cp = {\r\n ...DEFAULT_COLUMN_PROPS,\r\n ...(rowColumns[ci]?.props ?? {}),\r\n } as ColumnEntry[\"props\"];\r\n const cellBlocks = cellArrays[ci];\r\n const blocks = Array.isArray(cellBlocks)\r\n ? cellBlocks.map((blk) => exportBlockForLegacyRow(blk)).filter((x) => x != null)\r\n : [];\r\n return {\r\n id: `col_${rowIndex + 1}_${ci + 1}`,\r\n layout: { width: \"100%\", verticalAlign: \"top\" as const, mobileWidth: \"100%\" },\r\n styles: columnPropsToLegacyStyles(cp),\r\n props: cloneJson(cp) as ColumnProps,\r\n blocks,\r\n } as EmailDocumentColumn;\r\n });\r\n\r\n const ratios = Array.isArray(r.ratios) ? [...(r.ratios as number[])] : undefined;\r\n return {\r\n id: typeof r.id === \"string\" ? r.id : uid(),\r\n type: \"row\",\r\n _reactEmailStudio: { row: editorRowStudioSnapshot(r) },\r\n layout: {\r\n columns: colCount,\r\n gap: typeof r.gap === \"number\" ? r.gap : 0,\r\n stackOnMobile: true,\r\n align: \"center\",\r\n ...(typeof r.preset === \"string\" && r.preset.trim() ? { preset: r.preset.trim() } : {}),\r\n ...(ratios?.length ? { ratios } : {}),\r\n },\r\n props: rowProps,\r\n styles: rowPropsToLegacyStyles(rowProps),\r\n columns,\r\n };\r\n}\r\n\r\nfunction buildExportSettingsWithStudio(settings: Record<string, unknown>): EmailDocument[\"settings\"] {\r\n const base = buildExportSettings(settings) ?? {};\r\n const editorSettings = cloneJson(settings) as Record<string, unknown>;\r\n return {\r\n ...base,\r\n _reactEmailStudio: {\r\n contentPadding: base.contentPadding ?? 24,\r\n contentBorderRadius: base.contentBorderRadius ?? 8,\r\n editorSettings,\r\n },\r\n };\r\n}\r\n\r\nfunction editorSettingStr(settings: Record<string, unknown>, key: string, fallback = \"\"): string {\r\n const v = settings[key];\r\n return typeof v === \"string\" ? v : fallback;\r\n}\r\n\r\nfunction buildExportSettings(settings: Record<string, unknown>): EmailDocument[\"settings\"] {\r\n const contentWidth =\r\n typeof settings.contentWidth === \"number\" ? settings.contentWidth : 600;\r\n const bgGradient = settings.bgGradient;\r\n const contentBgGradient = settings.contentBgGradient;\r\n return {\r\n width: contentWidth,\r\n backgroundColor: editorSettingStr(settings, \"bgColor\", \"#f1f5f9\"),\r\n backgroundImage: editorSettingStr(settings, \"bgImage\"),\r\n backgroundRepeat: editorSettingStr(settings, \"bgRepeat\", \"no-repeat\"),\r\n backgroundSize: editorSettingStr(settings, \"bgSize\", \"cover\"),\r\n backgroundPosition: editorSettingStr(settings, \"bgPosition\", \"center\"),\r\n backgroundGradient:\r\n bgGradient && typeof bgGradient === \"object\" && !Array.isArray(bgGradient)\r\n ? (bgGradient as EmailDocumentSettings[\"backgroundGradient\"])\r\n : undefined,\r\n contentBackgroundColor: editorSettingStr(settings, \"contentBg\", \"#ffffff\"),\r\n contentBackgroundImage: editorSettingStr(settings, \"contentBgImage\"),\r\n contentBackgroundRepeat: editorSettingStr(settings, \"contentBgRepeat\", \"no-repeat\"),\r\n contentBackgroundSize: editorSettingStr(settings, \"contentBgSize\", \"cover\"),\r\n contentBackgroundPosition: editorSettingStr(settings, \"contentBgPosition\", \"center\"),\r\n contentBackgroundGradient:\r\n contentBgGradient &&\r\n typeof contentBgGradient === \"object\" &&\r\n !Array.isArray(contentBgGradient)\r\n ? (contentBgGradient as EmailDocumentSettings[\"contentBackgroundGradient\"])\r\n : undefined,\r\n fontFamily:\r\n editorSettingStr(settings, \"fontFamily\") ||\r\n editorSettingStr(settings, \"pageFontFamily\", \"Arial, Helvetica, sans-serif\"),\r\n lineHeightBase:\r\n settings.pageLineHeight != null && settings.pageLineHeight !== \"\"\r\n ? Number(settings.pageLineHeight)\r\n : 1.6,\r\n color: editorSettingStr(settings, \"pageTextColor\", \"#111827\"),\r\n responsive: typeof settings.pageResponsive === \"boolean\" ? settings.pageResponsive : true,\r\n rtl: !!settings.pageRtl,\r\n contentPadding: typeof settings.padding === \"number\" ? settings.padding : 24,\r\n contentBorderRadius: typeof settings.borderRadius === \"number\" ? settings.borderRadius : 8,\r\n };\r\n}\r\n\r\nfunction editorSettingsFromDoc(\r\n s: EmailDocumentSettings,\r\n rawSettings?: EmailDocumentSettings | null,\r\n): Record<string, unknown> {\r\n const studioSettings = rawSettings?._reactEmailStudio;\r\n const settings: Record<string, unknown> = {};\r\n if (\r\n studioSettings?.editorSettings &&\r\n typeof studioSettings.editorSettings === \"object\" &&\r\n !Array.isArray(studioSettings.editorSettings)\r\n ) {\r\n Object.assign(settings, cloneJson(studioSettings.editorSettings));\r\n }\r\n const pageRtlFromEditor = settings.pageRtl;\r\n const contentPadding =\r\n typeof s.contentPadding === \"number\"\r\n ? s.contentPadding\r\n : typeof studioSettings?.contentPadding === \"number\"\r\n ? studioSettings.contentPadding\r\n : undefined;\r\n const contentBorderRadius =\r\n typeof s.contentBorderRadius === \"number\"\r\n ? s.contentBorderRadius\r\n : typeof studioSettings?.contentBorderRadius === \"number\"\r\n ? studioSettings.contentBorderRadius\r\n : undefined;\r\n\r\n Object.assign(settings, {\r\n bgColor: s.backgroundColor || \"#f1f5f9\",\r\n bgImage: s.backgroundImage || \"\",\r\n bgRepeat: s.backgroundRepeat || \"no-repeat\",\r\n bgSize: s.backgroundSize || \"cover\",\r\n bgPosition: s.backgroundPosition || \"center\",\r\n bgGradient: s.backgroundGradient || null,\r\n contentBg: s.contentBackgroundColor || \"#ffffff\",\r\n contentBgImage: s.contentBackgroundImage || \"\",\r\n contentBgRepeat: s.contentBackgroundRepeat || \"no-repeat\",\r\n contentBgSize: s.contentBackgroundSize || \"cover\",\r\n contentBgPosition: s.contentBackgroundPosition || \"center\",\r\n contentBgGradient: s.contentBackgroundGradient || null,\r\n contentWidth: typeof s.width === \"number\" ? s.width : 600,\r\n padding:\r\n contentPadding ??\r\n (typeof settings.padding === \"number\" ? settings.padding : 24),\r\n borderRadius:\r\n contentBorderRadius ??\r\n (typeof settings.borderRadius === \"number\" ? settings.borderRadius : 8),\r\n pageFontFamily: s.fontFamily,\r\n pageTextColor: s.color,\r\n pageLineHeight: s.lineHeightBase != null ? String(s.lineHeightBase) : undefined,\r\n pageResponsive: s.responsive,\r\n pageRtl: typeof s.rtl === \"boolean\" ? s.rtl : pageRtlFromEditor,\r\n fontFamily: s.fontFamily,\r\n });\r\n return settings;\r\n}\r\n\r\nexport function normalizeEmailDesignInput(input: unknown) {\r\n const coerced = coerceEmailDocumentInput(input);\r\n const doc = normalizeEmailDocument(coerced);\r\n if (!doc) return null;\r\n\r\n const rawDoc =\r\n input && typeof input === \"object\" && !Array.isArray(input)\r\n ? (input as Partial<EmailDocument>)\r\n : null;\r\n const rawSettings =\r\n rawDoc?.settings && typeof rawDoc.settings === \"object\" && !Array.isArray(rawDoc.settings)\r\n ? rawDoc.settings\r\n : null;\r\n\r\n const settings = editorSettingsFromDoc(doc.settings || {}, rawSettings);\r\n\r\n let rows: ReturnType<typeof rowToInternal>[];\r\n if (doc.blocks?.length) {\r\n rows = blocksToEditorRows(doc.blocks);\r\n } else {\r\n const rawRows = rawDoc && Array.isArray(rawDoc.rows) ? rawDoc.rows : [];\r\n rows = (doc.rows || []).map((r, i) => {\r\n const legacy = rawRows[i]?._reactEmailStudio;\r\n if (legacy) {\r\n return rowToInternal({ ...r, _reactEmailStudio: legacy } as EmailDocumentRow);\r\n }\r\n return rowToInternal(r);\r\n });\r\n }\r\n\r\n return withHydratedRows({ rows, settings, __emailDocument: doc } as any);\r\n}\r\n\r\n/** Rows from a design input without full editor settings merge (for append). */\r\nexport function emailDocumentToEditorRows(input: unknown) {\r\n const coerced = coerceEmailDocumentInput(input);\r\n const doc = normalizeEmailDocument(coerced);\r\n if (!doc) return null;\r\n\r\n const rawDoc =\r\n input && typeof input === \"object\" && !Array.isArray(input)\r\n ? (input as Partial<EmailDocument>)\r\n : null;\r\n\r\n if (doc.blocks?.length) {\r\n return blocksToEditorRows(doc.blocks);\r\n }\r\n\r\n const rawRows = rawDoc && Array.isArray(rawDoc.rows) ? rawDoc.rows : [];\r\n return (doc.rows || []).map((r, i) => {\r\n const legacy = rawRows[i]?._reactEmailStudio;\r\n if (legacy) {\r\n return rowToInternal({ ...r, _reactEmailStudio: legacy } as EmailDocumentRow);\r\n }\r\n return rowToInternal(r);\r\n });\r\n}\r\n\r\nexport function designToEmailDocument(rows: any[], settings: any): EmailDocument {\r\n return {\r\n type: \"email_document\",\r\n settings: buildExportSettingsWithStudio(settings),\r\n rows: rows.map((r, i) => editorRowToEmailDocumentRow(r, i)),\r\n };\r\n}\r\n\r\n/** Normalize input and return `email_document` in LMS/export shape (`rows[]` + `_reactEmailStudio`). */\r\nexport function canonicalizeEmailDocument(input: unknown): EmailDocument | null {\r\n const loaded = normalizeEmailDesignInput(coerceEmailDocumentInput(input) ?? input);\r\n if (!loaded?.rows) return null;\r\n return designToEmailDocument(loaded.rows, loaded.settings);\r\n}\r\n\r\n/**\r\n * Deep-merge block props with defaults and ensure ids. Unknown `type` values are dropped (not shown).\r\n * @param depth Nesting level for `layout` → `cells` recursion (capped at {@link MAX_LAYOUT_TREE_DEPTH}).\r\n */\r\nfunction hydrateBlock(b, depth = 0) {\r\n if (!b || typeof b !== \"object\") return null;\r\n const t = b.type === \"nestedRow\" ? \"layout\" : b.type;\r\n if (!isKnownBlockType(t)) return null;\r\n\r\n if (t === \"layout\" && b.props && Array.isArray(b.props.cells)) {\r\n const defaults = DEFAULT_BLOCK_PROPS.layout;\r\n if (depth >= MAX_LAYOUT_TREE_DEPTH) {\r\n const ratios = Array.isArray(b.props.ratios) && b.props.ratios.length ? [...b.props.ratios] : [1];\r\n return {\r\n ...b,\r\n type: \"layout\",\r\n id: typeof b.id === \"string\" && b.id ? b.id : uid(),\r\n props: normalizeLayoutContainerProps({\r\n ...defaults,\r\n ...b.props,\r\n bgSize: b.props.bgSize ?? defaults.bgSize,\r\n bgRepeat: b.props.bgRepeat ?? defaults.bgRepeat,\r\n cells: ratios.map(() => []),\r\n }),\r\n };\r\n }\r\n const cells = b.props.cells.map((col) =>\r\n Array.isArray(col) ? col.map((x) => hydrateBlock(x, depth + 1)).filter((x) => x != null) : [],\r\n );\r\n return {\r\n ...b,\r\n type: \"layout\",\r\n id: typeof b.id === \"string\" && b.id ? b.id : uid(),\r\n props: normalizeLayoutContainerProps({\r\n ...defaults,\r\n ...b.props,\r\n bgSize: b.props.bgSize ?? defaults.bgSize,\r\n bgRepeat: b.props.bgRepeat ?? defaults.bgRepeat,\r\n cells,\r\n }),\r\n };\r\n }\r\n\r\n const defaults = DEFAULT_BLOCK_PROPS[t];\r\n if (typeof defaults !== \"object\" || defaults == null || Array.isArray(defaults)) return null;\r\n\r\n if (t === \"html\") {\r\n const rawProps = b.props && typeof b.props === \"object\" && !Array.isArray(b.props) ? (b.props as Record<string, unknown>) : {};\r\n const { content: legacyPropContent, ...restProps } = rawProps;\r\n const merged = { ...defaults, ...restProps };\r\n normalizeBoxStyles(merged, t);\r\n const src =\r\n typeof (b as { content?: unknown }).content === \"string\"\r\n ? String((b as { content: string }).content)\r\n : typeof legacyPropContent === \"string\"\r\n ? legacyPropContent\r\n : \"\";\r\n const htmlNorm = normalizeRichHtmlForStorage(src);\r\n (merged as { content?: string }).content = htmlNorm;\r\n return {\r\n ...b,\r\n id: typeof b.id === \"string\" && b.id ? b.id : uid(),\r\n content: htmlNorm,\r\n props: merged,\r\n };\r\n }\r\n\r\n const merged = { ...defaults, ...(b.props && typeof b.props === \"object\" ? b.props : {}) };\r\n\r\n normalizeBoxStyles(merged, t);\r\n\r\n return {\r\n ...b,\r\n id: typeof b.id === \"string\" && b.id ? b.id : uid(),\r\n props: merged,\r\n };\r\n}\r\n\r\n/** Nested layout cell: document block or legacy `{ type, props }` editor shape. */\r\nfunction mapEmbeddedLayoutCellBlock(raw: unknown, layoutDepth = 0) {\r\n if (!raw || typeof raw !== \"object\") return null;\r\n const r = raw as any;\r\n if (r.props && typeof r.props === \"object\" && typeof r.type === \"string\" && !(\"styles\" in r)) {\r\n return hydrateBlock(r, layoutDepth);\r\n }\r\n return mapBlockToInternal(r as BlockBase, layoutDepth);\r\n}\r\n\r\n/** Deep-merge layout `columns` arrays. Hydrated props often omit columns filled only in `content`. */\r\nfunction applyImportedEditorPropsFromDoc(block: any, t: BlockPropKey, b: BlockBase, layoutDepth = 0) {\r\n const exp = (b as any).props as Record<string, unknown> | undefined;\r\n if (!exp || typeof exp !== \"object\" || Array.isArray(exp)) {\r\n if (t === \"html\" && typeof block.content === \"string\") {\r\n block.content = normalizeRichHtmlForStorage(block.content);\r\n block.props.content = block.content;\r\n }\r\n return;\r\n }\r\n if (t === \"layout\" && Array.isArray((exp as any).cells)) {\r\n const columnsFromContent = block.props.columns ?? block.props.columnStyles;\r\n const expHasColumns =\r\n Array.isArray((exp as any).columns) ||\r\n ((exp as any).columnStyles &&\r\n typeof (exp as any).columnStyles === \"object\" &&\r\n !Array.isArray((exp as any).columnStyles));\r\n const hb = hydrateBlock({ type: \"layout\", id: block.id, props: exp }, layoutDepth);\r\n if (hb) {\r\n block.props = hb.props;\r\n const merged = mergeLayoutColumns(\r\n columnsFromContent,\r\n expHasColumns ? block.props.columns : undefined,\r\n );\r\n if (merged) block.props.columns = merged;\r\n else delete block.props.columns;\r\n delete block.props.columnStyles;\r\n if (typeof hb.id === \"string\" && hb.id) block.id = hb.id;\r\n }\r\n return;\r\n }\r\n if (t === \"html\") {\r\n const { content: expContent, ...expRest } = exp;\r\n Object.assign(block.props, expRest);\r\n normalizeBoxStyles(block.props, t);\r\n if (typeof expContent === \"string\") {\r\n block.content = normalizeRichHtmlForStorage(expContent);\r\n } else if (typeof block.content === \"string\") {\r\n block.content = normalizeRichHtmlForStorage(block.content);\r\n }\r\n block.props.content = typeof block.content === \"string\" ? block.content : \"\";\r\n return;\r\n }\r\n Object.assign(block.props, exp);\r\n normalizeBoxStyles(block.props, t);\r\n if (t === \"text\") {\r\n block.props.content = normalizeRichHtmlForStorage(String(block.props.content ?? \"\"));\r\n }\r\n}\r\n\r\n/** Export block payload (`content`) + full `props`; styling lives in `props` only (no `styles`). */\r\nfunction exportEmailDocBlock(b: any, depth = 0): BlockBase {\r\n if (!b || typeof b !== \"object\") return { id: uid(), type: \"text\", content: {} };\r\n const doc = internalBlockToEmailDoc(b, depth) as BlockBase & { content?: Record<string, unknown> };\r\n const out: BlockBase & { content?: Record<string, unknown>; props?: Record<string, unknown> } = { ...doc };\r\n delete out.styles;\r\n if (b.props && typeof b.props === \"object\" && !Array.isArray(b.props)) {\r\n const raw = cloneJson(b.props) as Record<string, unknown>;\r\n if (b.type === \"html\" && raw && typeof raw === \"object\" && \"content\" in raw) {\r\n const { content: _drop, ...rest } = raw;\r\n out.props = rest;\r\n } else {\r\n out.props = raw;\r\n }\r\n }\r\n if (b.type === \"html\") {\r\n const body =\r\n typeof b.content === \"string\"\r\n ? b.content\r\n : typeof (b.props as { content?: unknown })?.content === \"string\"\r\n ? String((b.props as { content: string }).content)\r\n : typeof (doc.content as { html?: string })?.html === \"string\"\r\n ? (doc.content as { html: string }).html\r\n : \"\";\r\n (out as BlockBase).content = normalizeRichHtmlForStorage(body);\r\n }\r\n if (b.type === \"layout\" && Array.isArray(b.props?.cells)) {\r\n const baseContent = typeof doc.content === \"object\" && doc.content ? doc.content : {};\r\n if (depth >= MAX_LAYOUT_TREE_DEPTH) {\r\n const ratios = Array.isArray(b.props.ratios) && b.props.ratios.length ? b.props.ratios : [1];\r\n out.content = { ...baseContent, cells: ratios.map(() => []) };\r\n } else {\r\n out.content = {\r\n ...baseContent,\r\n cells: (b.props.cells as any[][]).map((col: any[]) =>\r\n Array.isArray(col) ? col.map((child) => exportEmailDocBlock(child, depth + 1)) : [],\r\n ),\r\n };\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nfunction hydrateLayoutRow(row) {\r\n if (!row || typeof row !== \"object\") return row;\r\n const cells = (row.cells || []).map((col) =>\r\n Array.isArray(col) ? col.map(hydrateBlock).filter((x) => x != null) : col,\r\n );\r\n return {\r\n ...row,\r\n id: typeof row.id === \"string\" && row.id ? row.id : uid(),\r\n gap: row.gap ?? 12,\r\n padding: row.padding !== undefined && row.padding !== null ? row.padding : 8,\r\n bgSize: row.bgSize ?? \"cover\",\r\n bgRepeat: row.bgRepeat ?? \"no-repeat\",\r\n cells,\r\n };\r\n}\r\n\r\nfunction hydrateDesignRows(rows) {\r\n if (!Array.isArray(rows)) return rows;\r\n return rows.map(hydrateLayoutRow);\r\n}\r\n\r\nfunction withHydratedRows(result) {\r\n if (!result || !Array.isArray(result.rows)) return result;\r\n return {\r\n ...result,\r\n rows: hydrateDesignRows(result.rows),\r\n };\r\n}\r\n\r\n// Note: `normalizeEmailDesignInput` is defined above for the new `email_document` schema.\r\n\r\n/** Re-export for consumers typing `jsonToHtml` options. */\r\nexport type JsonToHtmlOptions = EmailHtmlOptions;\r\n\r\n/**\r\n * Design object or JSON string → full HTML email document (preview / send).\r\n * Strings are parsed with `JSON.parse` then normalized; invalid JSON returns `\"\"`.\r\n */\r\nexport function jsonToHtml(designInput: unknown, opts: JsonToHtmlOptions = {}): string {\r\n let raw = designInput;\r\n if (typeof raw === \"string\") {\r\n const t = raw.trim();\r\n if (!t) return \"\";\r\n try {\r\n raw = JSON.parse(t);\r\n } catch {\r\n return \"\";\r\n }\r\n }\r\n const d = normalizeEmailDesignInput(raw);\r\n if (!d?.rows?.length) return \"\";\r\n return designToHtml(d.rows, d.settings, opts);\r\n}\r\n","import { DEFAULT_BLOCK_PROPS } from \"../defaultBlockProps\";\r\nimport { normalizeRichHtmlForStorage } from \"./htmlUtils\";\r\nimport type { EmailDocument } from \"../schema/emailDocument\";\r\n\r\nconst pad = (n: number) => ({ top: n, right: n, bottom: n, left: n });\r\n\r\n/**\r\n * Pull usable HTML from a full document (`<!DOCTYPE` / `<html>`) or a fragment string.\r\n */\r\nexport function extractHtmlForDesign(html: string): string {\r\n const t = String(html ?? \"\").trim();\r\n if (!t) return \"\";\r\n const head = t.slice(0, 800).toLowerCase();\r\n if (!head.includes(\"<html\") && !head.includes(\"<!doctype\")) {\r\n return normalizeRichHtmlForStorage(t);\r\n }\r\n try {\r\n const doc = new DOMParser().parseFromString(t, \"text/html\");\r\n const body = doc.body;\r\n if (!body) return normalizeRichHtmlForStorage(t);\r\n return normalizeRichHtmlForStorage(body.innerHTML);\r\n } catch {\r\n return normalizeRichHtmlForStorage(t);\r\n }\r\n}\r\n\r\n/**\r\n * Wrap HTML (fragment or full email/page document) in a minimal `email_document`\r\n * with one row, one column, and a single **html** block — suitable for `loadJson`.\r\n *\r\n * @returns `null` when there is no non-empty HTML after extraction/normalization.\r\n */\r\nexport function htmlToEmailDesignTemplate(html: string): EmailDocument | null {\r\n const inner = extractHtmlForDesign(html);\r\n if (!inner) return null;\r\n\r\n const doc: EmailDocument = {\r\n type: \"email_document\",\r\n settings: {\r\n width: 600,\r\n backgroundColor: \"#f1f5f9\",\r\n contentBackgroundColor: \"#ffffff\",\r\n fontFamily: \"Arial, Helvetica, sans-serif\",\r\n lineHeightBase: 1.6,\r\n color: \"#111827\",\r\n responsive: true,\r\n rtl: false,\r\n },\r\n rows: [\r\n {\r\n id: \"row_html_import\",\r\n type: \"row\",\r\n layout: { columns: 1, gap: 0, stackOnMobile: true, align: \"center\" },\r\n styles: {\r\n backgroundColor: \"#ffffff\",\r\n backgroundRepeat: \"no-repeat\",\r\n backgroundSize: \"cover\",\r\n padding: pad(24),\r\n textAlign: \"left\",\r\n },\r\n columns: [\r\n {\r\n id: \"col_html_import\",\r\n layout: { width: \"100%\", verticalAlign: \"top\", mobileWidth: \"100%\" },\r\n styles: { padding: pad(0), backgroundColor: \"\" },\r\n blocks: [\r\n {\r\n id: \"block_html_import\",\r\n type: \"html\",\r\n content: inner,\r\n props: { ...DEFAULT_BLOCK_PROPS.html },\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n\r\n return doc;\r\n}\r\n\r\n/**\r\n * HTML fragment or full document → `email_document` JSON string (for `loadJson` / storage).\r\n * Returns `\"\"` when there is no non-empty HTML after extraction.\r\n */\r\nexport function htmlToJson(html: string, pretty = false): string {\r\n const doc = htmlToEmailDesignTemplate(html);\r\n if (!doc) return \"\";\r\n return pretty ? JSON.stringify(doc, null, 2) : JSON.stringify(doc);\r\n}\r\n","import {\r\n useState,\r\n useRef,\r\n useCallback,\r\n useEffect,\r\n Fragment,\r\n type CSSProperties,\r\n type DragEvent,\r\n type FC,\r\n} from \"react\";\r\nimport { SocialGlyph } from \"../../socialIcons\";\r\nimport { SC } from \"../../constants\";\r\nimport { escHtml, videoUrlToEmbedSrc } from \"../../lib/htmlUtils\";\r\nimport { getColumnPropsAt } from \"../../lib/columnProps\";\r\nimport { isRootContentRow, isSplitLayoutBlock } from \"../../lib/columnPath\";\r\nimport { imageLinkActive } from \"../../defaultBlockProps\";\r\nimport { isEffectivelyEmptyRichHtml, RICH_HTML_CONTENT_CSS } from \"../../lib/htmlUtils\";\r\nimport { backdropLayerStyle, backgroundLayerStyle } from \"../../lib/blockBackground\";\r\n\r\nfunction useLiveCountdown(endDate: string) {\r\n const [diff, setDiff] = useState(0);\r\n useEffect(() => {\r\n const update = () => setDiff(Math.max(0, new Date(endDate).getTime() - Date.now()));\r\n update();\r\n const id = setInterval(update, 1000);\r\n return () => clearInterval(id);\r\n }, [endDate]);\r\n const d = Math.floor(diff / 86400000);\r\n const h = Math.floor((diff % 86400000) / 3600000);\r\n const m = Math.floor((diff % 3600000) / 60000);\r\n const s = Math.floor((diff % 60000) / 1000);\r\n return [d, h, m, s] as const;\r\n}\r\n\r\n/** Light dotted frame for split `layout` blocks in edit mode (not preview). */\r\nfunction layoutSplitChromeBorder(_C: { border: string }, preview: boolean): CSSProperties {\r\n if (preview) return {};\r\n return {\r\n border: \"1px dotted rgba(148, 163, 184, 0.5)\",\r\n boxSizing: \"border-box\",\r\n };\r\n}\r\n\r\n/** Same stroke as layout chrome; used for non-layout blocks on hover only. */\r\nconst CONTENT_BLOCK_HOVER_BORDER = \"1px dotted rgba(148, 163, 184, 0.5)\";\r\n\r\n/** Empty-cell “Drop here” row height in edit mode (px). */\r\nconst DROP_HERE_HEIGHT_PX = 45;\r\n\r\n/** Stop in-canvas navigation for `<a href>` in edit mode (rich text + button/link/image/menu/social). */\r\nfunction blockLinkCaptureHandler(preview, e) {\r\n if (preview) return;\r\n const t = e.target;\r\n if (!(t instanceof Element)) return;\r\n if (t.closest(\"a[href]\")) e.preventDefault();\r\n}\r\n\r\nconst numOrLayout = (v: unknown, fb: number) => (typeof v === \"number\" && Number.isFinite(v) ? v : fb);\r\nfunction boxPxLayout(v: any) {\r\n const top = numOrLayout(v?.top, 0);\r\n const right = numOrLayout(v?.right, top);\r\n const bottom = numOrLayout(v?.bottom, top);\r\n const left = numOrLayout(v?.left, right);\r\n return `${top}px ${right}px ${bottom}px ${left}px`;\r\n}\r\n/** Padding for layout columns (number or same box shape as block padding). */\r\nfunction paddingCssLayout(v: any) {\r\n if (typeof v === \"number\") return `${numOrLayout(v, 0)}px`;\r\n if (v && typeof v === \"object\" && !Array.isArray(v)) return boxPxLayout(v);\r\n return \"0px\";\r\n}\r\n/** Border radius for layout columns (number or per-corner like blocks). */\r\nfunction radiusCssLayout(v: any) {\r\n if (typeof v === \"number\") return `${numOrLayout(v, 0)}px`;\r\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\r\n const tl = numOrLayout(v.tl, 0);\r\n const tr = numOrLayout(v.tr, tl);\r\n const br = numOrLayout(v.br, tl);\r\n const bl = numOrLayout(v.bl, tr);\r\n return `${tl}px ${tr}px ${br}px ${bl}px`;\r\n }\r\n return \"0px\";\r\n}\r\n\r\nfunction ContentBlock({ block, selected, onClick, preview, C }) {\r\n const [hover, setHover] = useState(false);\r\n const { type, props: p } = block;\r\n\r\n const numOr = (v: unknown, fb: number) => (typeof v === \"number\" && Number.isFinite(v) ? v : fb);\r\n const boxPx = (v: any) => {\r\n const top = numOr(v?.top, 0);\r\n const right = numOr(v?.right, top);\r\n const bottom = numOr(v?.bottom, top);\r\n const left = numOr(v?.left, right);\r\n return `${top}px ${right}px ${bottom}px ${left}px`;\r\n };\r\n const paddingCss = (v: any) => {\r\n if (typeof v === \"number\") return `${numOr(v, 0)}px`;\r\n if (v && typeof v === \"object\" && !Array.isArray(v)) return boxPx(v);\r\n return \"0px\";\r\n };\r\n const marginCss = (v: any) => {\r\n if (!v || typeof v !== \"object\" || Array.isArray(v)) return \"0px\";\r\n return boxPx(v);\r\n };\r\n const radiusCss = (v: any) => {\r\n if (typeof v === \"number\") return `${numOr(v, 0)}px`;\r\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\r\n const tl = numOr(v.tl, 0);\r\n const tr = numOr(v.tr, tl);\r\n const br = numOr(v.br, tl);\r\n const bl = numOr(v.bl, tr);\r\n return `${tl}px ${tr}px ${br}px ${bl}px`;\r\n }\r\n return \"0px\";\r\n };\r\n\r\n const shellBg =\r\n type === \"button\" || type === \"timer\"\r\n ? backdropLayerStyle(p)\r\n : backgroundLayerStyle({\r\n bgColor: p.bgColor,\r\n bgImage: p.bgImage,\r\n bgSize: p.bgSize,\r\n bgRepeat: p.bgRepeat,\r\n bgPosition: p.bgPosition,\r\n bgGradient: p.bgGradient,\r\n });\r\n\r\n const wrap = (children) => (\r\n <div\r\n onClick={preview ? undefined : (onClick || undefined)}\r\n onClickCapture={(e) => blockLinkCaptureHandler(preview, e)}\r\n onAuxClickCapture={(e) => blockLinkCaptureHandler(preview, e)}\r\n onMouseEnter={preview ? undefined : () => setHover(true)}\r\n onMouseLeave={preview ? undefined : () => setHover(false)}\r\n style={{\r\n cursor: preview ? \"default\" : onClick ? \"pointer\" : \"default\",\r\n outline: selected && !preview ? `2px solid ${C.accent}` : \"2px solid transparent\",\r\n outlineOffset: 1,\r\n borderRadius: 3,\r\n transition: \"outline .12s, border-color .12s\",\r\n position: \"relative\",\r\n ...(preview\r\n ? {}\r\n : {\r\n border: hover ? CONTENT_BLOCK_HOVER_BORDER : \"1px solid transparent\",\r\n boxSizing: \"border-box\",\r\n }),\r\n ...shellBg,\r\n padding: paddingCss(p.padding),\r\n margin: marginCss(p.margin),\r\n }}\r\n >\r\n {children}\r\n </div>\r\n );\r\n\r\n if (type === \"heading\") return wrap(\r\n <div style={{ fontSize: p.fontSize, color: p.color, textAlign: p.align, fontWeight: (p.fontWeight || (p.bold ? 700 : 400)) as any, letterSpacing: `${p.letterSpacing || 0}px`, lineHeight: p.lineHeight || 1.2, fontFamily: p.fontFamily || \"Georgia,serif\" }}\r\n dangerouslySetInnerHTML={{ __html: `<${p.level || \"h2\"} style=\"margin:0\">${p.content}</${p.level || \"h2\"}` }} />\r\n );\r\n if (type === \"text\") return wrap(\r\n <div style={{ fontSize: p.fontSize, color: p.color, textAlign: p.align, fontWeight: (p.fontWeight || (p.bold ? 700 : 400)) as any, fontStyle: p.italic ? \"italic\" : \"normal\", textDecoration: p.underline ? \"underline\" : \"none\", lineHeight: p.lineHeight || 1.65, letterSpacing: `${p.letterSpacing || 0}px`, fontFamily: p.fontFamily || \"Georgia,serif\" }}\r\n dangerouslySetInnerHTML={{ __html: p.content }} />\r\n );\r\n if (type === \"html\") {\r\n const richHtml = typeof block.content === \"string\" ? block.content : (p as { content?: string }).content;\r\n const emptyRich = isEffectivelyEmptyRichHtml(richHtml);\r\n return wrap(\r\n <div style={{ position: \"relative\", minHeight: emptyRich && !preview ? \"2.75em\" : undefined }}>\r\n <style>{RICH_HTML_CONTENT_CSS}</style>\r\n <div\r\n className=\"email-editor-rich-canvas email-rich-html-content\"\r\n style={{\r\n fontSize: p.fontSize,\r\n color: p.color,\r\n textAlign: p.align,\r\n lineHeight: p.lineHeight || 1.65,\r\n letterSpacing: `${p.letterSpacing || 0}px`,\r\n fontFamily: p.fontFamily || \"Georgia,serif\",\r\n wordBreak: \"break-word\",\r\n minHeight: emptyRich && !preview ? \"2.75em\" : undefined,\r\n }}\r\n dangerouslySetInnerHTML={{ __html: richHtml || \"\" }}\r\n />\r\n {emptyRich && !preview ? (\r\n <span\r\n aria-hidden\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n fontSize: p.fontSize,\r\n lineHeight: p.lineHeight || 1.65,\r\n letterSpacing: `${p.letterSpacing || 0}px`,\r\n fontFamily: p.fontFamily || \"Georgia,serif\",\r\n textAlign: (p.align as CSSProperties[\"textAlign\"]) || \"left\",\r\n color: C.muted,\r\n fontStyle: \"italic\",\r\n pointerEvents: \"none\",\r\n paddingTop: 2,\r\n zIndex: 1,\r\n }}\r\n >\r\n Empty rich text — edit in the sidebar\r\n </span>\r\n ) : null}\r\n </div>\r\n );\r\n }\r\n if (type === \"image\") {\r\n const img = (\r\n <img\r\n src={p.src}\r\n alt={p.alt || \"\"}\r\n style={{\r\n maxWidth: p.width || \"100%\",\r\n width: p.width && p.width !== \"100%\" ? p.width : undefined,\r\n height: \"auto\",\r\n display: \"block\",\r\n marginLeft: p.align === \"center\" ? \"auto\" : undefined,\r\n marginRight: p.align === \"center\" ? \"auto\" : undefined,\r\n borderRadius: radiusCss(p.borderRadius),\r\n objectFit: p.objectFit || \"cover\",\r\n objectPosition: p.objectPosition || \"center\",\r\n }}\r\n />\r\n );\r\n return wrap(<div style={{ textAlign: p.align }}>{imageLinkActive(p) ? <a href={p.link} target={p.linkTarget || \"_blank\"} rel=\"noopener\">{img}</a> : img}</div>);\r\n }\r\n if (type === \"button\") return wrap(\r\n <div style={{ textAlign: p.fullWidth ? \"center\" : p.align }}>\r\n <a href={p.href} target={p.linkTarget || \"_blank\"} rel=\"noopener\"\r\n style={{ display: p.fullWidth ? \"block\" : \"inline-block\", backgroundColor: p.bgColor, color: p.textColor, borderRadius: radiusCss(p.borderRadius), padding: `${p.paddingV || 11}px ${p.paddingH || 24}px`, textDecoration: \"none\", fontSize: p.fontSize, fontWeight: p.fontWeight || 600, fontFamily: \"sans-serif\", border: `${p.borderWidth || 0}px solid ${p.borderColor || \"transparent\"}`, width: p.fullWidth ? \"100%\" : undefined, textAlign: \"center\", boxSizing: \"border-box\" }}>\r\n {p.label}\r\n </a>\r\n </div>\r\n );\r\n if (type === \"link\") return wrap(\r\n <div style={{ textAlign: p.align }}>\r\n <a href={p.href} target={p.linkTarget || \"_blank\"} rel=\"noopener noreferrer\"\r\n style={{ color: p.color, fontSize: p.fontSize, fontWeight: (p.fontWeight || (p.bold ? 700 : 400)) as any, textDecoration: p.underline ? \"underline\" : \"none\", fontFamily: p.fontFamily || \"Arial, Helvetica, sans-serif\" }}>\r\n {p.label}\r\n </a>\r\n </div>\r\n );\r\n if (type === \"divider\") return wrap(<hr style={{ border: \"none\", borderTop: `${p.thickness}px ${p.style || \"solid\"} ${p.color}`, margin: 0 }} />);\r\n if (type === \"spacer\") return wrap(<div style={{ height: p.height, background: selected && !preview ? \"rgba(99,102,241,.05)\" : \"transparent\" }} />);\r\n if (type === \"social\") {\r\n const urls = p.socialUrls || {};\r\n return wrap(\r\n <div style={{ textAlign: p.align }}>\r\n {(p.networks || []).map(n => {\r\n const href = (urls[n] && String(urls[n]).trim()) || \"#\";\r\n const glyphPx = Math.round((p.iconSize || 24) * 0.56);\r\n const inner = (\r\n <span style={{ display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\", width: p.iconSize, height: p.iconSize, borderRadius: p.shape === \"square\" ? \"4px\" : \"50%\", background: SC[n] || \"#64748b\", color: n === \"snapchat\" ? \"#000\" : \"#fff\" }}>\r\n <SocialGlyph network={n} size={glyphPx} />\r\n </span>\r\n );\r\n return href === \"#\" ? (\r\n <span key={n} title={n} style={{ display: \"inline-flex\", margin: `0 ${p.gap || 4}px`, cursor: \"default\" }}>{inner}</span>\r\n ) : (\r\n <a key={n} href={href} title={n} target=\"_blank\" rel=\"noopener noreferrer\" style={{ display: \"inline-flex\", margin: `0 ${p.gap || 4}px`, textDecoration: \"none\" }}>\r\n {inner}\r\n </a>\r\n );\r\n })}\r\n </div>\r\n );\r\n }\r\n if (type === \"video\") {\r\n const embedSrc = videoUrlToEmbedSrc(p.src);\r\n return wrap(\r\n <div style={{ textAlign: \"center\" }}>\r\n {embedSrc ? (\r\n <iframe src={embedSrc} width=\"100%\" height={p.height} frameBorder=\"0\"\r\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\r\n allowFullScreen style={{ maxWidth: \"100%\", borderRadius: 5, display: \"block\" }} title=\"video\" />\r\n ) : (\r\n <div style={{ width: \"100%\", height: p.height, background: \"#f4f8ff\", borderRadius: 5, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", flexDirection: \"column\", gap: 8, border: \"2px dashed #d0dff0\" }}>\r\n <span style={{ fontSize: 32 }}>▶</span>\r\n <span style={{ fontSize: 12, color: \"#5a7a9a\" }}>Paste a YouTube or Vimeo URL</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n if (type === \"menu\") return wrap(\r\n <nav style={{ textAlign: p.align }}>\r\n {(p.items || []).map((item, i) => (\r\n <a key={i} href={item.href} style={{ fontSize: p.fontSize, color: p.color, margin: `0 ${p.gap || 10}px`, textDecoration: \"none\", fontFamily: \"sans-serif\", fontWeight: 600 }}>{item.label}</a>\r\n ))}\r\n </nav>\r\n );\r\n if (type === \"timer\") {\r\n // eslint-disable-next-line react-hooks/rules-of-hooks\r\n const [d, h, m, s] = useLiveCountdown(p.endDate);\r\n return wrap(\r\n <div style={{ textAlign: p.align }}>\r\n {p.label && <div style={{ fontSize: 12, color: \"#64748b\", marginBottom: 6, fontFamily: \"sans-serif\" }}>{p.label}</div>}\r\n <div style={{ display: \"inline-flex\", gap: 6 }}>\r\n {[[d, \"Days\"], [h, \"Hrs\"], [m, \"Min\"], [s, \"Sec\"]].map(([val, lbl]) => (\r\n <div key={lbl} style={{ background: p.bgColor, color: p.textColor, borderRadius: p.borderRadius, padding: \"8px 14px\", fontFamily: \"monospace\", fontWeight: 700, fontSize: 20, minWidth: 52, textAlign: \"center\", lineHeight: 1 }}>\r\n <div>{String(val).padStart(2, \"0\")}</div>\r\n {p.showLabels && <div style={{ fontSize: 9, opacity: .75, letterSpacing: \".08em\", marginTop: 3 }}>{String(lbl).toUpperCase()}</div>}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n }\r\n if (type === \"table\") {\r\n const data = p.data || [];\r\n const role = p.tableRole === \"presentation\" ? \"presentation\" : \"table\";\r\n const cellPaddingStyle = (() => {\r\n const cp = p.cellPadding;\r\n if (cp && typeof cp === \"object\" && !Array.isArray(cp)) {\r\n return boxPx(cp);\r\n }\r\n const cellPadPx =\r\n typeof cp === \"number\" && Number.isFinite(cp)\r\n ? cp\r\n : typeof p.padding === \"number\" && Number.isFinite(p.padding)\r\n ? p.padding\r\n : numOr((p.padding as { top?: number })?.top, 8);\r\n return cellPadPx;\r\n })();\r\n return wrap(\r\n <div style={{ overflowX: \"auto\" }}>\r\n <table\r\n role={role}\r\n style={{ width: \"100%\", borderCollapse: \"collapse\", fontSize: p.fontSize || 13, fontFamily: p.fontFamily || \"sans-serif\", tableLayout: \"fixed\" }}\r\n >\r\n <tbody>\r\n {data.map((row, ri) => {\r\n const isHeaderRow = !!p.header && ri === 0;\r\n const isStriped =\r\n p.striped &&\r\n (p.header ? ri > 1 && ri % 2 === 0 : ri > 0 && ri % 2 === 1);\r\n return (\r\n <tr key={ri}>\r\n {row.map((cell, ci) => {\r\n const CellTag = isHeaderRow ? \"th\" : \"td\";\r\n return (\r\n <CellTag\r\n key={ci}\r\n scope={isHeaderRow ? \"col\" : undefined}\r\n style={{\r\n padding: typeof cellPaddingStyle === \"string\" ? cellPaddingStyle : `${cellPaddingStyle}px`,\r\n background: isHeaderRow ? (p.headerBg || \"#1a5fbe\") : isStriped ? (p.stripedBg || \"#f4f8ff\") : (p.cellBg || \"#ffffff\"),\r\n color: isHeaderRow ? (p.headerColor || \"#ffffff\") : \"inherit\",\r\n border: `1px solid ${p.cellBorder || \"#d0dff0\"}`,\r\n fontWeight: isHeaderRow ? 700 : 400,\r\n textAlign: \"left\",\r\n wordBreak: \"break-word\",\r\n }}\r\n >\r\n {cell}\r\n </CellTag>\r\n );\r\n })}\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n );\r\n }\r\n return null;\r\n}\r\n\r\n// ─── NESTED LAYOUT (columns inside a column) ─────────────────────────────────\r\nfunction NestedRowBlock({\r\n block,\r\n rowId,\r\n cellIdx,\r\n parentBlockIdx,\r\n /** When this layout sits inside another layout column, meta uses `contentIdx` + `inner` like other nested blocks. */\r\n selectionInner,\r\n editorId,\r\n selectedKey,\r\n selContentMeta,\r\n onSelectContent,\r\n onDropContent,\r\n onDeleteContent,\r\n onContextMenu,\r\n preview,\r\n C,\r\n}) {\r\n const p = block.props;\r\n const rowSelected =\r\n !preview &&\r\n selContentMeta &&\r\n selContentMeta.rowId === rowId &&\r\n selContentMeta.cellIdx === cellIdx &&\r\n selectedKey === block.id &&\r\n (selectionInner == null\r\n ? selContentMeta.contentIdx === parentBlockIdx && !selContentMeta.inner\r\n : selContentMeta.contentIdx === parentBlockIdx &&\r\n selContentMeta.inner &&\r\n selContentMeta.inner.cellIdx === selectionInner.cellIdx &&\r\n selContentMeta.inner.contentIdx === selectionInner.contentIdx);\r\n const rowStyle: CSSProperties = {\r\n padding: p.padding ?? 8,\r\n position: \"relative\",\r\n borderRadius: 4,\r\n outline: rowSelected ? `2px solid ${C.accent}` : \"2px solid transparent\",\r\n outlineOffset: 1,\r\n transition: \"outline .12s\",\r\n ...layoutSplitChromeBorder(C, preview),\r\n ...backgroundLayerStyle({\r\n bgColor: p.bgColor,\r\n bgImage: p.bgImage,\r\n bgSize: p.bgSize,\r\n bgRepeat: p.bgRepeat,\r\n bgPosition: p.bgPosition,\r\n bgGradient: p.bgGradient,\r\n }),\r\n };\r\n return (\r\n <div\r\n style={rowStyle}\r\n onClick={\r\n preview\r\n ? undefined\r\n : (e) => {\r\n e.stopPropagation();\r\n onSelectContent(\r\n block.id,\r\n rowId,\r\n cellIdx,\r\n parentBlockIdx,\r\n selectionInner ?? null,\r\n );\r\n }\r\n }\r\n >\r\n <div style={{ display: \"flex\", gap: p.gap ?? 12 }}>\r\n {(p.cells || []).map((innerBlocks, ici) => {\r\n const cS = getColumnPropsAt(p, ici);\r\n return (\r\n <div\r\n key={ici}\r\n style={{\r\n flex: p.ratios?.[ici] ?? 1,\r\n minWidth: 0,\r\n minHeight: preview ? undefined : DROP_HERE_HEIGHT_PX,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n ...layoutSplitChromeBorder(C, preview),\r\n ...backgroundLayerStyle(cS),\r\n padding: paddingCssLayout(cS.padding),\r\n borderRadius: radiusCssLayout(cS.borderRadius),\r\n position: \"relative\",\r\n }}\r\n >\r\n <Cell\r\n editorId={editorId}\r\n rowId={rowId}\r\n cellIdx={cellIdx}\r\n nest={{ parentBlockIdx }}\r\n innerCellIdx={ici}\r\n blocks={innerBlocks}\r\n selectedKey={selectedKey}\r\n selContentMeta={selContentMeta}\r\n onSelectContent={onSelectContent}\r\n onDropContent={onDropContent}\r\n onDeleteContent={onDeleteContent}\r\n onContextMenu={onContextMenu}\r\n preview={preview}\r\n C={C}\r\n />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── BLOCK ITEM — pointer-down selects; drag block surface to reorder / move ──\r\nfunction BlockItem({\r\n editorId,\r\n cb,\r\n ci,\r\n rowId,\r\n cellIdx,\r\n nest,\r\n innerCellIdx = 0,\r\n selectedKey,\r\n selContentMeta,\r\n onSelectContent,\r\n onDropContent,\r\n onDeleteContent,\r\n onContextMenu,\r\n preview,\r\n C,\r\n Line,\r\n dragAsRow = false,\r\n beginRowDrag,\r\n}) {\r\n const wrapperRef = useRef(null);\r\n const bid = editorId ? `${editorId}-block-${cb.id}` : undefined;\r\n\r\n const selectThisBlock = (e) => {\r\n if (!onSelectContent) return;\r\n e.stopPropagation();\r\n if (isSplitLayoutBlock(cb)) {\r\n onSelectContent(\r\n cb.id,\r\n rowId,\r\n cellIdx,\r\n nest ? nest.parentBlockIdx : ci,\r\n nest ? { cellIdx: innerCellIdx, contentIdx: ci } : null,\r\n );\r\n } else {\r\n onSelectContent(\r\n cb.id,\r\n rowId,\r\n cellIdx,\r\n nest ? nest.parentBlockIdx : ci,\r\n nest ? { cellIdx: innerCellIdx, contentIdx: ci } : null,\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n id={bid}\r\n ref={wrapperRef}\r\n style={{ position: \"relative\" }}\r\n onContextMenu={e => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onContextMenu && onContextMenu(\r\n e,\r\n rowId,\r\n cellIdx,\r\n ci,\r\n nest ? { parentBlockIdx: nest.parentBlockIdx, cellIdx: innerCellIdx, contentIdx: ci } : null,\r\n );\r\n }}\r\n >\r\n <div\r\n data-bidx={ci}\r\n draggable={!preview}\r\n title={\r\n preview\r\n ? undefined\r\n : dragAsRow\r\n ? \"Click to select · drag to reorder section\"\r\n : \"Click to select · drag to reorder or move\"\r\n }\r\n onPointerDown={(e) => {\r\n if (preview || e.button !== 0) return;\r\n selectThisBlock(e);\r\n }}\r\n onDragStart={(e) => {\r\n if (preview) return;\r\n e.stopPropagation();\r\n if (dragAsRow && beginRowDrag) {\r\n beginRowDrag(e);\r\n return;\r\n }\r\n e.dataTransfer.effectAllowed = \"move\";\r\n e.dataTransfer.setData(\r\n \"application/json\",\r\n JSON.stringify({\r\n moveContent: {\r\n fromRow: rowId,\r\n fromCell: cellIdx,\r\n fromIdx: ci,\r\n fromNested: nest ? { parentBlockIdx: nest.parentBlockIdx, innerCellIdx } : undefined,\r\n },\r\n }),\r\n );\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n style={{\r\n position: \"relative\",\r\n width: \"100%\",\r\n minWidth: 0,\r\n cursor: preview ? \"default\" : \"grab\",\r\n paddingLeft: 0,\r\n boxSizing: \"border-box\",\r\n }}\r\n >\r\n {isSplitLayoutBlock(cb) ? (\r\n <NestedRowBlock\r\n block={cb}\r\n rowId={rowId}\r\n cellIdx={cellIdx}\r\n parentBlockIdx={nest ? nest.parentBlockIdx : ci}\r\n selectionInner={nest ? { cellIdx: innerCellIdx, contentIdx: ci } : null}\r\n editorId={editorId}\r\n selectedKey={selectedKey}\r\n selContentMeta={selContentMeta}\r\n onSelectContent={onSelectContent}\r\n onDropContent={onDropContent}\r\n onDeleteContent={onDeleteContent}\r\n onContextMenu={onContextMenu}\r\n preview={preview}\r\n C={C}\r\n />\r\n ) : (\r\n <ContentBlock\r\n block={cb}\r\n selected={selectedKey === cb.id}\r\n onClick={undefined}\r\n preview={preview}\r\n C={C}\r\n />\r\n )}\r\n </div>\r\n\r\n <Line idx={ci + 1} />\r\n </div>\r\n );\r\n}\r\n\r\n// ─── CELL (positional drag-and-drop) ─────────────────────────────────────────\r\nfunction Cell({\r\n editorId,\r\n rowId,\r\n cellIdx,\r\n nest = undefined,\r\n innerCellIdx = 0,\r\n blocks,\r\n selectedKey,\r\n selContentMeta,\r\n onSelectContent,\r\n onDropContent,\r\n onDeleteContent,\r\n onContextMenu,\r\n preview,\r\n C,\r\n dragAsRow = false,\r\n beginRowDrag,\r\n}) {\r\n const [insertAt, setInsertAt] = useState(null);\r\n const cellRef = useRef(null);\r\n\r\n const calcIdx = useCallback((clientY) => {\r\n if (!cellRef.current) return blocks.length;\r\n const els = cellRef.current.querySelectorAll(\"[data-bidx]\");\r\n if (!els.length) return 0;\r\n for (let i = 0; i < els.length; i++) {\r\n const r = els[i].getBoundingClientRect();\r\n if (clientY < r.top + r.height / 2) return i;\r\n }\r\n return els.length;\r\n }, [blocks.length]);\r\n\r\n const handleDragOver = (e) => {\r\n try {\r\n const raw = e.dataTransfer.getData(\"application/json\");\r\n if (raw) {\r\n const data = JSON.parse(raw);\r\n if (data.moveRowId) return;\r\n }\r\n } catch {\r\n /* types may be unavailable until drop in some browsers */\r\n }\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setInsertAt(calcIdx(e.clientY));\r\n };\r\n const handleDragLeave = (e) => { if (!cellRef.current?.contains(e.relatedTarget)) setInsertAt(null); };\r\n const nestedPayload = nest ? { parentBlockIdx: nest.parentBlockIdx, innerCellIdx } : undefined;\r\n\r\n const handleDrop = (e) => {\r\n e.preventDefault(); e.stopPropagation();\r\n const idx = calcIdx(e.clientY); setInsertAt(null);\r\n try {\r\n const data = JSON.parse(e.dataTransfer.getData(\"application/json\") || \"{}\");\r\n if (data.moveRowId) return;\r\n if (data.contentType) {\r\n onDropContent(rowId, cellIdx, { kind: \"new\", contentType: data.contentType, insertAt: idx, nested: nestedPayload });\r\n } else if (data.moveContent) {\r\n onDropContent(rowId, cellIdx, { kind: \"move\", ...data.moveContent, insertAt: idx, nested: nestedPayload });\r\n }\r\n } catch { }\r\n };\r\n\r\n const Line = ({ idx }) => insertAt === idx ? (\r\n <div style={{ position: \"relative\", height: 3, margin: \"2px 0\", background: C.accent, borderRadius: 2, zIndex: 50, pointerEvents: \"none\" }}>\r\n <div style={{ position: \"absolute\", left: -4, top: \"50%\", transform: \"translateY(-50%)\", width: 8, height: 8, borderRadius: \"50%\", background: C.accent }} />\r\n <div style={{ position: \"absolute\", right: -4, top: \"50%\", transform: \"translateY(-50%)\", width: 8, height: 8, borderRadius: \"50%\", background: C.accent }} />\r\n </div>\r\n ) : null;\r\n\r\n const cellEmpty = !preview && blocks.length === 0;\r\n\r\n return (\r\n <div\r\n id={editorId ? `${editorId}-cell-${rowId}-${cellIdx}` : undefined}\r\n ref={cellRef} onDragOver={handleDragOver} onDragLeave={handleDragLeave} onDrop={handleDrop}\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n minHeight: preview ? undefined : cellEmpty ? DROP_HERE_HEIGHT_PX : 44,\r\n borderRadius: 4,\r\n ...(preview\r\n ? {}\r\n : insertAt !== null && !cellEmpty\r\n ? { border: `1px dotted ${C.accent}`, background: `${C.accent}0a` }\r\n : {}),\r\n background: insertAt !== null && !cellEmpty ? `${C.accent}0a` : \"transparent\",\r\n transition: \"border-color .15s,background .15s\",\r\n padding: preview ? 0 : 0,\r\n position: \"relative\",\r\n }}\r\n >\r\n {cellEmpty && (\r\n <div\r\n style={{\r\n height: DROP_HERE_HEIGHT_PX,\r\n minHeight: DROP_HERE_HEIGHT_PX,\r\n maxHeight: DROP_HERE_HEIGHT_PX,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n margin: 0,\r\n borderRadius: 6,\r\n boxSizing: \"border-box\",\r\n textAlign: \"center\",\r\n userSelect: \"none\",\r\n transition: \"color .15s, border-color .15s, background .15s, box-shadow .15s\",\r\n border:\r\n insertAt !== null\r\n ? `2px dashed ${C.accent}`\r\n : `2px dashed ${C.border}`,\r\n background: insertAt !== null ? `${C.accent}14` : `${C.canvas}`,\r\n boxShadow:\r\n insertAt !== null\r\n ? `inset 0 0 0 1px ${C.accent}22`\r\n : `inset 0 0 0 1px ${C.border}99`,\r\n color: insertAt !== null ? C.accent2 : C.muted,\r\n fontSize: 10,\r\n fontWeight: insertAt !== null ? 700 : 500,\r\n letterSpacing: \"0.02em\",\r\n }}\r\n >\r\n {insertAt !== null ? \"Release to drop\" : \"Drop here\"}\r\n </div>\r\n )}\r\n <Line idx={0} />\r\n {blocks.map((cb, ci) => (\r\n <Fragment key={cb.id}>\r\n <BlockItem\r\n editorId={editorId}\r\n cb={cb}\r\n ci={ci}\r\n rowId={rowId}\r\n cellIdx={cellIdx}\r\n nest={nest}\r\n innerCellIdx={innerCellIdx}\r\n selectedKey={selectedKey}\r\n selContentMeta={selContentMeta}\r\n onSelectContent={onSelectContent}\r\n onDropContent={onDropContent}\r\n onDeleteContent={onDeleteContent}\r\n onContextMenu={onContextMenu}\r\n preview={preview}\r\n C={C}\r\n Line={Line}\r\n dragAsRow={dragAsRow && blocks.length === 1 && ci === 0}\r\n beginRowDrag={beginRowDrag}\r\n />\r\n </Fragment>\r\n ))}\r\n\r\n </div>\r\n );\r\n}\r\n\r\n// ─── LAYOUT ROW ──────────────────────────────────────────────────────────────\r\nfunction LayoutRow({\r\n editorId,\r\n row,\r\n selected,\r\n onClick,\r\n selectedContentKey,\r\n selContentMeta,\r\n onSelectContent,\r\n onDropContent,\r\n onDeleteContent,\r\n onContextMenu,\r\n onLayoutContextMenu,\r\n setSelectedRowId,\r\n preview = false,\r\n rootContentRow = false,\r\n beginRowDrag,\r\n C,\r\n}) {\r\n const rowStyle: CSSProperties = {\r\n outline: selected && !preview ? `2px solid ${C.accent}` : \"2px solid transparent\",\r\n outlineOffset: 2, borderRadius: 5, transition: \"outline .12s\",\r\n padding: row.padding, position: \"relative\",\r\n ...backgroundLayerStyle({\r\n bgColor: row.bgColor,\r\n bgImage: row.bgImage,\r\n bgSize: row.bgSize,\r\n bgRepeat: row.bgRepeat,\r\n bgPosition: row.bgPosition,\r\n bgGradient: row.bgGradient,\r\n }),\r\n };\r\n return (\r\n <div\r\n id={editorId ? `${editorId}-layout-${row.id}` : undefined}\r\n onClick={preview ? undefined : onClick}\r\n onPointerDown={\r\n preview || !onClick\r\n ? undefined\r\n : (e) => {\r\n if (e.button !== 0) return;\r\n /** Row shell only — columns/cells stop propagation. Draggable rows often omit `click`; pointerdown still fires. */\r\n if (e.target !== e.currentTarget) return;\r\n onClick();\r\n }\r\n }\r\n onContextMenu={\r\n preview || !onLayoutContextMenu\r\n ? undefined\r\n : (e) => {\r\n onLayoutContextMenu(e, row.id);\r\n }\r\n }\r\n style={rowStyle}\r\n >\r\n <div style={{ display: \"flex\", gap: row.gap }}>\r\n {row.cells.map((cellBlocks, ci) => {\r\n const cS = getColumnPropsAt(row, ci);\r\n return (\r\n <div key={ci} id={editorId ? `${editorId}-col-${row.id}-${ci}` : undefined}\r\n style={{\r\n flex: row.ratios[ci] ?? 1,\r\n minHeight: preview ? 50 : DROP_HERE_HEIGHT_PX,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n ...backgroundLayerStyle(cS),\r\n padding: paddingCssLayout(cS.padding),\r\n borderRadius: radiusCssLayout(cS.borderRadius),\r\n transition: \"all 0.2s\",\r\n position: \"relative\",\r\n }}\r\n onClick={(e) => {\r\n if (preview) return;\r\n e.stopPropagation();\r\n // Select row AND column simultaneously\r\n setSelectedRowId(row.id);\r\n onSelectContent(null, row.id, ci, -1, null);\r\n }}\r\n >\r\n <Cell\r\n editorId={editorId}\r\n rowId={row.id}\r\n cellIdx={ci}\r\n blocks={cellBlocks}\r\n selectedKey={selectedContentKey}\r\n selContentMeta={selContentMeta}\r\n onSelectContent={onSelectContent}\r\n onDropContent={onDropContent}\r\n onDeleteContent={onDeleteContent}\r\n onContextMenu={onContextMenu}\r\n preview={preview}\r\n C={C}\r\n dragAsRow={rootContentRow && ci === 0}\r\n beginRowDrag={beginRowDrag}\r\n />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// ─── CANVAS ROW ───────────────────────────────────────────────────────────────\r\nexport type CanvasRowProps = {\r\n editorId: string;\r\n row: any;\r\n ri: number;\r\n selectedRowId: any;\r\n selContentMeta: any;\r\n dragOver: any;\r\n draggingRowId: string | null;\r\n C: any;\r\n setDragOver: (v: any) => void;\r\n handleRowDrop: (ri: number, e: any) => void;\r\n setRowDrag: (id: string | null) => void;\r\n setSelectedRowId: (v: any) => void;\r\n setSelContentId: (v: any) => void;\r\n setSelMeta: (v: any) => void;\r\n selectContent: (...args: any[]) => void;\r\n dropContent: (...args: any[]) => void;\r\n deleteContent: (...args: any[]) => void;\r\n handleContextMenu: (...args: any[]) => void;\r\n handleLayoutContextMenu: (...args: any[]) => void;\r\n selContentId: any;\r\n};\r\n\r\nconst CanvasRow: FC<CanvasRowProps> = ({\r\n editorId,\r\n row,\r\n ri,\r\n selectedRowId,\r\n selContentMeta: rowSelContentMeta,\r\n dragOver,\r\n draggingRowId,\r\n C,\r\n setDragOver,\r\n handleRowDrop,\r\n setRowDrag,\r\n setSelectedRowId,\r\n setSelContentId,\r\n setSelMeta,\r\n selectContent,\r\n dropContent,\r\n deleteContent,\r\n handleContextMenu,\r\n handleLayoutContextMenu,\r\n selContentId,\r\n}) => {\r\n const rowSelected = selectedRowId === row.id;\r\n const rid = (s) => (editorId ? `${editorId}-${s}` : undefined);\r\n const dropH = dragOver === ri || dragOver === ri + 1 ? 28 : 10;\r\n const rowBodyRef = useRef<HTMLDivElement>(null);\r\n const rootContentRow = isRootContentRow(row);\r\n\r\n const beginRowDrag = useCallback(\r\n (e: DragEvent) => {\r\n e.stopPropagation();\r\n e.dataTransfer.effectAllowed = \"move\";\r\n e.dataTransfer.setData(\r\n \"application/json\",\r\n JSON.stringify({ moveRowId: row.id }),\r\n );\r\n setRowDrag(row.id);\r\n },\r\n [row.id, setRowDrag],\r\n );\r\n\r\n const rowDragOver = useCallback(\r\n (e: DragEvent) => {\r\n if (!draggingRowId || draggingRowId === row.id) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const el = rowBodyRef.current;\r\n if (!el) {\r\n setDragOver(ri);\r\n return;\r\n }\r\n const rect = el.getBoundingClientRect();\r\n setDragOver(e.clientY < rect.top + rect.height / 2 ? ri : ri + 1);\r\n },\r\n [draggingRowId, row.id, ri, setDragOver],\r\n );\r\n\r\n const rowDrop = useCallback(\r\n (e: DragEvent) => {\r\n if (!draggingRowId) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n const el = rowBodyRef.current;\r\n let targetIdx = ri;\r\n if (el) {\r\n const rect = el.getBoundingClientRect();\r\n targetIdx = e.clientY < rect.top + rect.height / 2 ? ri : ri + 1;\r\n }\r\n handleRowDrop(targetIdx, e);\r\n },\r\n [draggingRowId, ri, handleRowDrop],\r\n );\r\n\r\n return (\r\n <div\r\n id={rid(`canvas-row-${row.id}`)}\r\n style={{ display: \"flex\", alignItems: \"stretch\", gap: 0, margin: \"2px 0\" }}\r\n >\r\n <div\r\n draggable\r\n title=\"Drag to reorder section\"\r\n onDragStart={beginRowDrag}\r\n onDragEnd={() => setRowDrag(null)}\r\n onPointerDown={(e) => e.stopPropagation()}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setSelectedRowId(row.id);\r\n setSelContentId(null);\r\n setSelMeta(null);\r\n }}\r\n onContextMenu={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n handleLayoutContextMenu(e, row.id);\r\n }}\r\n style={{\r\n width: 20,\r\n flexShrink: 0,\r\n cursor: \"grab\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n color: rowSelected ? C.accent : C.muted,\r\n fontSize: 12,\r\n fontWeight: 700,\r\n letterSpacing: -3,\r\n userSelect: \"none\",\r\n opacity: rowSelected ? 1 : 0.5,\r\n }}\r\n >\r\n ⋮⋮\r\n </div>\r\n\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div\r\n id={rid(`row-drop-before-${ri}`)}\r\n onDragOver={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setDragOver(ri);\r\n }}\r\n onDragLeave={() => setDragOver(null)}\r\n onDrop={(e) => handleRowDrop(ri, e)}\r\n style={{\r\n height: dropH,\r\n background: dragOver === ri ? `${C.accent}25` : \"transparent\",\r\n border: dragOver === ri ? `2px dashed ${C.accent}` : \"2px solid transparent\",\r\n borderRadius: 4,\r\n transition: \"all .12s\",\r\n boxSizing: \"border-box\",\r\n }}\r\n />\r\n\r\n <div\r\n ref={rowBodyRef}\r\n id={rid(`row-body-${row.id}`)}\r\n onDragOver={rowDragOver}\r\n onDrop={rowDrop}\r\n style={{\r\n position: \"relative\",\r\n width: \"100%\",\r\n minWidth: 0,\r\n boxSizing: \"border-box\",\r\n outline:\r\n draggingRowId && draggingRowId !== row.id && (dragOver === ri || dragOver === ri + 1)\r\n ? `2px dashed ${C.accent}`\r\n : undefined,\r\n outlineOffset: 2,\r\n borderRadius: 6,\r\n }}\r\n >\r\n <div id={rid(`row-layout-wrap-${row.id}`)} style={{ width: \"100%\", minWidth: 0 }}>\r\n <LayoutRow\r\n editorId={editorId}\r\n row={row}\r\n selected={rowSelected}\r\n setSelectedRowId={setSelectedRowId}\r\n onClick={() => {\r\n setSelectedRowId(row.id);\r\n setSelContentId(null);\r\n setSelMeta(null);\r\n }}\r\n selectedContentKey={selContentId}\r\n selContentMeta={rowSelContentMeta}\r\n onSelectContent={selectContent}\r\n onDropContent={dropContent}\r\n onDeleteContent={deleteContent}\r\n onContextMenu={handleContextMenu}\r\n onLayoutContextMenu={handleLayoutContextMenu}\r\n rootContentRow={rootContentRow}\r\n beginRowDrag={beginRowDrag}\r\n C={C}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport { CanvasRow };\r\n","import { useRef, useState, useEffect, useMemo, Fragment, type CSSProperties, type FC, type ReactNode } from \"react\";\nimport {\n AlignCenter,\n AlignJustify,\n AlignLeft,\n AlignRight,\n Image as ImageIcon,\n Upload as UploadIcon,\n Droplets as SolidIcon,\n Blend as GradientIcon,\n Scaling,\n Crosshair,\n} from \"lucide-react\";\nimport { ALL_NETWORKS } from \"../../constants\";\nimport { videoSrcForEditorDisplay } from \"../../lib/htmlUtils\";\nimport { TextRichEditor } from \"./TextRichEditor\";\nimport { normalizeRichHtmlForStorage } from \"../../lib/htmlUtils\";\nimport {\n getColumnPropsAt,\n getColumns,\n patchColumnPropsAt,\n withColumnsOnly,\n} from \"../../lib/columnProps\";\nimport { ColorSwatchGrid } from \"./ColorSwatchGrid\";\n\n/** UI label (internal key stays `twitter` for saved designs). */\nfunction socialNetworkLabel(network) {\n return network === \"twitter\" ? \"X\" : network;\n}\n\nconst pad2 = (n: number) => String(n).padStart(2, \"0\");\n\n/** Timer `endDate`: ISO string or legacy `YYYY-MM-DD` (local midnight). */\nfunction parseTimerEndDate(value: string | undefined): Date {\n const s = (value || \"\").trim();\n if (!s) return new Date(Date.now() + 7 * 864e5);\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(s)) {\n const [y, m, d] = s.split(\"-\").map(Number);\n return new Date(y, m - 1, d, 0, 0, 0, 0);\n }\n const t = Date.parse(s);\n if (!Number.isNaN(t)) return new Date(t);\n return new Date(Date.now() + 7 * 864e5);\n}\n\nfunction formatDateInputLocal(d: Date): string {\n return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\nfunction formatTimeInputLocal(d: Date): string {\n return `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\n/** Persist as UTC ISO so countdown / export stay consistent. */\nfunction combineLocalDateTime(dateStr: string, timeStr: string): string {\n const [y, m, d] = dateStr.split(\"-\").map(Number);\n const parts = (timeStr || \"00:00\").split(\":\");\n const hh = Number(parts[0]) || 0;\n const mm = Number(parts[1]) || 0;\n const dt = new Date(y, (m || 1) - 1, d || 1, hh, mm, 0, 0);\n return dt.toISOString();\n}\n\nconst PR: FC<{ label: ReactNode; children: ReactNode; C: Record<string, string> }> = ({ label, children, C }) => (\n <div style={{ marginBottom: 11 }}>\n <label\n style={{\n display: \"block\",\n fontSize: 10,\n fontWeight: 700,\n color: C.muted,\n textTransform: \"uppercase\",\n letterSpacing: \".07em\",\n marginBottom: 3,\n }}\n >\n {label}\n </label>\n {children}\n </div>\n);\nfunction useIS(C) {\n return {\n IS: { width: \"100%\", padding: \"6px 8px\", border: `1px solid ${C.border}`, borderRadius: 5, background: C.inputBg, color: C.text, fontSize: 13, boxSizing: \"border-box\" as const, outline: \"none\" },\n CI: { padding: \"2px 4px\", height: 28, cursor: \"pointer\", border: `1px solid ${C.border}`, borderRadius: 5, background: C.inputBg },\n };\n}\n\nfunction ColorField({\n label,\n value,\n onChange,\n placeholder,\n emptyAsTransparent = false,\n C,\n}: {\n label: ReactNode;\n value: string | undefined;\n onChange: (next: string) => void;\n placeholder?: string;\n emptyAsTransparent?: boolean;\n C: any;\n}) {\n const { IS, CI } = useIS(C);\n const v = (value || \"\").trim();\n const normColorForInput = v || \"#000000\";\n return (\n <PR label={label} C={C}>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\n <ColorSwatchGrid\n value={v}\n C={C}\n compact\n onPick={(hex) => onChange(emptyAsTransparent && hex.toLowerCase() === \"#ffffff\" ? \"\" : hex)}\n />\n <div style={{ display: \"flex\", gap: 5, flex: \"0 0 auto\", alignItems: \"center\" }}>\n <input\n type=\"color\"\n style={CI}\n value={normColorForInput}\n onChange={(e) => onChange(emptyAsTransparent && e.target.value.toLowerCase() === \"#ffffff\" ? \"\" : e.target.value)}\n />\n <input\n type=\"text\"\n style={{ ...IS, width: 140 }}\n placeholder={placeholder}\n value={v}\n onChange={(e) => onChange(e.target.value)}\n />\n </div>\n </div>\n </PR>\n );\n}\n\nfunction ImageUrlUploadField({\n label,\n value,\n onChange,\n onUpload,\n accept = \"image/*\",\n buttonLabel = \"Upload\",\n inputId,\n C,\n}: {\n label: ReactNode;\n value: string;\n onChange: (next: string) => void;\n onUpload?: (file: File) => Promise<string>;\n accept?: string;\n buttonLabel?: ReactNode;\n inputId: string;\n C: any;\n}) {\n const { IS } = useIS(C);\n return (\n <PR label={label} C={C}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n <input\n type=\"text\"\n style={IS}\n placeholder=\"https://…\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n />\n {onUpload ? (\n <>\n <input\n id={inputId}\n type=\"file\"\n accept={accept}\n style={{ display: \"none\" }}\n onChange={async (e) => {\n const file = e.target.files?.[0];\n if (!file) return;\n try {\n const url = await onUpload(file);\n onChange(url);\n } catch (err) {\n console.error(\"Upload failed\", err);\n alert(\"Upload failed\");\n }\n e.target.value = \"\";\n }}\n />\n <button\n type=\"button\"\n onClick={() => document.getElementById(inputId)?.click()}\n style={{\n background: C.surface,\n border: `1px solid ${C.border}`,\n color: C.accent,\n borderRadius: 5,\n cursor: \"pointer\",\n fontSize: 11,\n padding: \"4px 10px\",\n width: \"100%\",\n fontWeight: 600,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n <UploadIcon size={14} strokeWidth={2.25} aria-hidden />\n <span>{buttonLabel}</span>\n </button>\n </>\n ) : null}\n </div>\n </PR>\n );\n}\n\nfunction DynamicGradientField({\n label,\n value,\n onChange,\n defaults,\n C,\n}: {\n label: ReactNode;\n value: any;\n onChange: (next: any) => void;\n defaults: { colors: string[] };\n C: any;\n}) {\n const { IS, CI } = useIS(C);\n\n const normalize = (g: any) => {\n const angle = typeof g?.angle === \"number\" ? g.angle : 135;\n const colorsRaw = Array.isArray(g?.colors) ? g.colors.map((x: any) => String(x || \"\").trim()).filter(Boolean) : [];\n const stopsRaw = Array.isArray(g?.stops) ? g.stops.map((x: any) => Number(x)) : [];\n let colors = colorsRaw.length >= 2 ? colorsRaw : defaults.colors.slice(0, Math.max(2, defaults.colors.length));\n colors = colors.slice(0, 8);\n let stops =\n stopsRaw.length === colors.length\n ? stopsRaw\n : colors.map((_, i) => Math.round((i / Math.max(1, colors.length - 1)) * 100));\n stops = stops.map((n) => (Number.isFinite(n) ? Math.max(0, Math.min(100, n)) : 0));\n\n // Sort by stop\n const pairs = colors.map((c, i) => ({ c, s: stops[i] })).sort((a, b) => a.s - b.s);\n return { angle, colors: pairs.map((p) => p.c), stops: pairs.map((p) => p.s) };\n };\n\n const g = normalize(value || {});\n const canRemove = g.colors.length > 2;\n const canAdd = g.colors.length < 8;\n\n const setStop = (idx: number, nextStop: number) => {\n const stops = [...g.stops];\n stops[idx] = Math.max(0, Math.min(100, Math.round(nextStop)));\n onChange(normalize({ ...g, stops }));\n };\n const setColor = (idx: number, next: string) => {\n const colors = [...g.colors];\n colors[idx] = next;\n onChange(normalize({ ...g, colors }));\n };\n const removeStop = (idx: number) => {\n if (!canRemove) return;\n const colors = g.colors.filter((_, i) => i !== idx);\n const stops = g.stops.filter((_, i) => i !== idx);\n onChange(normalize({ ...g, colors, stops }));\n };\n const addStop = () => {\n if (!canAdd) return;\n const colors = [...g.colors, g.colors[g.colors.length - 1] || \"#ffffff\"];\n const stops = [...g.stops, 100];\n onChange(normalize({ ...g, colors, stops }));\n };\n\n const preview = `linear-gradient(${g.angle}deg, ${g.colors.map((c, i) => `${c} ${g.stops[i]}%`).join(\", \")})`;\n\n return (\n <PR label={label} C={C}>\n <div style={{ height: 28, borderRadius: 8, border: `1px solid ${C.border}`, background: preview, marginBottom: 10 }} />\n\n <PR label=\"Angle\" C={C}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input\n type=\"range\"\n min={0}\n max={360}\n step={1}\n value={g.angle}\n onChange={(e) => onChange({ ...g, angle: +e.target.value })}\n style={{ width: \"100%\" }}\n />\n <input type=\"number\" style={IS} min={0} max={360} step={1} value={g.angle} onChange={(e) => onChange({ ...g, angle: +e.target.value })} />\n <div style={{ fontSize: 11, fontWeight: 800, color: C.muted, textAlign: \"center\" }}>°</div>\n </div>\n </PR>\n\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 6 }}>\n <div style={{ fontSize: 10, fontWeight: 800, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".06em\" }}>Stops</div>\n <button\n type=\"button\"\n onClick={addStop}\n disabled={!canAdd}\n style={{\n background: C.surface,\n border: `1px solid ${C.border}`,\n color: canAdd ? C.accent : C.muted,\n borderRadius: 6,\n cursor: canAdd ? \"pointer\" : \"not-allowed\",\n fontSize: 11,\n padding: \"6px 10px\",\n fontWeight: 700,\n opacity: canAdd ? 1 : 0.6,\n }}\n >\n + Add stop\n </button>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n {g.colors.map((c, i) => (\n <div key={i} style={{ border: `1px solid ${C.border}`, borderRadius: 10, background: C.surface, padding: 10 }}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"28px 1fr 78px 28px 28px\", gap: 6, alignItems: \"center\" }}>\n <input type=\"color\" style={CI} value={c} onChange={(e) => setColor(i, e.target.value)} />\n <input type=\"text\" style={IS} value={c} onChange={(e) => setColor(i, e.target.value)} />\n <input type=\"number\" style={IS} min={0} max={100} step={1} value={g.stops[i]} onChange={(e) => setStop(i, +e.target.value)} />\n <div style={{ fontSize: 11, fontWeight: 800, color: C.muted, textAlign: \"center\" }}>%</div>\n <button\n type=\"button\"\n onClick={() => removeStop(i)}\n disabled={!canRemove}\n title=\"Remove stop\"\n aria-label=\"Remove stop\"\n style={{\n width: 28,\n height: 28,\n borderRadius: 8,\n border: `1px solid ${canRemove ? C.border : \"transparent\"}`,\n background: canRemove ? \"transparent\" : \"transparent\",\n color: canRemove ? C.danger : C.muted,\n cursor: canRemove ? \"pointer\" : \"not-allowed\",\n fontWeight: 900,\n }}\n >\n ×\n </button>\n </div>\n <div style={{ marginTop: 8 }}>\n <input type=\"range\" min={0} max={100} step={1} value={g.stops[i]} onChange={(e) => setStop(i, +e.target.value)} style={{ width: \"100%\" }} />\n </div>\n </div>\n ))}\n </div>\n\n <div style={{ display: \"flex\", gap: 6, marginTop: 10 }}>\n <button\n type=\"button\"\n onClick={() => onChange(null)}\n style={{\n background: C.surface,\n border: `1px solid ${C.border}`,\n color: C.muted,\n borderRadius: 6,\n cursor: \"pointer\",\n fontSize: 11,\n padding: \"6px 10px\",\n width: \"100%\",\n }}\n >\n Disable gradient\n </button>\n </div>\n </PR>\n );\n}\n\nconst ALIGN_ICON_SIZE = 15;\nfunction AlignButtons({\n value,\n onChange,\n options,\n C,\n}: {\n value: string | undefined;\n onChange: (next: string) => void;\n options: Array<\"left\" | \"center\" | \"right\" | \"justify\">;\n C: any;\n}) {\n const current = (value || \"left\") as string;\n const btnStyle = (active: boolean) => ({\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 32,\n height: 30,\n borderRadius: 6,\n border: `1px solid ${active ? C.accent : C.border}`,\n background: active ? `${C.accent}18` : C.surface,\n color: active ? C.accent : C.text,\n cursor: \"pointer\",\n padding: 0,\n });\n const items: Array<[\"left\" | \"center\" | \"right\" | \"justify\", any, string]> = [\n [\"left\", AlignLeft, \"Align left\"],\n [\"center\", AlignCenter, \"Align center\"],\n [\"right\", AlignRight, \"Align right\"],\n [\"justify\", AlignJustify, \"Justify\"],\n ];\n return (\n <PR label=\"Alignment\" C={C}>\n <div style={{ display: \"flex\", gap: 6, flexWrap: \"wrap\" }}>\n {items\n .filter(([k]) => options.includes(k))\n .map(([k, Icon, title]) => (\n <button\n key={k}\n type=\"button\"\n title={title}\n aria-label={title}\n onClick={() => onChange(k)}\n style={btnStyle(current === k)}\n >\n <Icon size={ALIGN_ICON_SIZE} strokeWidth={2.25} aria-hidden />\n </button>\n ))}\n </div>\n </PR>\n );\n}\n\nfunction clampNum(n: number, mn?: number, mx?: number) {\n if (Number.isNaN(n) || !Number.isFinite(n)) return mn ?? 0;\n if (typeof mn === \"number\" && n < mn) return mn;\n if (typeof mx === \"number\" && n > mx) return mx;\n return n;\n}\n\nfunction NumRangePx({\n label,\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n C,\n}: {\n label: string;\n value: number;\n onChange: (nextValue: number) => void;\n min?: number;\n max?: number;\n step?: number;\n C: any;\n}) {\n const { IS } = useIS(C);\n const v = clampNum(typeof value === \"number\" ? value : 0, min, max);\n return (\n <PR label={label} C={C}>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={v}\n onChange={(e) => onChange(clampNum(+e.target.value, min, max))}\n style={{ width: \"100%\" }}\n />\n <input\n type=\"number\"\n style={{ ...IS, padding: \"6px 8px\" }}\n min={min}\n max={max}\n step={step}\n value={v}\n onChange={(e) => onChange(clampNum(+e.target.value, min, max))}\n />\n </div>\n </PR>\n );\n}\n\nfunction DividerStyleButtons({\n value,\n onChange,\n C,\n}: {\n value: \"solid\" | \"dashed\" | \"dotted\" | string | undefined;\n onChange: (next: \"solid\" | \"dashed\" | \"dotted\") => void;\n C: any;\n}) {\n const cur = value === \"dashed\" || value === \"dotted\" || value === \"solid\" ? value : \"solid\";\n const btn = (active: boolean) => ({\n flex: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 32,\n borderRadius: 8,\n border: `1px solid ${active ? C.accent : C.border}`,\n background: active ? `${C.accent}18` : C.surface,\n cursor: \"pointer\",\n padding: 0,\n });\n const line = (style: \"solid\" | \"dashed\" | \"dotted\", active: boolean) => ({\n width: 28,\n height: 0,\n borderTop: `3px ${style} ${active ? C.accent : C.muted}`,\n });\n return (\n <PR label=\"Border style\" C={C}>\n <div style={{ display: \"flex\", gap: 6 }}>\n {([\"solid\", \"dashed\", \"dotted\"] as const).map((s) => (\n <button key={s} type=\"button\" onClick={() => onChange(s)} title={s} aria-label={s} style={btn(cur === s)}>\n <span style={line(s, cur === s)} />\n </button>\n ))}\n </div>\n </PR>\n );\n}\n\nfunction MarginEditor({\n value,\n onChange,\n C,\n}: {\n value: { top: number; right: number; bottom: number; left: number } | undefined;\n onChange: (next: { top: number; right: number; bottom: number; left: number }) => void;\n C: any;\n}) {\n const v = value || { top: 0, right: 0, bottom: 0, left: 0 };\n const [linked, setLinked] = useState(true);\n const setAll = (n: number) => onChange({ top: n, right: n, bottom: n, left: n });\n const setSide = (k: \"top\" | \"right\" | \"bottom\" | \"left\", n: number) => {\n if (linked) setAll(n);\n else onChange({ ...v, [k]: n });\n };\n const allSame = v.top === v.right && v.top === v.bottom && v.top === v.left;\n return (\n <PR label=\"Margin\" C={C}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 6 }}>\n <span style={{ color: C.muted, fontSize: 12 }}>{linked ? \"All sides together\" : \"Edit sides individually\"}</span>\n <label style={{ display: \"inline-flex\", alignItems: \"center\", gap: 7, cursor: \"pointer\" }} title=\"Toggle all/individual\">\n <span style={{ fontSize: 10, fontWeight: 800, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".06em\" }}>\n {linked ? \"All\" : \"Sides\"}\n </span>\n <input type=\"checkbox\" checked={linked} onChange={(e) => setLinked(e.target.checked)} style={{ width: 15, height: 15, accentColor: C.accent }} />\n </label>\n </div>\n\n {linked ? (\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input\n type=\"range\"\n min={0}\n max={160}\n step={1}\n value={allSame ? v.top : 0}\n onChange={(e) => setAll(+e.target.value)}\n style={{ width: \"100%\" }}\n />\n <input\n type=\"number\"\n style={useIS(C).IS}\n min={0}\n max={400}\n step={1}\n value={allSame ? v.top : 0}\n onChange={(e) => setAll(+e.target.value)}\n />\n </div>\n ) : (\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 8 }}>\n {(\n [\n [\"top\", \"Top\"],\n [\"right\", \"Right\"],\n [\"bottom\", \"Bottom\"],\n [\"left\", \"Left\"],\n ] as const\n ).map(([k, lbl]) => (\n <div key={k} style={{ border: `1px solid ${C.border}`, borderRadius: 8, padding: 8, background: C.surface }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".07em\", marginBottom: 6 }}>\n {lbl}\n </div>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input type=\"range\" min={0} max={160} step={1} value={v[k]} onChange={(e) => setSide(k, +e.target.value)} style={{ width: \"100%\" }} />\n <input type=\"number\" style={useIS(C).IS} min={0} max={400} step={1} value={v[k]} onChange={(e) => setSide(k, +e.target.value)} />\n </div>\n </div>\n ))}\n </div>\n )}\n </PR>\n );\n}\n\nfunction PaddingEditor({\n label = \"Padding\",\n value,\n onChange,\n C,\n}: {\n label?: ReactNode;\n value: number | { top: number; right: number; bottom: number; left: number } | undefined;\n onChange: (next: { top: number; right: number; bottom: number; left: number } | number) => void;\n C: any;\n}) {\n const { IS } = useIS(C);\n const vObj =\n typeof value === \"number\"\n ? { top: value, right: value, bottom: value, left: value }\n : value || { top: 0, right: 0, bottom: 0, left: 0 };\n const [linked, setLinked] = useState(true);\n const setAll = (n: number) => onChange({ top: n, right: n, bottom: n, left: n });\n const setSide = (k: \"top\" | \"right\" | \"bottom\" | \"left\", n: number) => {\n if (linked) setAll(n);\n else onChange({ ...vObj, [k]: n });\n };\n const allSame = vObj.top === vObj.right && vObj.top === vObj.bottom && vObj.top === vObj.left;\n return (\n <PR label={label} C={C}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 6 }}>\n <span style={{ color: C.muted, fontSize: 12 }}>{linked ? \"All sides together\" : \"Edit sides individually\"}</span>\n <label style={{ display: \"inline-flex\", alignItems: \"center\", gap: 7, cursor: \"pointer\" }} title=\"Toggle all/individual\">\n <span style={{ fontSize: 10, fontWeight: 800, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".06em\" }}>\n {linked ? \"All\" : \"Sides\"}\n </span>\n <input type=\"checkbox\" checked={linked} onChange={(e) => setLinked(e.target.checked)} style={{ width: 15, height: 15, accentColor: C.accent }} />\n </label>\n </div>\n\n {linked ? (\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input type=\"range\" min={0} max={160} step={1} value={allSame ? vObj.top : 0} onChange={(e) => setAll(+e.target.value)} style={{ width: \"100%\" }} />\n <input type=\"number\" style={IS} min={0} max={400} step={1} value={allSame ? vObj.top : 0} onChange={(e) => setAll(+e.target.value)} />\n </div>\n ) : (\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 8 }}>\n {(\n [\n [\"top\", \"Top\"],\n [\"right\", \"Right\"],\n [\"bottom\", \"Bottom\"],\n [\"left\", \"Left\"],\n ] as const\n ).map(([k, lbl]) => (\n <div key={k} style={{ border: `1px solid ${C.border}`, borderRadius: 8, padding: 8, background: C.surface }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".07em\", marginBottom: 6 }}>\n {lbl}\n </div>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input type=\"range\" min={0} max={160} step={1} value={vObj[k]} onChange={(e) => setSide(k, +e.target.value)} style={{ width: \"100%\" }} />\n <input type=\"number\" style={IS} min={0} max={400} step={1} value={vObj[k]} onChange={(e) => setSide(k, +e.target.value)} />\n </div>\n </div>\n ))}\n </div>\n )}\n </PR>\n );\n}\n\nfunction BorderRadiusEditor({\n label = \"Border Radius\",\n value,\n onChange,\n C,\n}: {\n label?: ReactNode;\n value: number | { tl: number; tr: number; br: number; bl: number } | undefined;\n onChange: (next: { tl: number; tr: number; br: number; bl: number } | number) => void;\n C: any;\n}) {\n const { IS } = useIS(C);\n const vObj =\n typeof value === \"number\"\n ? { tl: value, tr: value, br: value, bl: value }\n : value || { tl: 0, tr: 0, br: 0, bl: 0 };\n const [linked, setLinked] = useState(true);\n const setAll = (n: number) => onChange({ tl: n, tr: n, br: n, bl: n });\n const setCorner = (k: \"tl\" | \"tr\" | \"br\" | \"bl\", n: number) => {\n if (linked) setAll(n);\n else onChange({ ...vObj, [k]: n });\n };\n const allSame = vObj.tl === vObj.tr && vObj.tl === vObj.br && vObj.tl === vObj.bl;\n const rangeMax = 80;\n return (\n <PR label={label} C={C}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 6 }}>\n <span style={{ color: C.muted, fontSize: 12 }}>{linked ? \"All corners together\" : \"Edit corners individually\"}</span>\n <label style={{ display: \"inline-flex\", alignItems: \"center\", gap: 7, cursor: \"pointer\" }} title=\"Toggle all/individual\">\n <span style={{ fontSize: 10, fontWeight: 800, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".06em\" }}>\n {linked ? \"All\" : \"Corners\"}\n </span>\n <input type=\"checkbox\" checked={linked} onChange={(e) => setLinked(e.target.checked)} style={{ width: 15, height: 15, accentColor: C.accent }} />\n </label>\n </div>\n\n {linked ? (\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input type=\"range\" min={0} max={rangeMax} step={1} value={allSame ? vObj.tl : 0} onChange={(e) => setAll(+e.target.value)} style={{ width: \"100%\" }} />\n <input type=\"number\" style={IS} min={0} max={400} step={1} value={allSame ? vObj.tl : 0} onChange={(e) => setAll(+e.target.value)} />\n </div>\n ) : (\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 8 }}>\n {(\n [\n [\"tl\", \"Top left\"],\n [\"tr\", \"Top right\"],\n [\"br\", \"Bottom right\"],\n [\"bl\", \"Bottom left\"],\n ] as const\n ).map(([k, lbl]) => (\n <div key={k} style={{ border: `1px solid ${C.border}`, borderRadius: 8, padding: 8, background: C.surface }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".07em\", marginBottom: 6 }}>\n {lbl}\n </div>\n <div style={{ display: \"grid\", gridTemplateColumns: \"1fr 78px\", gap: 6, alignItems: \"center\" }}>\n <input type=\"range\" min={0} max={rangeMax} step={1} value={vObj[k]} onChange={(e) => setCorner(k, +e.target.value)} style={{ width: \"100%\" }} />\n <input type=\"number\" style={IS} min={0} max={400} step={1} value={vObj[k]} onChange={(e) => setCorner(k, +e.target.value)} />\n </div>\n </div>\n ))}\n </div>\n )}\n </PR>\n );\n}\n\nfunction BgModeButtons({\n value,\n onChange,\n C,\n}: {\n /** `null` = no type chosen yet — no option appears selected. */\n value: \"solid\" | \"image\" | \"gradient\" | null;\n onChange: (next: \"solid\" | \"image\" | \"gradient\") => void;\n C: any;\n}) {\n const btn = (active: boolean) => ({\n flex: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 34,\n borderRadius: 10,\n border: `1px solid ${active ? C.accent : C.border}`,\n background: active ? `${C.accent}18` : C.surface,\n color: active ? C.accent : C.muted,\n cursor: \"pointer\",\n gap: 8,\n fontSize: 12,\n fontWeight: 700,\n });\n const item = (k: \"solid\" | \"image\" | \"gradient\", Icon: any, label: string) => (\n <button key={k} type=\"button\" onClick={() => onChange(k)} style={btn(value != null && value === k)} title={label} aria-label={label}>\n <Icon size={16} strokeWidth={2.25} aria-hidden />\n <span>{label}</span>\n </button>\n );\n return (\n <PR label=\"Background type\" C={C}>\n <div style={{ display: \"flex\", gap: 8 }}>\n {item(\"solid\", SolidIcon, \"Color\")}\n {item(\"gradient\", GradientIcon, \"Gradient\")}\n {item(\"image\", ImageIcon, \"Image\")}\n </div>\n </PR>\n );\n}\n\nfunction blockBgKeys(variant: \"surface\" | \"backdrop\") {\n if (variant === \"surface\") {\n return {\n color: \"bgColor\",\n image: \"bgImage\",\n gradient: \"bgGradient\",\n size: \"bgSize\",\n repeat: \"bgRepeat\",\n position: \"bgPosition\",\n } as const;\n }\n return {\n color: \"backdropColor\",\n image: \"backdropImage\",\n gradient: \"backdropGradient\",\n size: \"backdropSize\",\n repeat: \"backdropRepeat\",\n position: \"backdropPosition\",\n } as const;\n}\n\n/** Solid / gradient / image behind block content (or backdrop behind button/timer). */\nfunction BlockSurfaceBgInspector({\n variant,\n p,\n set,\n C,\n onUpload,\n syncKey,\n}: {\n variant: \"surface\" | \"backdrop\";\n p: Record<string, unknown>;\n set: (k: string, v: unknown) => void;\n C: Record<string, string>;\n onUpload?: (file: File) => Promise<string>;\n syncKey: string;\n}) {\n const K = blockBgKeys(variant);\n const { IS, CI } = useIS(C);\n const POS_OPTS = [\"center\", \"top\", \"bottom\", \"left\", \"right\", \"top left\", \"top right\", \"bottom left\", \"bottom right\"];\n const [uiStep, setUiStep] = useState<null | \"solid\" | \"image\" | \"gradient\">(null);\n\n useEffect(() => {\n const g = p[K.gradient];\n if (g && typeof g === \"object\") {\n setUiStep(\"gradient\");\n return;\n }\n if (String(p[K.image] ?? \"\").trim()) {\n setUiStep(\"image\");\n return;\n }\n if (String(p[K.color] ?? \"\").trim()) {\n setUiStep(\"solid\");\n return;\n }\n setUiStep(null);\n }, [syncKey]);\n\n const setMode = (mode: \"solid\" | \"image\" | \"gradient\") => {\n setUiStep(mode);\n if (mode === \"solid\") {\n set(K.gradient, null);\n set(K.image, \"\");\n return;\n }\n if (mode === \"image\") {\n set(K.gradient, null);\n return;\n }\n set(K.image, \"\");\n const g = p[K.gradient];\n if (!g || typeof g !== \"object\") {\n set(K.gradient, { angle: 135, colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"], stops: [0, 50, 100] });\n }\n };\n\n const title = variant === \"backdrop\" ? \"Section backdrop\" : \"Block background\";\n const uploadId = `blk-surf-${variant}-${syncKey}`;\n\n return (\n <div style={{ marginBottom: 14, paddingBottom: 12, borderBottom: `1px solid ${C.border}` }}>\n <div\n style={{\n fontSize: 10,\n fontWeight: 700,\n color: C.muted,\n textTransform: \"uppercase\",\n letterSpacing: \".07em\",\n marginBottom: 8,\n }}\n >\n {title}\n </div>\n <BgModeButtons value={uiStep} onChange={setMode} C={C} />\n {uiStep === null ? (\n <div style={{ fontSize: 11, color: C.muted, marginTop: 8, lineHeight: 1.45 }}>\n Optional — color, gradient, or image fills behind this block.\n </div>\n ) : null}\n {uiStep === \"solid\" ? (\n <PR label=\"Background color\" C={C}>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\n <ColorSwatchGrid\n value={p[K.color] as string}\n C={C}\n compact\n onPick={(hex) => set(K.color, hex === \"#ffffff\" ? \"\" : hex)}\n />\n <div style={{ display: \"flex\", gap: 5, alignItems: \"center\" }}>\n <input\n type=\"color\"\n style={CI}\n value={(p[K.color] as string) || \"#ffffff\"}\n onChange={(e) => set(K.color, e.target.value === \"#ffffff\" ? \"\" : e.target.value)}\n />\n <input\n type=\"text\"\n style={{ ...IS, width: 120 }}\n placeholder=\"transparent\"\n value={(p[K.color] as string) || \"\"}\n onChange={(e) => set(K.color, e.target.value)}\n />\n </div>\n </div>\n </PR>\n ) : null}\n {uiStep === \"image\" ? (\n <>\n <PR\n label={\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n <ImageIcon size={13} strokeWidth={2.25} aria-hidden />\n Background image\n </span>\n }\n C={C}\n >\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <input\n type=\"text\"\n style={IS}\n placeholder=\"https://…\"\n value={(p[K.image] as string) || \"\"}\n onChange={(e) => set(K.image, e.target.value)}\n />\n {onUpload ? (\n <div style={{ marginTop: 0 }}>\n <input\n id={uploadId}\n type=\"file\"\n style={{ display: \"none\" }}\n accept=\"image/*\"\n onChange={async (e) => {\n const file = e.target.files?.[0];\n if (!file) return;\n try {\n const url = await onUpload(file);\n set(K.image, url);\n } catch (err) {\n console.error(\"Upload failed\", err);\n alert(\"Background upload failed\");\n }\n }}\n />\n <button\n type=\"button\"\n onClick={() => document.getElementById(uploadId)?.click()}\n style={{\n background: C.surface,\n border: `1px solid ${C.border}`,\n color: C.accent,\n borderRadius: 5,\n cursor: \"pointer\",\n fontSize: 11,\n padding: \"4px 10px\",\n width: \"100%\",\n fontWeight: 600,\n }}\n >\n <span style={{ display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\", gap: 8 }}>\n <UploadIcon size={14} strokeWidth={2.25} aria-hidden />\n <span>Upload</span>\n </span>\n </button>\n </div>\n ) : null}\n </div>\n </PR>\n <div style={{ display: \"flex\", gap: 8, marginBottom: 12 }}>\n <div style={{ flex: 1 }}>\n <PR label=\"Fit\" C={C}>\n <select style={IS} value={(p[K.size] as string) || \"cover\"} onChange={(e) => set(K.size, e.target.value)}>\n <option value=\"auto\">Auto</option>\n <option value=\"cover\">Cover</option>\n <option value=\"contain\">Contain</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label=\"Repeat\" C={C}>\n <select style={IS} value={(p[K.repeat] as string) || \"no-repeat\"} onChange={(e) => set(K.repeat, e.target.value)}>\n <option value=\"no-repeat\">No repeat</option>\n <option value=\"repeat\">Repeat</option>\n <option value=\"repeat-x\">Repeat X</option>\n <option value=\"repeat-y\">Repeat Y</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label=\"Position\" C={C}>\n <select style={IS} value={(p[K.position] as string) || \"center\"} onChange={(e) => set(K.position, e.target.value)}>\n {POS_OPTS.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n </PR>\n </div>\n </div>\n </>\n ) : null}\n {uiStep === \"gradient\" ? (\n <details open style={{ marginBottom: 4 }}>\n <summary style={{ cursor: \"pointer\", fontSize: 11, fontWeight: 800, color: C.text }}>Gradient</summary>\n <div style={{ marginTop: 10 }}>\n <DynamicGradientField\n label=\"Gradient\"\n value={p[K.gradient] as any}\n onChange={(g) => set(K.gradient, g)}\n defaults={{ colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"] }}\n C={C}\n />\n </div>\n </details>\n ) : null}\n </div>\n );\n}\n\n/** HTML block: TipTap rich text plus raw HTML source tab. */\nfunction HtmlBlockRichPanel({\n block,\n onChange,\n C,\n}: {\n block: { id: string; type: string; content?: unknown; props: Record<string, unknown> };\n onChange: (b: typeof block) => void;\n C: Record<string, string>;\n}) {\n const p = block.props;\n const { IS } = useIS(C);\n const [mode, setMode] = useState<\"visual\" | \"html\">(\"visual\");\n const [htmlDraft, setHtmlDraft] = useState(\"\");\n\n useEffect(() => {\n setMode(\"visual\");\n }, [block.id]);\n\n const body = normalizeRichHtmlForStorage(typeof block.content === \"string\" ? block.content : \"\");\n const applyHtml = (html: string) => {\n const norm = normalizeRichHtmlForStorage(html);\n onChange({ ...block, content: norm, props: { ...p, content: norm } });\n };\n\n const tabBtn = (active: boolean): CSSProperties => ({\n flex: 1,\n padding: \"7px 10px\",\n borderRadius: 6,\n border: `1px solid ${C.border}`,\n background: active ? C.accent : C.surface,\n color: active ? \"#ffffff\" : C.text,\n fontSize: 12,\n fontWeight: 700,\n cursor: \"pointer\",\n });\n\n return (\n <PR label=\"Content\" C={C}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <div style={{ display: \"flex\", gap: 8 }}>\n <button\n type=\"button\"\n style={tabBtn(mode === \"visual\")}\n onClick={() => {\n if (mode === \"html\") applyHtml(htmlDraft);\n setMode(\"visual\");\n }}\n >\n Rich text\n </button>\n <button\n type=\"button\"\n style={tabBtn(mode === \"html\")}\n onClick={() => {\n setHtmlDraft(body);\n setMode(\"html\");\n }}\n >\n HTML\n </button>\n </div>\n {mode === \"visual\" ? (\n <TextRichEditor\n key={block.id}\n value={body}\n onChange={applyHtml}\n typography={{\n fontSize: p.fontSize as number | undefined,\n color: p.color as string | undefined,\n align: p.align as string | undefined,\n fontFamily: p.fontFamily as string | undefined,\n lineHeight: p.lineHeight as number | undefined,\n letterSpacing: p.letterSpacing as number | undefined,\n padding: p.padding as { top?: number; right?: number; bottom?: number; left?: number },\n }}\n placeholder=\"Write your rich content…\"\n headerTitle=\"Rich editor\"\n C={C as any}\n />\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <textarea\n spellCheck={false}\n value={htmlDraft}\n onChange={(e) => setHtmlDraft(e.target.value)}\n placeholder=\"<p>Your HTML…</p>\"\n style={{\n ...IS,\n minHeight: 220,\n resize: \"vertical\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n fontSize: 12,\n lineHeight: 1.45,\n }}\n />\n <span style={{ fontSize: 10, color: C.muted, lineHeight: 1.45 }}>\n Raw HTML. Switch to <strong>Rich text</strong> to apply and preview in the visual editor.\n </span>\n <button\n type=\"button\"\n onClick={() => applyHtml(htmlDraft)}\n style={{\n alignSelf: \"flex-start\",\n background: C.surface,\n border: `1px solid ${C.border}`,\n color: C.accent,\n borderRadius: 5,\n cursor: \"pointer\",\n fontSize: 11,\n padding: \"6px 12px\",\n fontWeight: 600,\n }}\n >\n Apply (normalize)\n </button>\n </div>\n )}\n </div>\n </PR>\n );\n}\n\n// ─── CONTENT BLOCK EDITOR ────────────────────────────────────────────────────\nfunction ContentBlockEditor({ block, onChange, onClose, onUpload, C }) {\n const { IS, CI } = useIS(C);\n const imageFileRef = useRef(null);\n const p = block.props;\n const set = (k, v) => {\n if (block.type === \"html\" && k === \"content\") {\n onChange({ ...block, content: v, props: { ...p, content: v } });\n return;\n }\n if (block.type === \"html\") {\n const body = typeof block.content === \"string\" ? block.content : typeof p.content === \"string\" ? p.content : \"\";\n onChange({ ...block, props: { ...p, [k]: v, content: body } });\n return;\n }\n onChange({ ...block, props: { ...p, [k]: v } });\n };\n const Num = (k, lbl, mn = 0, mx = 300) => <PR label={lbl} C={C}><input type=\"number\" style={IS} value={p[k] ?? 0} min={mn} max={mx} onChange={e => set(k, +e.target.value)} /></PR>;\n const Txt = (k, lbl, multi = false) => <PR label={lbl} C={C}>{multi ? <textarea style={{ ...IS, minHeight: 68, resize: \"vertical\" }} value={p[k] || \"\"} onChange={e => set(k, e.target.value)} /> : <input type=\"text\" style={IS} value={p[k] || \"\"} onChange={e => set(k, e.target.value)} />}</PR>;\n const Col = (k, lbl) => <PR label={lbl} C={C}>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\n <ColorSwatchGrid value={p[k]} onPick={(hex) => set(k, hex)} C={C} compact />\n <div style={{ display: \"flex\", gap: 5, flex: \"0 0 auto\", alignItems: \"center\" }}>\n <input type=\"color\" style={CI} value={p[k] || \"#000000\"} onChange={e => set(k, e.target.value)} />\n <input type=\"text\" style={{ ...IS, width: 120 }} value={p[k] || \"\"} onChange={e => set(k, e.target.value)} />\n </div>\n </div>\n </PR>;\n const Sel = (k, lbl, opts) => <PR label={lbl} C={C}><select style={IS} value={p[k] || opts[0]} onChange={e => set(k, e.target.value)}>{opts.map(o => <option key={o} value={o}>{o}</option>)}</select></PR>;\n const Tog = (k, lbl) => <PR label={lbl} C={C}><label style={{ display: \"flex\", alignItems: \"center\", gap: 7, cursor: \"pointer\" }}><input type=\"checkbox\" checked={!!p[k]} onChange={e => set(k, e.target.checked)} style={{ width: 15, height: 15, accentColor: C.accent }} /><span style={{ color: C.muted, fontSize: 12 }}>{p[k] ? \"On\" : \"Off\"}</span></label></PR>;\n const FONTS = [\"Georgia,serif\", \"Arial,sans-serif\", \"Verdana,sans-serif\", \"'Courier New',monospace\", \"Trebuchet MS,sans-serif\", \"Impact,sans-serif\"];\n\n const ImgUpload = (key) => {\n if (!onUpload) return null;\n return (\n <div style={{ marginTop: 4 }}>\n <input id={`upload-${key}`} type=\"file\" style={{ display: \"none\" }} accept=\"image/*\"\n onChange={async e => {\n const file = e.target.files?.[0];\n if (!file) return;\n try {\n const url = await onUpload(file);\n set(key, url);\n } catch (err) {\n console.error(\"Upload failed\", err);\n alert(\"Image upload failed\");\n }\n }} />\n <button type=\"button\" onClick={() => document.getElementById(`upload-${key}`)?.click()}\n style={{ background: C.surface, border: `1px solid ${C.border}`, color: C.accent, borderRadius: 5, cursor: \"pointer\", fontSize: 11, padding: \"4px 10px\", width: \"100%\", fontWeight: 600 }}>\n ↑ Upload Image\n </button>\n </div>\n );\n };\n\n switch (block.type) {\n case \"heading\": return <>\n {Txt(\"content\", \"Heading Text\")}\n {Sel(\"level\", \"Level\", [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"])}\n <NumRangePx label=\"Font size\" value={p.fontSize ?? 28} onChange={(n) => set(\"fontSize\", n)} min={8} max={96} step={1} C={C} />\n {Col(\"color\", \"Color\")}\n <AlignButtons value={p.align} onChange={(v) => set(\"align\", v)} options={[\"left\", \"center\", \"right\", \"justify\"]} C={C} />\n {Sel(\"fontWeight\", \"Weight\", [\"300\", \"400\", \"500\", \"600\", \"700\", \"800\"])}\n {Sel(\"fontFamily\", \"Font\", FONTS)}\n <NumRangePx label=\"Letter spacing\" value={p.letterSpacing ?? 0} onChange={(n) => set(\"letterSpacing\", n)} min={0} max={30} step={0.5} C={C} />\n <PR label=\"Line height\" C={C}>\n <input type=\"number\" style={useIS(C).IS} min={0.8} max={4} step={0.05} value={p.lineHeight ?? 1.2} onChange={(e) => set(\"lineHeight\", +e.target.value)} />\n </PR>\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad) => set(\"padding\", pad)} C={C} />\n <MarginEditor value={p.margin} onChange={(m) => set(\"margin\", m)} C={C} />\n </>;\n case \"text\": return (\n <>\n <PR label=\"Content\" C={C}>\n <textarea\n key={block.id}\n style={{ ...IS, minHeight: 200, resize: \"vertical\", fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\", fontSize: 12, lineHeight: 1.45 }}\n value={String(p.content ?? \"\")}\n onChange={(e) => set(\"content\", e.target.value)}\n spellCheck={false}\n placeholder=\"Write your text…\"\n />\n </PR>\n <NumRangePx label=\"Font size\" value={p.fontSize ?? 15} onChange={(n) => set(\"fontSize\", n)} min={8} max={96} step={1} C={C} />\n {Col(\"color\", \"Color\")}\n <AlignButtons value={p.align} onChange={(v) => set(\"align\", v)} options={[\"left\", \"center\", \"right\", \"justify\"]} C={C} />\n {Sel(\"fontWeight\", \"Weight\", [\"400\", \"500\", \"600\", \"700\", \"800\"])}\n {Sel(\"fontFamily\", \"Font\", FONTS)}\n {Tog(\"italic\", \"Italic\")}\n {Tog(\"underline\", \"Underline\")}\n <PR label=\"Line height\" C={C}>\n <input type=\"number\" style={useIS(C).IS} min={1} max={4} step={0.05} value={p.lineHeight ?? 1.65} onChange={(e) => set(\"lineHeight\", +e.target.value)} />\n </PR>\n <NumRangePx label=\"Letter spacing\" value={p.letterSpacing ?? 0} onChange={(n) => set(\"letterSpacing\", n)} min={0} max={30} step={0.5} C={C} />\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad) => set(\"padding\", pad)} C={C} />\n <MarginEditor value={p.margin} onChange={(m) => set(\"margin\", m)} C={C} />\n </>\n );\n case \"html\": return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n <HtmlBlockRichPanel block={block} onChange={onChange} C={C} />\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad) => set(\"padding\", pad)} C={C} />\n <MarginEditor value={p.margin} onChange={(m) => set(\"margin\", m)} C={C} />\n </div>\n );\n case \"image\": return <>\n <PR label=\"Image URL\" C={C}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <input type=\"text\" style={IS} value={p.src || \"\"} placeholder=\"https://…\" onChange={e => set(\"src\", e.target.value)} />\n {ImgUpload(\"src\")}\n </div>\n </PR>\n <PR label={<span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}><Scaling size={13} strokeWidth={2.25} aria-hidden />Object fit</span>} C={C}>\n <select style={IS} value={p.objectFit || \"cover\"} onChange={e => set(\"objectFit\", e.target.value)}>\n {[\"cover\", \"contain\", \"fill\", \"none\", \"scale-down\"].map(v => <option key={v} value={v}>{v}</option>)}\n </select>\n </PR>\n <PR label={<span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}><Crosshair size={13} strokeWidth={2.25} aria-hidden />Object position</span>} C={C}>\n <select style={IS} value={p.objectPosition || \"center\"} onChange={e => set(\"objectPosition\", e.target.value)}>\n {[\"center\", \"top\", \"bottom\", \"left\", \"right\", \"top left\", \"top right\", \"bottom left\", \"bottom right\"].map(v => <option key={v} value={v}>{v}</option>)}\n </select>\n </PR>\n {Txt(\"alt\", \"Alt Text\")}\n <PR label=\"Link image\" C={C}>\n <label style={{ display: \"flex\", alignItems: \"center\", gap: 7, cursor: \"pointer\" }}>\n <input\n type=\"checkbox\"\n checked={!!(p.linkEnabled ?? (p.link && String(p.link).trim()))}\n onChange={(e) => {\n if (e.target.checked) set(\"linkEnabled\", true);\n else onChange({ ...block, props: { ...p, linkEnabled: false, link: \"\" } });\n }}\n style={{ width: 15, height: 15, accentColor: C.accent }}\n />\n <span style={{ color: C.muted, fontSize: 12 }}>\n {(p.linkEnabled ?? (p.link && String(p.link).trim())) ? \"On\" : \"Off\"}\n </span>\n </label>\n </PR>\n {(p.linkEnabled ?? (p.link && String(p.link).trim())) ? (\n <>\n {Txt(\"link\", \"Link URL\")}\n {Sel(\"linkTarget\", \"Open In\", [\"_blank\", \"_self\"])}\n </>\n ) : null}\n <AlignButtons value={p.align} onChange={(v) => set(\"align\", v)} options={[\"left\", \"center\", \"right\"]} C={C} />\n <BorderRadiusEditor value={p.borderRadius} onChange={(br) => set(\"borderRadius\", br)} C={C} />\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad) => set(\"padding\", pad)} C={C} />\n <MarginEditor value={p.margin} onChange={(m) => set(\"margin\", m)} C={C} />\n </>;\n case \"button\": return <>\n {Txt(\"label\", \"Label\")}\n {Txt(\"href\", \"Link URL\")}\n {Sel(\"linkTarget\", \"Open In\", [\"_blank\", \"_self\"])}\n {Col(\"bgColor\", \"Background\")}\n {Col(\"textColor\", \"Text Color\")}\n {Col(\"borderColor\", \"Border Color\")}\n {Num(\"borderWidth\", \"Border Width\", 0, 10)}\n <AlignButtons value={p.align} onChange={(v) => set(\"align\", v)} options={[\"left\", \"center\", \"right\"]} C={C} />\n <BorderRadiusEditor value={p.borderRadius} onChange={(br) => set(\"borderRadius\", br)} C={C} />\n {Num(\"paddingV\", \"Padding V\")}\n {Num(\"paddingH\", \"Padding H\")}\n <NumRangePx label=\"Font size\" value={p.fontSize ?? 14} onChange={(n) => set(\"fontSize\", n)} min={8} max={48} step={1} C={C} />\n {Sel(\"fontWeight\", \"Weight\", [\"400\", \"500\", \"600\", \"700\", \"800\"])}\n {Tog(\"fullWidth\", \"Full Width\")}\n <BlockSurfaceBgInspector variant=\"backdrop\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad) => set(\"padding\", pad)} C={C} />\n <MarginEditor value={p.margin} onChange={(m) => set(\"margin\", m)} C={C} />\n </>;\n case \"link\": return <>\n {Txt(\"label\", \"Label\")}{Txt(\"href\", \"Link URL\")}{Sel(\"linkTarget\", \"Open In\", [\"_blank\", \"_self\"])}{Col(\"color\", \"Text Color\")}\n <NumRangePx label=\"Font size\" value={p.fontSize ?? 15} onChange={(n) => set(\"fontSize\", n)} min={8} max={72} step={1} C={C} />\n <AlignButtons value={p.align} onChange={(v) => set(\"align\", v)} options={[\"left\", \"center\", \"right\", \"justify\"]} C={C} />\n {Sel(\"fontWeight\", \"Weight\", [\"300\", \"400\", \"500\", \"600\", \"700\", \"800\"])}\n {Sel(\"fontFamily\", \"Font\", FONTS)}{Tog(\"underline\", \"Underline\")}\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad) => set(\"padding\", pad)} C={C} />\n <MarginEditor value={p.margin} onChange={(m) => set(\"margin\", m)} C={C} />\n </>;\n case \"divider\": return <>\n {Col(\"color\", \"Color\")}\n <NumRangePx label=\"Thickness\" value={p.thickness ?? 1} onChange={(n) => set(\"thickness\", n)} min={1} max={20} step={1} C={C} />\n <DividerStyleButtons value={p.style} onChange={(s) => set(\"style\", s)} C={C} />\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad) => set(\"padding\", pad)} C={C} />\n <MarginEditor value={p.margin} onChange={(m) => set(\"margin\", m)} C={C} />\n </>;\n case \"spacer\": return <>\n <NumRangePx label=\"Height\" value={p.height ?? 24} onChange={(n) => set(\"height\", n)} min={4} max={300} step={1} C={C} />\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad) => set(\"padding\", pad)} C={C} />\n <MarginEditor value={p.margin} onChange={(m) => set(\"margin\", m)} C={C} />\n </>;\n case \"social\": return <>\n <PR label=\"Networks\" C={C}>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 4, marginBottom: 6 }}>\n {ALL_NETWORKS.map(n => {\n const active = (p.networks || []).includes(n);\n return <button key={n} onClick={() => {\n const nextNets = active ? (p.networks || []).filter(x => x !== n) : [...(p.networks || []), n];\n const nextUrls = { ...(p.socialUrls || {}) };\n if (active) delete nextUrls[n];\n onChange({ ...block, props: { ...p, networks: nextNets, socialUrls: nextUrls } });\n }}\n style={{ padding: \"3px 8px\", borderRadius: 4, border: `1px solid ${active ? C.accent : C.border}`, background: active ? `${C.accent}22` : \"transparent\", color: active ? C.accent : C.muted, fontSize: 11, cursor: \"pointer\", fontWeight: active ? 700 : 400 }}>\n {socialNetworkLabel(n)}\n </button>;\n })}\n </div>\n </PR>\n {(p.networks || []).length > 0 && (\n <PR label=\"Profile / page URLs\" C={C}>\n <div style={{ fontSize: 10, color: C.muted, marginBottom: 8, lineHeight: 1.45 }}>Optional. Leave empty for icons without links. Use full URLs (https://…).</div>\n {(p.networks || []).map(n => (\n <div key={n} style={{ marginBottom: 8 }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: C.accent2, marginBottom: 3, textTransform: n === \"twitter\" ? \"none\" : \"capitalize\" }}>{socialNetworkLabel(n)}</div>\n <input type=\"text\" style={IS} placeholder={n === \"twitter\" ? \"https://x.com/your-handle\" : `https://${n}.com/your-profile`}\n value={(p.socialUrls && p.socialUrls[n]) || \"\"}\n onChange={e => {\n const socialUrls = { ...(p.socialUrls || {}) };\n const v = e.target.value.trim();\n if (v) socialUrls[n] = v;\n else delete socialUrls[n];\n set(\"socialUrls\", socialUrls);\n }} />\n </div>\n ))}\n </PR>\n )}\n <AlignButtons value={p.align} onChange={(v) => set(\"align\", v)} options={[\"left\", \"center\", \"right\"]} C={C} />\n <NumRangePx label=\"Icon size\" value={p.iconSize ?? 30} onChange={(n) => set(\"iconSize\", n)} min={16} max={72} step={1} C={C} />\n {Sel(\"shape\", \"Shape\", [\"circle\", \"square\"])}\n <NumRangePx label=\"Gap\" value={p.gap ?? 6} onChange={(n) => set(\"gap\", n)} min={0} max={40} step={1} C={C} />\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad) => set(\"padding\", pad)} C={C} />\n <MarginEditor value={p.margin} onChange={(m) => set(\"margin\", m)} C={C} />\n </>;\n case \"video\": return <>\n <PR label=\"Video URL\" C={C}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <input type=\"text\" style={IS} value={videoSrcForEditorDisplay(p.src) || \"\"} placeholder=\"https://www.youtube.com/watch?v=… or Vimeo / embed URL\"\n onChange={e => set(\"src\", e.target.value)} />\n {onUpload && (\n <div style={{ marginTop: 0 }}>\n <input\n id={`upload-video-${block.id}`}\n type=\"file\"\n style={{ display: \"none\" }}\n accept=\"video/*\"\n onChange={async e => {\n const file = e.target.files?.[0];\n if (!file) return;\n try {\n const url = await onUpload(file);\n set(\"src\", url);\n } catch (err) {\n console.error(\"Upload failed\", err);\n alert(\"Video upload failed\");\n }\n }}\n />\n <button\n type=\"button\"\n onClick={() => document.getElementById(`upload-video-${block.id}`)?.click()}\n style={{ background: C.surface, border: `1px solid ${C.border}`, color: C.accent, borderRadius: 5, cursor: \"pointer\", fontSize: 11, padding: \"4px 10px\", width: \"100%\", fontWeight: 600 }}\n >\n ↑ Upload Video\n </button>\n </div>\n )}\n </div>\n <div style={{ fontSize: 10, color: C.muted, marginTop: 4, lineHeight: 1.5 }}>\n Supports YouTube watch, Shorts, youtu.be, Vimeo page links, or direct embed URLs (\n <code style={{ background: C.surface, padding: \"1px 4px\", borderRadius: 3 }}>youtube.com/embed/…</code>\n {\" \"}/\n <code style={{ background: C.surface, padding: \"1px 4px\", borderRadius: 3 }}>player.vimeo.com/…</code>\n ).\n </div>\n </PR>\n <NumRangePx label=\"Height\" value={p.height ?? 280} onChange={(n) => set(\"height\", n)} min={80} max={720} step={1} C={C} />\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad) => set(\"padding\", pad)} C={C} />\n <MarginEditor value={p.margin} onChange={(m) => set(\"margin\", m)} C={C} />\n </>;\n case \"menu\": return <>\n <PR label=\"Menu Items\" C={C}>\n {(p.items || []).map((item, i) => (\n <div key={i} style={{ display: \"flex\", gap: 4, marginBottom: 5 }}>\n <input type=\"text\" style={{ ...IS, flex: 2 }} placeholder=\"Label\" value={item.label} onChange={e => { const items = [...p.items]; items[i] = { ...items[i], label: e.target.value }; set(\"items\", items); }} />\n <input type=\"text\" style={{ ...IS, flex: 3 }} placeholder=\"URL\" value={item.href} onChange={e => { const items = [...p.items]; items[i] = { ...items[i], href: e.target.value }; set(\"items\", items); }} />\n <button onClick={() => set(\"items\", p.items.filter((_, j) => j !== i))} style={{ background: \"none\", border: `1px solid ${C.danger}`, color: C.danger, borderRadius: 4, cursor: \"pointer\", fontSize: 12, padding: \"0 6px\" }}>✕</button>\n </div>\n ))}\n <button onClick={() => set(\"items\", [...(p.items || []), { label: \"New\", href: \"#\" }])} style={{ background: C.surface, border: `1px solid ${C.border}`, color: C.text, borderRadius: 5, cursor: \"pointer\", fontSize: 11, padding: \"4px 10px\", width: \"100%\" }}>+ Add Item</button>\n </PR>\n <AlignButtons value={p.align} onChange={(v) => set(\"align\", v)} options={[\"left\", \"center\", \"right\"]} C={C} />\n {Col(\"color\", \"Link Color\")}\n <NumRangePx label=\"Font size\" value={p.fontSize ?? 14} onChange={(n) => set(\"fontSize\", n)} min={8} max={48} step={1} C={C} />\n <NumRangePx label=\"Item gap\" value={p.gap ?? 20} onChange={(n) => set(\"gap\", n)} min={0} max={80} step={1} C={C} />\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad) => set(\"padding\", pad)} C={C} />\n <MarginEditor value={p.margin} onChange={(m) => set(\"margin\", m)} C={C} />\n </>;\n case \"timer\": {\n const endAt = parseTimerEndDate(p.endDate);\n const dateVal = formatDateInputLocal(endAt);\n const timeVal = formatTimeInputLocal(endAt);\n return <>\n <PR label=\"End date & time\" C={C}>\n <div style={{ display: \"flex\", gap: 8, flexWrap: \"wrap\", alignItems: \"stretch\" }}>\n <input\n type=\"date\"\n style={{ ...IS, flex: \"1 1 140px\", minWidth: 0 }}\n value={dateVal}\n onChange={(e) => {\n const next = e.target.value;\n if (!next) return;\n set(\"endDate\", combineLocalDateTime(next, timeVal));\n }}\n />\n <input\n type=\"time\"\n step={60}\n style={{ ...IS, flex: \"0 1 128px\" }}\n value={timeVal}\n onChange={(e) => set(\"endDate\", combineLocalDateTime(dateVal, e.target.value || \"00:00\"))}\n />\n </div>\n </PR>\n {Txt(\"label\", \"Label Text\")}\n {Col(\"bgColor\", \"Box Background\")}\n {Col(\"textColor\", \"Text Color\")}\n <BorderRadiusEditor value={p.borderRadius} onChange={(br) => set(\"borderRadius\", br)} C={C} />\n <AlignButtons value={p.align} onChange={(v) => set(\"align\", v)} options={[\"left\", \"center\", \"right\"]} C={C} />\n {Tog(\"showLabels\", \"Show Labels\")}\n <BlockSurfaceBgInspector variant=\"backdrop\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad) => set(\"padding\", pad)} C={C} />\n <MarginEditor value={p.margin} onChange={(m) => set(\"margin\", m)} C={C} />\n </>;\n }\n case \"table\": return (\n <>\n {Tog(\"header\", \"First row is header\")}\n <PR label=\"Table role\" C={C}>\n <div style={{ fontSize: 10, color: C.muted, marginBottom: 6, lineHeight: 1.45 }}>\n <strong>Data</strong> → <code style={{ background: C.surface, padding: \"1px 4px\", borderRadius: 3 }}>role="table"</code> for real tables.\n {\" \"}<strong>Layout</strong> → <code style={{ background: C.surface, padding: \"1px 4px\", borderRadius: 3 }}>role="presentation"</code> for non-data grids.\n </div>\n <select\n style={IS}\n value={p.tableRole === \"presentation\" ? \"presentation\" : \"data\"}\n onChange={e => set(\"tableRole\", e.target.value)}\n >\n <option value=\"data\">Data table (role="table")</option>\n <option value=\"presentation\">Layout (role="presentation")</option>\n </select>\n </PR>\n <PR label=\"Table Data\" C={C}>\n <div style={{ fontSize: 10, color: C.muted, marginBottom: 6, lineHeight: 1.5 }}>When header is on, row 1 is the header row. Click a cell to edit.</div>\n <div style={{ overflowX: \"auto\" }}>\n <table style={{ borderCollapse: \"collapse\", width: \"100%\", fontSize: 11 }}>\n <tbody>\n {(p.data || []).map((row, ri) => (\n <tr key={ri}>\n {row.map((cell, ci) => (\n <td key={ci} style={{ padding: 2 }}>\n <input type=\"text\" style={{ ...IS, padding: \"4px 6px\", fontSize: 11, minWidth: 60, background: !!p.header && ri === 0 ? C.accent + \"22\" : C.inputBg, fontWeight: !!p.header && ri === 0 ? 700 : 400, boxSizing: \"border-box\" as const }} value={cell}\n onChange={e => { const d = p.data.map(r => [...r]); d[ri][ci] = e.target.value; set(\"data\", d); }} />\n </td>\n ))}\n <td style={{ padding: 2 }}>\n <button type=\"button\" onClick={() => set(\"data\", p.data.filter((_, j) => j !== ri))} title=\"Remove row\"\n style={{ background: \"none\", border: `1px solid ${C.danger}`, color: C.danger, borderRadius: 3, cursor: \"pointer\", fontSize: 10, padding: \"3px 5px\", whiteSpace: \"nowrap\" }}>✕</button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <div style={{ display: \"flex\", gap: 5, marginTop: 6 }}>\n <button type=\"button\" onClick={() => set(\"data\", [...(p.data || []), [...Array((p.data || [[]])[0]?.length || 3).fill(\"\")]])}\n style={{ flex: 1, background: C.surface, border: `1px solid ${C.border}`, color: C.text, borderRadius: 4, cursor: \"pointer\", fontSize: 11, padding: \"4px\" }}>+ Row</button>\n <button type=\"button\" onClick={() => set(\"data\", (p.data || []).map(r => [...r, \"\"]))}\n style={{ flex: 1, background: C.surface, border: `1px solid ${C.border}`, color: C.text, borderRadius: 4, cursor: \"pointer\", fontSize: 11, padding: \"4px\" }}>+ Col</button>\n <button type=\"button\" onClick={() => set(\"data\", (p.data || []).map(r => r.slice(0, -1)).filter(r => r.length > 0))}\n style={{ flex: 1, background: C.surface, border: `1px solid ${C.border}`, color: C.muted, borderRadius: 4, cursor: \"pointer\", fontSize: 11, padding: \"4px\" }}>− Col</button>\n </div>\n </PR>\n {Col(\"headerBg\", \"Header row background\")}{Col(\"headerColor\", \"Header row text\")}{Col(\"cellBg\", \"Cell background\")}{Col(\"cellBorder\", \"Cell border\")}{Col(\"stripedBg\", \"Stripe color\")}\n {Tog(\"striped\", \"Striped rows\")}\n <NumRangePx label=\"Font size\" value={p.fontSize ?? 13} onChange={(n) => set(\"fontSize\", n)} min={10} max={24} step={1} C={C} />\n <BlockSurfaceBgInspector variant=\"surface\" p={p} set={set} C={C} onUpload={onUpload} syncKey={block.id} />\n <PaddingEditor value={p.padding} onChange={(pad) => set(\"padding\", pad)} C={C} />\n <PaddingEditor label=\"Cell padding\" value={p.cellPadding} onChange={(pad) => set(\"cellPadding\", pad)} C={C} />\n <MarginEditor value={p.margin} onChange={(m) => set(\"margin\", m)} C={C} />\n </>\n );\n case \"layout\":\n return (\n <LayoutRowEditor\n row={{\n id: block.id,\n type: \"layout\",\n preset: p.preset,\n cols: p.cols ?? (p.ratios?.length || 1),\n ratios: [...(p.ratios?.length ? p.ratios : [1])],\n gap: p.gap,\n padding: p.padding,\n bgColor: p.bgColor || \"\",\n bgImage: p.bgImage || \"\",\n bgSize: p.bgSize,\n bgRepeat: p.bgRepeat,\n bgPosition: p.bgPosition ?? \"center\",\n bgGradient: p.bgGradient ?? null,\n cells: p.cells || [],\n columns: getColumns(p),\n }}\n onChange={(row) =>\n onChange({\n ...block,\n props: {\n ...p,\n preset: row.preset,\n cols: row.ratios?.length ?? row.cols ?? 1,\n gap: row.gap,\n padding: row.padding,\n bgColor: row.bgColor,\n bgImage: row.bgImage,\n bgSize: row.bgSize,\n bgRepeat: row.bgRepeat,\n bgPosition: row.bgPosition,\n bgGradient: row.bgGradient,\n ratios: [...(row.ratios || [1])],\n cells: row.cells || [],\n columns: row.columns ?? getColumns(row),\n },\n })\n }\n onClose={onClose}\n onUpload={onUpload}\n C={C}\n customizationHint=\"Choose how many columns to use, set ratio weights (flex), gap and padding, row background, then scroll down for per-column colors and padding.\"\n />\n );\n default: return null;\n }\n}\n\ntype BgUiKind = \"solid\" | \"image\" | \"gradient\";\n\nfunction inferLayoutRowBgStep(r: any): BgUiKind | null {\n if (r.bgGradient) return \"gradient\";\n if (String(r.bgImage || \"\").trim()) return \"image\";\n if (String(r.bgColor || \"\").trim()) return \"solid\";\n return null;\n}\n\nfunction inferColumnBgStep(container: any, selCol: number): BgUiKind | null {\n const cs = getColumnPropsAt(container, selCol) as any;\n if (cs.bgGradient) return \"gradient\";\n if (String(cs.bgImage || \"\").trim()) return \"image\";\n if (String(cs.bgColor || \"\").trim()) return \"solid\";\n return null;\n}\n\n// ─── LAYOUT ROW EDITOR ───────────────────────────────────────────────────────\nfunction LayoutRowEditor({\n row,\n onChange,\n onClose,\n onUpload,\n initialCol = null,\n rowIndex = -1,\n rowCount = 1,\n onMoveUp,\n onMoveDown,\n C,\n /** Shown under the inspector header when editing a Layout block */\n customizationHint,\n}: {\n row: any;\n onChange: (row: any) => void;\n onClose?: () => void;\n onUpload?: (file: File) => Promise<string>;\n initialCol?: number | null;\n rowIndex?: number;\n rowCount?: number;\n onMoveUp?: () => void;\n onMoveDown?: () => void;\n C: any;\n customizationHint?: string;\n}) {\n const { IS, CI } = useIS(C);\n const colCount = Math.max(1, row.ratios?.length || row.cells?.length || 1);\n const ratioList = row.ratios?.length ? row.ratios : [1];\n /** Always index a real column so Column Styling (incl. background type) is usable without an extra click. */\n const [selCol, setSelCol] = useState(0);\n /** When saved data has no bg yet, remembers Color / Gradient / Image until props catch up (avoids effect↔state flicker). */\n const [rowBgPickerMode, setRowBgPickerMode] = useState<BgUiKind | null>(null);\n const [colBgPickerMode, setColBgPickerMode] = useState<BgUiKind | null>(null);\n\n const inferredRowBg = useMemo(() => inferLayoutRowBgStep(row), [row.bgGradient, row.bgImage, row.bgColor]);\n const inferredColBg = useMemo(\n () => inferColumnBgStep(row, selCol),\n [row.columns, row.columnStyles, selCol],\n );\n const rowBgUiStep = inferredRowBg ?? rowBgPickerMode;\n const colBgUiStep = inferredColBg ?? colBgPickerMode;\n\n useEffect(() => {\n if (initialCol !== null && initialCol !== undefined && initialCol >= 0) {\n setSelCol(Math.min(initialCol, colCount - 1));\n } else {\n setSelCol((c) => Math.min(Math.max(0, c), colCount - 1));\n }\n }, [initialCol, row.id, colCount]);\n\n useEffect(() => {\n setRowBgPickerMode(null);\n }, [row.id]);\n\n useEffect(() => {\n setColBgPickerMode(null);\n }, [selCol, row.id]);\n\n useEffect(() => {\n if (inferredRowBg) setRowBgPickerMode(null);\n }, [inferredRowBg]);\n\n useEffect(() => {\n if (inferredColBg) setColBgPickerMode(null);\n }, [inferredColBg]);\n\n const set = (k, v) => onChange({ ...row, [k]: v });\n const applyColumnCount = (n) => {\n const prevCells = [...(row.cells || [])];\n const prevRatios = [...(row.ratios || [])];\n const cells = [];\n const ratios = [];\n for (let i = 0; i < n; i++) {\n cells.push(i < prevCells.length && Array.isArray(prevCells[i]) ? [...prevCells[i]] : []);\n ratios.push(i < prevRatios.length && prevRatios[i] != null ? prevRatios[i] : 1);\n }\n if (prevCells.length > n) {\n cells[n - 1] = [...cells[n - 1], ...prevCells.slice(n).flat()];\n }\n onChange({ ...row, cols: n, preset: \"custom\", cells, ratios });\n };\n const updCol = (i, upd) => {\n const columns = patchColumnPropsAt(row, i, upd);\n onChange(withColumnsOnly(row, columns));\n };\n const setColBgMode = (mode: BgUiKind) => {\n setColBgPickerMode(mode);\n const cs = getColumnPropsAt(row, selCol) as any;\n if (mode === \"solid\") {\n updCol(selCol, { bgGradient: null, bgImage: \"\" });\n return;\n }\n if (mode === \"image\") {\n updCol(selCol, { bgGradient: null });\n return;\n }\n updCol(selCol, {\n bgImage: \"\",\n bgGradient: cs.bgGradient || { angle: 135, colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"], stops: [0, 50, 100] },\n });\n };\n const total = ratioList.reduce((a, b) => a + b, 0) || 1;\n const POS_OPTS = [\"center\", \"top\", \"bottom\", \"left\", \"right\", \"top left\", \"top right\", \"bottom left\", \"bottom right\"];\n const setRowBgMode = (mode: BgUiKind) => {\n setRowBgPickerMode(mode);\n if (mode === \"solid\") {\n set(\"bgGradient\", null);\n set(\"bgImage\", \"\");\n return;\n }\n if (mode === \"image\") {\n set(\"bgGradient\", null);\n return;\n }\n // gradient\n set(\"bgImage\", \"\");\n if (!row.bgGradient) {\n set(\"bgGradient\", { angle: 135, colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"], stops: [0, 50, 100] });\n }\n };\n const canMoveUp = rowIndex > 0;\n const canMoveDown = rowIndex >= 0 && rowIndex < rowCount - 1;\n\n return (\n <>\n {onMoveUp && onMoveDown ? (\n <div style={{ display: \"flex\", gap: 6, marginBottom: 12 }}>\n <button\n type=\"button\"\n disabled={!canMoveUp}\n onClick={onMoveUp}\n style={{\n flex: 1,\n padding: \"8px 10px\",\n fontSize: 12,\n fontWeight: 600,\n borderRadius: 8,\n border: `1px solid ${C.border}`,\n background: canMoveUp ? C.surface : C.canvas,\n color: canMoveUp ? C.text : C.muted,\n cursor: canMoveUp ? \"pointer\" : \"not-allowed\",\n }}\n >\n ↑ Move section up\n </button>\n <button\n type=\"button\"\n disabled={!canMoveDown}\n onClick={onMoveDown}\n style={{\n flex: 1,\n padding: \"8px 10px\",\n fontSize: 12,\n fontWeight: 600,\n borderRadius: 8,\n border: `1px solid ${C.border}`,\n background: canMoveDown ? C.surface : C.canvas,\n color: canMoveDown ? C.text : C.muted,\n cursor: canMoveDown ? \"pointer\" : \"not-allowed\",\n }}\n >\n ↓ Move section down\n </button>\n </div>\n ) : null}\n {customizationHint ? (\n <div\n style={{\n fontSize: 11,\n color: C.muted,\n lineHeight: 1.45,\n marginBottom: 12,\n padding: \"8px 10px\",\n background: C.surface,\n border: `1px solid ${C.border}`,\n borderRadius: 8,\n }}>\n {customizationHint}\n </div>\n ) : null}\n <PR label=\"Columns\" C={C}>\n <select style={IS} value={colCount} onChange={e => applyColumnCount(+e.target.value)}>\n {[1, 2, 3, 4, 5, 6].map(n => <option key={n} value={n}>{n} {n === 1 ? \"column\" : \"columns\"}</option>)}\n </select>\n </PR>\n <NumRangePx label=\"Column gap\" value={row.gap ?? 12} onChange={(n) => set(\"gap\", n)} min={0} max={80} step={1} C={C} />\n <NumRangePx label=\"Row padding\" value={row.padding ?? 8} onChange={(n) => set(\"padding\", n)} min={0} max={120} step={1} C={C} />\n <BgModeButtons value={rowBgUiStep} onChange={setRowBgMode} C={C} />\n {rowBgUiStep === null ? (\n <div style={{ fontSize: 11, color: C.muted, marginBottom: 10, lineHeight: 1.45 }}>\n Choose Color, Gradient, or Image — the matching settings appear below.\n </div>\n ) : null}\n {rowBgUiStep === \"solid\" ? (\n <PR label=\"bg color\" C={C}>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\n <ColorSwatchGrid\n value={row.bgColor}\n C={C}\n compact\n onPick={(hex) => set(\"bgColor\", hex === \"#ffffff\" ? \"\" : hex)}\n />\n <div style={{ display: \"flex\", gap: 5, alignItems: \"center\" }}>\n <input type=\"color\" style={CI} value={row.bgColor || \"#ffffff\"} onChange={e => set(\"bgColor\", e.target.value === \"#ffffff\" ? \"\" : e.target.value)} />\n <input type=\"text\" style={{ ...IS, width: 120 }} placeholder=\"transparent\" value={row.bgColor || \"\"} onChange={e => set(\"bgColor\", e.target.value)} />\n </div>\n </div>\n </PR>\n ) : null}\n {rowBgUiStep === \"image\" ? (\n <>\n <PR label={<span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}><ImageIcon size={13} strokeWidth={2.25} aria-hidden />bg image</span>} C={C}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <input type=\"text\" style={IS} placeholder=\"https://…\" value={row.bgImage || \"\"} onChange={e => set(\"bgImage\", e.target.value)} />\n {onUpload && (\n <div style={{ marginTop: 0 }}>\n <input id=\"row-bg-upload\" type=\"file\" style={{ display: \"none\" }} accept=\"image/*\"\n onChange={async e => {\n const file = e.target.files?.[0];\n if (!file) return;\n try {\n const url = await onUpload(file);\n set(\"bgImage\", url);\n } catch (err) {\n console.error(\"Upload failed\", err);\n alert(\"Background upload failed\");\n }\n }} />\n <button type=\"button\" onClick={() => document.getElementById(\"row-bg-upload\")?.click()}\n style={{ background: C.surface, border: `1px solid ${C.border}`, color: C.accent, borderRadius: 5, cursor: \"pointer\", fontSize: 11, padding: \"4px 10px\", width: \"100%\", fontWeight: 600 }}>\n <span style={{ display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\", gap: 8 }}>\n <UploadIcon size={14} strokeWidth={2.25} aria-hidden />\n <span>Upload</span>\n </span>\n </button>\n </div>\n )}\n </div>\n </PR>\n <div style={{ display: \"flex\", gap: 8, marginBottom: 12 }}>\n <div style={{ flex: 1 }}>\n <PR label=\"fit\" C={C}>\n <select style={IS} value={row.bgSize || \"cover\"} onChange={e => set(\"bgSize\", e.target.value)}>\n <option value=\"auto\">Auto</option>\n <option value=\"cover\">Cover</option>\n <option value=\"contain\">Contain</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label=\"repeat\" C={C}>\n <select style={IS} value={row.bgRepeat || \"no-repeat\"} onChange={e => set(\"bgRepeat\", e.target.value)}>\n <option value=\"no-repeat\">No-Repeat</option>\n <option value=\"repeat\">Repeat</option>\n <option value=\"repeat-x\">Repeat X</option>\n <option value=\"repeat-y\">Repeat Y</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label=\"align\" C={C}>\n <select style={IS} value={row.bgPosition || \"center\"} onChange={e => set(\"bgPosition\", e.target.value)}>\n {POS_OPTS.map(p => <option key={p} value={p}>{p}</option>)}\n </select>\n </PR>\n </div>\n </div>\n </>\n ) : null}\n\n {rowBgUiStep === \"gradient\" ? (\n <details open style={{ marginBottom: 12 }}>\n <summary style={{ cursor: \"pointer\", fontSize: 11, fontWeight: 800, color: C.text }}>gradient</summary>\n <div style={{ marginTop: 10 }}>\n <DynamicGradientField\n label=\"gradient\"\n value={row.bgGradient}\n onChange={(g) => set(\"bgGradient\", g)}\n defaults={{ colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"] }}\n C={C}\n />\n </div>\n </details>\n ) : null}\n <PR label=\"Column Ratios\" C={C}>\n <div style={{ display: \"flex\", gap: 5 }}>\n {ratioList.map((r, i) => (\n <input key={i} type=\"number\" style={{ ...IS, flex: 1 }} value={r} min={1} max={12}\n onChange={e => { const nr = [...ratioList]; nr[i] = +e.target.value || 1; set(\"ratios\", nr); }} />\n ))}\n </div>\n <div style={{ fontSize: 10, color: C.muted, marginTop: 4 }}>\n {ratioList.map((r, i) => `C${i + 1}:${Math.round((r / total) * 100)}%`).join(\" · \")}\n </div>\n </PR>\n\n <div style={{ marginTop: 20, borderTop: `1px solid ${C.border}`, paddingTop: 15 }}>\n <div style={{ fontSize: 11, fontWeight: 700, color: C.text, textTransform: \"uppercase\", letterSpacing: \".05em\", marginBottom: 10 }}>Column Styling</div>\n <div style={{ display: \"flex\", gap: 4, marginBottom: 12 }}>\n {ratioList.map((_, i) => (\n <button key={i} onClick={() => setSelCol(i)}\n style={{ flex: 1, padding: 6, fontSize: 10, borderRadius: 4, border: selCol === i ? `1px solid ${C.accent}` : `1px solid ${C.border}`, background: selCol === i ? `${C.accent}22` : \"transparent\", color: selCol === i ? C.accent : C.muted, cursor: \"pointer\" }}>\n Col {i + 1}\n </button>\n ))}\n </div>\n {colCount > 0 && (\n <div style={{ background: C.surface, padding: 10, borderRadius: 8, border: `1px solid ${C.border}` }}>\n <BgModeButtons value={colBgUiStep} onChange={setColBgMode} C={C} />\n {colBgUiStep === null ? (\n <div style={{ fontSize: 11, color: C.muted, marginBottom: 10, lineHeight: 1.45 }}>\n Choose Color, Gradient, or Image — then edit column background details.\n </div>\n ) : null}\n {colBgUiStep === \"solid\" ? (\n <PR label={`col ${selCol + 1} bg`} C={C}>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\n <ColorSwatchGrid\n value={(getColumnPropsAt(row, selCol)?.bgColor) || \"\"}\n C={C}\n compact\n onPick={(hex) => updCol(selCol, { bgColor: hex === \"#ffffff\" ? \"\" : hex })}\n />\n <div style={{ display: \"flex\", gap: 5, alignItems: \"center\" }}>\n <input type=\"color\" style={CI} value={(getColumnPropsAt(row, selCol)?.bgColor) || \"#ffffff\"} onChange={e => updCol(selCol, { bgColor: e.target.value === \"#ffffff\" ? \"\" : e.target.value })} />\n <input type=\"text\" style={{ ...IS, width: 120 }} placeholder=\"transparent\" value={(getColumnPropsAt(row, selCol)?.bgColor) || \"\"} onChange={e => updCol(selCol, { bgColor: e.target.value })} />\n </div>\n </div>\n </PR>\n ) : null}\n {colBgUiStep === \"image\" ? (\n <>\n <PR label={<span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}><ImageIcon size={13} strokeWidth={2.25} aria-hidden />bg image</span>} C={C}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 4 }}>\n <input type=\"text\" style={IS} placeholder=\"https://…\" value={(getColumnPropsAt(row, selCol)?.bgImage) || \"\"} onChange={e => updCol(selCol, { bgImage: e.target.value })} />\n {onUpload && (\n <div style={{ marginTop: 0 }}>\n <input id={`col-bg-upload-${selCol}`} type=\"file\" style={{ display: \"none\" }} accept=\"image/*\"\n onChange={async e => {\n const file = e.target.files?.[0];\n if (!file) return;\n try {\n const url = await onUpload(file);\n updCol(selCol, { bgImage: url });\n } catch (err) {\n console.error(\"Upload failed\", err);\n alert(\"Column background upload failed\");\n }\n e.target.value = \"\";\n }} />\n <button type=\"button\" onClick={() => document.getElementById(`col-bg-upload-${selCol}`)?.click()}\n style={{ background: C.surface, border: `1px solid ${C.border}`, color: C.accent, borderRadius: 5, cursor: \"pointer\", fontSize: 11, padding: \"4px 10px\", width: \"100%\", fontWeight: 600 }}>\n <span style={{ display: \"inline-flex\", alignItems: \"center\", justifyContent: \"center\", gap: 8 }}>\n <UploadIcon size={14} strokeWidth={2.25} aria-hidden />\n <span>Upload</span>\n </span>\n </button>\n </div>\n )}\n </div>\n </PR>\n <div style={{ display: \"flex\", gap: 8, marginBottom: 12 }}>\n <div style={{ flex: 1 }}>\n <PR label=\"fit\" C={C}>\n <select style={IS} value={(getColumnPropsAt(row, selCol)?.bgSize) || \"cover\"} onChange={e => updCol(selCol, { bgSize: e.target.value })}>\n <option value=\"auto\">Auto</option>\n <option value=\"cover\">Cover</option>\n <option value=\"contain\">Contain</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label=\"repeat\" C={C}>\n <select style={IS} value={(getColumnPropsAt(row, selCol)?.bgRepeat) || \"no-repeat\"} onChange={e => updCol(selCol, { bgRepeat: e.target.value })}>\n <option value=\"no-repeat\">No repeat</option>\n <option value=\"repeat\">Repeat</option>\n <option value=\"repeat-x\">Repeat X</option>\n <option value=\"repeat-y\">Repeat Y</option>\n </select>\n </PR>\n </div>\n <div style={{ flex: 1 }}>\n <PR label=\"align\" C={C}>\n <select style={IS} value={(getColumnPropsAt(row, selCol)?.bgPosition) || \"center\"} onChange={e => updCol(selCol, { bgPosition: e.target.value })}>\n {POS_OPTS.map(p => <option key={p} value={p}>{p}</option>)}\n </select>\n </PR>\n </div>\n </div>\n </>\n ) : null}\n\n {colBgUiStep === \"gradient\" ? (\n <details open style={{ marginBottom: 12 }}>\n <summary style={{ cursor: \"pointer\", fontSize: 11, fontWeight: 800, color: C.text }}>gradient</summary>\n <div style={{ marginTop: 10 }}>\n <DynamicGradientField\n label=\"gradient\"\n value={getColumnPropsAt(row, selCol)?.bgGradient}\n onChange={(g) => updCol(selCol, { bgGradient: g })}\n defaults={{ colors: [\"#0ea5e9\", \"#6366f1\", \"#ec4899\"] }}\n C={C}\n />\n </div>\n </details>\n ) : null}\n <PaddingEditor label=\"Column padding\" value={getColumnPropsAt(row, selCol).padding} onChange={(pad) => updCol(selCol, { padding: pad })} C={C} />\n <BorderRadiusEditor label=\"Column radius\" value={getColumnPropsAt(row, selCol).borderRadius} onChange={(br) => updCol(selCol, { borderRadius: br })} C={C} />\n </div>\n )}\n </div>\n </>\n );\n}\n\nexport { ContentBlockEditor, LayoutRowEditor, PR, NumRangePx, ColorField, ImageUrlUploadField, DynamicGradientField, BgModeButtons };\n","import { useEffect, useId, useState, type CSSProperties } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport type { Editor } from \"@tiptap/react\";\r\nimport { useEditor, EditorContent, useEditorState } from \"@tiptap/react\";\r\nimport StarterKit from \"@tiptap/starter-kit\";\r\nimport Placeholder from \"@tiptap/extension-placeholder\";\r\nimport TextAlign from \"@tiptap/extension-text-align\";\r\nimport {\r\n TextStyle,\r\n Color,\r\n FontFamily,\r\n FontSize,\r\n LineHeight,\r\n} from \"@tiptap/extension-text-style\";\r\nimport { LetterSpacing } from \"./LetterSpacing\";\r\nimport { normalizeRichHtmlForStorage } from \"../../lib/htmlUtils\";\r\nimport {\r\n AlignCenter,\r\n AlignJustify,\r\n AlignLeft,\r\n AlignRight,\r\n Bold,\r\n Code,\r\n Heading2,\r\n Heading3,\r\n Heading4,\r\n Italic,\r\n Link2,\r\n List,\r\n ListOrdered,\r\n Maximize2,\r\n Minus,\r\n Quote,\r\n Redo2,\r\n Strikethrough,\r\n Type,\r\n Underline,\r\n Undo2,\r\n Unlink2,\r\n X,\r\n} from \"lucide-react\";\r\n\r\ntype ThemeColors = {\r\n border: string;\r\n surface: string;\r\n inputBg: string;\r\n text: string;\r\n muted: string;\r\n accent: string;\r\n};\r\n\r\nexport type TextTypography = {\r\n fontSize?: number;\r\n color?: string;\r\n align?: string;\r\n fontFamily?: string;\r\n lineHeight?: number;\r\n letterSpacing?: number;\r\n /** Number (px) or four-side box `{ top, right, bottom, left }` like block props. */\r\n padding?: number | { top?: number; right?: number; bottom?: number; left?: number };\r\n};\r\n\r\nconst FONTS = [\r\n \"Georgia,serif\",\r\n \"Arial,sans-serif\",\r\n \"Verdana,sans-serif\",\r\n \"'Courier New',monospace\",\r\n \"Trebuchet MS,sans-serif\",\r\n \"Impact,sans-serif\",\r\n];\r\n\r\nfunction paddingToCss(pad: TextTypography[\"padding\"], fallback: number): string {\r\n if (typeof pad === \"number\" && Number.isFinite(pad)) return `${Math.max(0, pad)}px`;\r\n if (pad && typeof pad === \"object\" && !Array.isArray(pad)) {\r\n const t = typeof pad.top === \"number\" && Number.isFinite(pad.top) ? pad.top : fallback;\r\n const r = typeof pad.right === \"number\" && Number.isFinite(pad.right) ? pad.right : t;\r\n const b = typeof pad.bottom === \"number\" && Number.isFinite(pad.bottom) ? pad.bottom : t;\r\n const l = typeof pad.left === \"number\" && Number.isFinite(pad.left) ? pad.left : r;\r\n return `${t}px ${r}px ${b}px ${l}px`;\r\n }\r\n return `${fallback}px`;\r\n}\r\n\r\nconst FONT_SIZE_PX = [10, 11, 12, 13, 14, 15, 16, 18, 20, 24, 28, 32, 36, 42, 48, 56, 64, 72];\r\nconst LINE_HEIGHT_OPTS = [\"1\", \"1.15\", \"1.25\", \"1.5\", \"1.65\", \"1.75\", \"2\", \"2.5\"];\r\nconst LETTER_SPACING_OPTS = [\"-0.5px\", \"0px\", \"0.5px\", \"1px\", \"1.5px\", \"2px\", \"3px\", \"4px\"];\r\n\r\nfunction rgbChannelToHex(n: number): string {\r\n const v = Math.max(0, Math.min(255, Math.round(n)));\r\n return v.toString(16).padStart(2, \"0\");\r\n}\r\n\r\nfunction hexForColorInput(color: string | undefined | null): string {\r\n if (!color || typeof color !== \"string\") return \"#000000\";\r\n const c = color.trim();\r\n if (/^#[0-9a-fA-F]{3,8}$/.test(c)) {\r\n if (c.length === 4) {\r\n const r = c[1];\r\n const g = c[2];\r\n const b = c[3];\r\n return `#${r}${r}${g}${g}${b}${b}`;\r\n }\r\n return c.slice(0, 7);\r\n }\r\n const rgb = c.match(/^rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i);\r\n if (rgb) {\r\n return `#${rgbChannelToHex(+rgb[1])}${rgbChannelToHex(+rgb[2])}${rgbChannelToHex(+rgb[3])}`;\r\n }\r\n return \"#000000\";\r\n}\r\n\r\nfunction textStyleColorFromEditor(editor: Editor): string | null {\r\n const ts = editor.getAttributes(\"textStyle\") as { color?: string | null };\r\n if (ts.color && String(ts.color).trim()) return String(ts.color).trim();\r\n\r\n const stored = editor.state.storedMarks;\r\n if (stored) {\r\n for (const m of stored) {\r\n if (m.type.name === \"textStyle\" && m.attrs.color) {\r\n return String(m.attrs.color).trim();\r\n }\r\n }\r\n }\r\n\r\n const { from, to } = editor.state.selection;\r\n if (from === to) return null;\r\n\r\n const domAt = editor.view.domAtPos(from);\r\n let el: HTMLElement | null =\r\n domAt.node.nodeType === Node.TEXT_NODE\r\n ? (domAt.node.parentElement as HTMLElement | null)\r\n : (domAt.node as HTMLElement);\r\n while (el && el !== editor.view.dom) {\r\n const inline = el.style?.color?.trim();\r\n if (inline) return inline;\r\n el = el.parentElement;\r\n }\r\n return null;\r\n}\r\n\r\nfunction parsePxSize(raw: string | undefined | null): string {\r\n if (!raw) return \"\";\r\n const s = String(raw).trim();\r\n const m = s.match(/^([\\d.]+)\\s*px$/i);\r\n if (m) return m[1];\r\n if (/^\\d+(\\.\\d+)?$/.test(s)) return s;\r\n return \"\";\r\n}\r\n\r\nfunction normalizeLineHeightAttr(raw: string | undefined | null): string {\r\n if (!raw) return \"\";\r\n const s = String(raw).trim();\r\n return s;\r\n}\r\n\r\nfunction normalizeLetterSpacingAttr(raw: string | undefined | null): string {\r\n if (!raw) return \"\";\r\n return String(raw).trim();\r\n}\r\n\r\nfunction currentBlockTextAlign(editor: Editor): \"left\" | \"center\" | \"right\" | \"justify\" {\r\n const p = editor.getAttributes(\"paragraph\") as { textAlign?: string | null };\r\n const h = editor.getAttributes(\"heading\") as { textAlign?: string | null };\r\n const a = (p.textAlign || h.textAlign || \"left\") as string;\r\n if (a === \"center\" || a === \"right\" || a === \"justify\") return a;\r\n return \"left\";\r\n}\r\n\r\nfunction toolbarSelect(C: ThemeColors): CSSProperties {\r\n return {\r\n maxWidth: 120,\r\n padding: \"3px 5px\",\r\n borderRadius: 4,\r\n border: `1px solid ${C.border}`,\r\n background: C.surface,\r\n color: C.text,\r\n fontSize: 11,\r\n cursor: \"pointer\",\r\n height: 26,\r\n boxSizing: \"border-box\",\r\n };\r\n}\r\n\r\nconst TOOLBAR_ICON = 15;\r\n\r\nfunction toolbarBtn(C: ThemeColors, active: boolean): CSSProperties {\r\n return {\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"4px 7px\",\r\n borderRadius: 4,\r\n border: `1px solid ${active ? C.accent : C.border}`,\r\n background: active ? `${C.accent}18` : C.surface,\r\n color: active ? C.accent : C.text,\r\n cursor: \"pointer\",\r\n fontSize: 11,\r\n fontWeight: 600,\r\n lineHeight: 1,\r\n };\r\n}\r\n\r\nfunction toolbarIconBtn(C: ThemeColors, active: boolean): CSSProperties {\r\n return {\r\n ...toolbarBtn(C, active),\r\n padding: 5,\r\n minWidth: 28,\r\n minHeight: 28,\r\n boxSizing: \"border-box\",\r\n };\r\n}\r\n\r\nfunction ToolbarTypographyControls({ editor, C }: { editor: Editor; C: ThemeColors }) {\r\n const sel = toolbarSelect(C);\r\n const { ts, align, textColor } = useEditorState({\r\n editor,\r\n selector: ({ editor: ed }) => {\r\n const attrs = ed.getAttributes(\"textStyle\") as {\r\n color?: string | null;\r\n fontFamily?: string | null;\r\n fontSize?: string | null;\r\n lineHeight?: string | null;\r\n letterSpacing?: string | null;\r\n };\r\n return {\r\n ts: attrs,\r\n align: currentBlockTextAlign(ed),\r\n textColor: textStyleColorFromEditor(ed),\r\n };\r\n },\r\n });\r\n const fontFamily = ts.fontFamily || \"\";\r\n const sizeVal = parsePxSize(ts.fontSize);\r\n const lhVal = normalizeLineHeightAttr(ts.lineHeight);\r\n const lsVal = normalizeLetterSpacingAttr(ts.letterSpacing);\r\n const lsSelectValue = LETTER_SPACING_OPTS.includes(lsVal) ? lsVal : lsVal || \"\";\r\n\r\n return (\r\n <>\r\n <select\r\n title=\"Font family\"\r\n style={{ ...sel, maxWidth: 104 }}\r\n value={fontFamily}\r\n onChange={(e) => {\r\n const v = e.target.value;\r\n const ch = editor.chain().focus();\r\n if (!v) void ch.unsetFontFamily().run();\r\n else void ch.setFontFamily(v).run();\r\n }}\r\n >\r\n <option value=\"\">Font…</option>\r\n {FONTS.map((f) => (\r\n <option key={f} value={f}>\r\n {f.split(\",\")[0].replace(/'/g, \"\")}\r\n </option>\r\n ))}\r\n </select>\r\n <select\r\n title=\"Font size\"\r\n style={{ ...sel, maxWidth: 68 }}\r\n value={sizeVal}\r\n onChange={(e) => {\r\n const v = e.target.value;\r\n const ch = editor.chain().focus();\r\n if (!v) void ch.unsetFontSize().run();\r\n else void ch.setFontSize(`${v}px`).run();\r\n }}\r\n >\r\n <option value=\"\">Size</option>\r\n {FONT_SIZE_PX.map((n) => (\r\n <option key={n} value={String(n)}>\r\n {n}px\r\n </option>\r\n ))}\r\n </select>\r\n <select\r\n title=\"Line height\"\r\n style={{ ...sel, maxWidth: 76 }}\r\n value={LINE_HEIGHT_OPTS.includes(lhVal) ? lhVal : \"\"}\r\n onChange={(e) => {\r\n const v = e.target.value;\r\n const ch = editor.chain().focus();\r\n if (!v) void ch.unsetLineHeight().run();\r\n else void ch.setLineHeight(v).run();\r\n }}\r\n >\r\n <option value=\"\">Leading</option>\r\n {LINE_HEIGHT_OPTS.map((v) => (\r\n <option key={v} value={v}>\r\n {v}\r\n </option>\r\n ))}\r\n </select>\r\n <select\r\n title=\"Letter spacing\"\r\n style={{ ...sel, maxWidth: 80 }}\r\n value={lsSelectValue}\r\n onChange={(e) => {\r\n const v = e.target.value;\r\n const ch = editor.chain().focus();\r\n if (!v) void ch.unsetLetterSpacing().run();\r\n else void ch.setLetterSpacing(v).run();\r\n }}\r\n >\r\n <option value=\"\">Tracking</option>\r\n {LETTER_SPACING_OPTS.map((v) => (\r\n <option key={v} value={v}>\r\n {v === \"0px\" ? \"0\" : v}\r\n </option>\r\n ))}\r\n {lsVal && !LETTER_SPACING_OPTS.includes(lsVal) ? (\r\n <option value={lsVal}>{lsVal}</option>\r\n ) : null}\r\n </select>\r\n <input\r\n type=\"color\"\r\n title=\"Text color\"\r\n value={hexForColorInput(textColor ?? ts.color)}\r\n onChange={(e) => {\r\n const hex = e.target.value;\r\n void editor.chain().focus().setColor(hex).run();\r\n }}\r\n style={{\r\n width: 28,\r\n height: 26,\r\n padding: 0,\r\n border: `1px solid ${C.border}`,\r\n borderRadius: 4,\r\n cursor: \"pointer\",\r\n background: C.surface,\r\n flexShrink: 0,\r\n }}\r\n />\r\n {(\r\n [\r\n [\"left\", AlignLeft, \"Align left\"],\r\n [\"center\", AlignCenter, \"Align center\"],\r\n [\"right\", AlignRight, \"Align right\"],\r\n [\"justify\", AlignJustify, \"Align justify\"],\r\n ] as const\r\n ).map(([al, Icon, title]) => (\r\n <button\r\n key={al}\r\n type=\"button\"\r\n title={title}\r\n aria-label={title}\r\n onClick={() => void editor.chain().focus().setTextAlign(al).run()}\r\n style={toolbarIconBtn(C, align === al)}\r\n >\r\n <Icon size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n ))}\r\n </>\r\n );\r\n}\r\n\r\nfunction FormattingToolbar({\r\n editor,\r\n C,\r\n}: {\r\n editor: Editor;\r\n C: ThemeColors;\r\n}) {\r\n const [linkPanelOpen, setLinkPanelOpen] = useState(false);\r\n const [linkUrlValue, setLinkUrlValue] = useState(\"\");\r\n const ibtn = (active: boolean) => toolbarIconBtn(C, active);\r\n\r\n const openLinkPanel = () => {\r\n if (editor.isActive(\"link\")) {\r\n editor.chain().focus().extendMarkRange(\"link\").run();\r\n } else {\r\n editor.chain().focus().run();\r\n }\r\n const href = editor.getAttributes(\"link\").href as string | undefined;\r\n setLinkUrlValue(typeof href === \"string\" ? href : \"\");\r\n setLinkPanelOpen(true);\r\n };\r\n\r\n const applyLinkUrl = () => {\r\n const u = linkUrlValue.trim();\r\n if (!u) {\r\n if (editor.isActive(\"link\")) {\r\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\r\n }\r\n setLinkPanelOpen(false);\r\n return;\r\n }\r\n const { empty } = editor.state.selection;\r\n if (empty && !editor.isActive(\"link\")) {\r\n return;\r\n }\r\n let chain = editor.chain().focus();\r\n if (editor.isActive(\"link\")) {\r\n chain = chain.extendMarkRange(\"link\");\r\n }\r\n chain.setLink({ href: u }).run();\r\n setLinkPanelOpen(false);\r\n };\r\n\r\n const removeLinkMark = () => {\r\n if (editor.isActive(\"link\")) {\r\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\r\n }\r\n setLinkPanelOpen(false);\r\n };\r\n\r\n const hBtn = (level: 2 | 3 | 4, Icon: typeof Heading2) => (\r\n <button\r\n type=\"button\"\r\n key={`h${level}`}\r\n onClick={() => editor.chain().focus().toggleHeading({ level }).run()}\r\n style={ibtn(editor.isActive(\"heading\", { level }))}\r\n title={`Heading ${level}`}\r\n aria-label={`Heading ${level}`}\r\n >\r\n <Icon size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n );\r\n\r\n const inputStyle: CSSProperties = {\r\n flex: 1,\r\n minWidth: 160,\r\n padding: \"6px 8px\",\r\n borderRadius: 4,\r\n border: `1px solid ${C.border}`,\r\n background: C.inputBg,\r\n color: C.text,\r\n fontSize: 12,\r\n boxSizing: \"border-box\",\r\n outline: \"none\",\r\n };\r\n\r\n const panelBtn = (primary?: boolean): CSSProperties => ({\r\n padding: \"6px 10px\",\r\n borderRadius: 4,\r\n border: `1px solid ${primary ? C.accent : C.border}`,\r\n background: primary ? `${C.accent}18` : C.surface,\r\n color: C.text,\r\n fontSize: 11,\r\n fontWeight: 600,\r\n cursor: \"pointer\",\r\n });\r\n\r\n return (\r\n <div style={{ position: \"relative\", display: \"flex\", flexDirection: \"column\" }}>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexWrap: \"wrap\",\r\n gap: 4,\r\n padding: 6,\r\n borderBottom: linkPanelOpen ? \"none\" : `1px solid ${C.border}`,\r\n background: C.surface,\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().undo().run()}\r\n disabled={!editor.can().undo()}\r\n style={{ ...ibtn(false), opacity: editor.can().undo() ? 1 : 0.4 }}\r\n title=\"Undo\"\r\n aria-label=\"Undo\"\r\n >\r\n <Undo2 size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().redo().run()}\r\n disabled={!editor.can().redo()}\r\n style={{ ...ibtn(false), opacity: editor.can().redo() ? 1 : 0.4 }}\r\n title=\"Redo\"\r\n aria-label=\"Redo\"\r\n >\r\n <Redo2 size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <span style={{ width: 1, alignSelf: \"stretch\", background: C.border, margin: \"0 2px\" }} />\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleBold().run()}\r\n style={ibtn(editor.isActive(\"bold\"))}\r\n title=\"Bold\"\r\n aria-label=\"Bold\"\r\n >\r\n <Bold size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleItalic().run()}\r\n style={ibtn(editor.isActive(\"italic\"))}\r\n title=\"Italic\"\r\n aria-label=\"Italic\"\r\n >\r\n <Italic size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleUnderline().run()}\r\n style={ibtn(editor.isActive(\"underline\"))}\r\n title=\"Underline\"\r\n aria-label=\"Underline\"\r\n >\r\n <Underline size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleStrike().run()}\r\n style={ibtn(editor.isActive(\"strike\"))}\r\n title=\"Strikethrough\"\r\n aria-label=\"Strikethrough\"\r\n >\r\n <Strikethrough size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleCode().run()}\r\n style={ibtn(editor.isActive(\"code\"))}\r\n title=\"Inline code\"\r\n aria-label=\"Inline code\"\r\n >\r\n <Code size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <span style={{ width: 1, alignSelf: \"stretch\", background: C.border, margin: \"0 2px\" }} />\r\n {hBtn(2, Heading2)}\r\n {hBtn(3, Heading3)}\r\n {hBtn(4, Heading4)}\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().setParagraph().run()}\r\n style={ibtn(editor.isActive(\"paragraph\"))}\r\n title=\"Paragraph\"\r\n aria-label=\"Paragraph\"\r\n >\r\n <Type size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <span style={{ width: 1, alignSelf: \"stretch\", background: C.border, margin: \"0 2px\" }} />\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleBulletList().run()}\r\n style={ibtn(editor.isActive(\"bulletList\"))}\r\n title=\"Bullet list\"\r\n aria-label=\"Bullet list\"\r\n >\r\n <List size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\r\n style={ibtn(editor.isActive(\"orderedList\"))}\r\n title=\"Numbered list\"\r\n aria-label=\"Numbered list\"\r\n >\r\n <ListOrdered size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\r\n style={ibtn(editor.isActive(\"blockquote\"))}\r\n title=\"Quote\"\r\n aria-label=\"Quote\"\r\n >\r\n <Quote size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\r\n style={ibtn(false)}\r\n title=\"Horizontal rule\"\r\n aria-label=\"Horizontal rule\"\r\n >\r\n <Minus size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <span style={{ width: 1, alignSelf: \"stretch\", background: C.border, margin: \"0 2px\" }} />\r\n <ToolbarTypographyControls editor={editor} C={C} />\r\n <span style={{ width: 1, alignSelf: \"stretch\", background: C.border, margin: \"0 2px\" }} />\r\n <button\r\n type=\"button\"\r\n onClick={openLinkPanel}\r\n style={ibtn(editor.isActive(\"link\") || linkPanelOpen)}\r\n title=\"Add or edit link\"\r\n aria-label=\"Add or edit link\"\r\n aria-expanded={linkPanelOpen}\r\n >\r\n <Link2 size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <span style={{ flex: 1, minWidth: 8 }} />\r\n </div>\r\n {linkPanelOpen ? (\r\n <div\r\n role=\"dialog\"\r\n aria-label=\"Link URL\"\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 8,\r\n padding: \"8px 10px 10px\",\r\n borderBottom: `1px solid ${C.border}`,\r\n background: C.inputBg,\r\n }}\r\n >\r\n <label style={{ fontSize: 10, fontWeight: 700, color: C.muted, textTransform: \"uppercase\", letterSpacing: \".06em\" }}>\r\n Link URL\r\n </label>\r\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 6, alignItems: \"center\" }}>\r\n <input\r\n type=\"url\"\r\n value={linkUrlValue}\r\n onChange={(e) => setLinkUrlValue(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n applyLinkUrl();\r\n }\r\n if (e.key === \"Escape\") {\r\n e.preventDefault();\r\n setLinkPanelOpen(false);\r\n }\r\n }}\r\n placeholder=\"https://example.com\"\r\n autoFocus\r\n style={inputStyle}\r\n />\r\n <button type=\"button\" onClick={applyLinkUrl} style={panelBtn(true)}>\r\n Apply\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={removeLinkMark}\r\n disabled={!editor.isActive(\"link\")}\r\n title=\"Remove link\"\r\n aria-label=\"Remove link\"\r\n style={{\r\n ...toolbarIconBtn(C, false),\r\n opacity: editor.isActive(\"link\") ? 1 : 0.35,\r\n cursor: editor.isActive(\"link\") ? \"pointer\" : \"not-allowed\",\r\n }}\r\n >\r\n <Unlink2 size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n <button type=\"button\" onClick={() => setLinkPanelOpen(false)} style={panelBtn()}>\r\n Close\r\n </button>\r\n </div>\r\n {editor.state.selection.empty && !editor.isActive(\"link\") ? (\r\n <span style={{ fontSize: 10, color: C.muted, lineHeight: 1.4 }}>\r\n Select text in the editor, then enter a URL and click Apply.\r\n </span>\r\n ) : null}\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nconst chromeTitleStyle = (C: ThemeColors): CSSProperties => ({\r\n fontSize: 11,\r\n fontWeight: 700,\r\n color: C.text,\r\n textTransform: \"uppercase\",\r\n letterSpacing: \".05em\",\r\n});\r\n\r\nexport function TextRichEditor({\r\n value,\r\n onChange,\r\n typography,\r\n placeholder = \"Write your message…\",\r\n headerTitle = \"Rich editor\",\r\n C,\r\n}: {\r\n value: string;\r\n onChange: (html: string) => void;\r\n typography: TextTypography;\r\n placeholder?: string;\r\n /** Shown on the compact chrome row (with expand) and as the expanded modal title. */\r\n headerTitle?: string;\r\n C: ThemeColors;\r\n}) {\r\n const [expanded, setExpanded] = useState(false);\r\n const expandedTitleId = useId();\r\n\r\n const editor = useEditor({\r\n extensions: [\r\n /** StarterKit v3 includes Link + Underline — configure them here instead of registering twice. */\r\n StarterKit.configure({\r\n heading: { levels: [2, 3, 4] },\r\n link: {\r\n openOnClick: false,\r\n HTMLAttributes: { style: \"color: inherit;\" },\r\n },\r\n }),\r\n TextStyle,\r\n Color.configure({ types: [\"textStyle\"] }),\r\n FontFamily,\r\n FontSize,\r\n LineHeight,\r\n LetterSpacing,\r\n TextAlign.configure({\r\n types: [\"heading\", \"paragraph\", \"blockquote\"],\r\n }),\r\n Placeholder.configure({ placeholder }),\r\n ],\r\n content: normalizeRichHtmlForStorage(value),\r\n onUpdate: ({ editor: ed }) => {\r\n onChange(normalizeRichHtmlForStorage(ed.getHTML()));\r\n },\r\n editorProps: {\r\n attributes: {\r\n style: \"min-height:inherit;outline:none;padding:10px 12px;\",\r\n },\r\n /** `openOnClick: false` does not call preventDefault — browser would still follow href. */\r\n handleDOMEvents: {\r\n click: (view, event) => {\r\n const t = event.target as HTMLElement | null;\r\n if (!t) return false;\r\n const anchor = t.closest(\"a[href]\");\r\n if (!anchor || !view.dom.contains(anchor)) return false;\r\n event.preventDefault();\r\n return true;\r\n },\r\n },\r\n },\r\n });\r\n\r\n useEffect(() => {\r\n if (!editor) return;\r\n const cur = normalizeRichHtmlForStorage(editor.getHTML());\r\n const next = normalizeRichHtmlForStorage(value);\r\n if (next !== cur) {\r\n editor.commands.setContent(next, { emitUpdate: false });\r\n }\r\n }, [value, editor]);\r\n\r\n useEffect(() => {\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key !== \"Escape\") return;\r\n if (expanded) setExpanded(false);\r\n };\r\n window.addEventListener(\"keydown\", onKey);\r\n return () => window.removeEventListener(\"keydown\", onKey);\r\n }, [expanded]);\r\n\r\n const editorWrapStyle = (forModal: boolean): CSSProperties => ({\r\n fontSize: typography.fontSize ?? 15,\r\n color: typography.color ?? C.text,\r\n fontFamily: typography.fontFamily ?? \"Georgia,serif\",\r\n textAlign: (typography.align as CSSProperties[\"textAlign\"]) || \"left\",\r\n lineHeight: typography.lineHeight ?? 1.65,\r\n letterSpacing: typography.letterSpacing ?? 0,\r\n padding: paddingToCss(typography.padding, 12),\r\n minHeight: forModal ? \"min(52vh, 480px)\" : 160,\r\n flex: 1,\r\n minWidth: 0,\r\n });\r\n\r\n const proseStyle = `\r\n .email-text-rich-editor .ProseMirror { min-height: inherit; outline: none; }\r\n .email-text-rich-editor .ProseMirror a { cursor: text; }\r\n /* TipTap Placeholder extension: empty nodes get .is-empty + data-placeholder (no default CSS in package). */\r\n .email-text-rich-editor .ProseMirror p.is-empty::before,\r\n .email-text-rich-editor .ProseMirror h2.is-empty::before,\r\n .email-text-rich-editor .ProseMirror h3.is-empty::before,\r\n .email-text-rich-editor .ProseMirror h4.is-empty::before,\r\n .email-text-rich-editor .ProseMirror blockquote.is-empty::before {\r\n content: attr(data-placeholder);\r\n float: left;\r\n height: 0;\r\n color: ${C.muted};\r\n pointer-events: none;\r\n font-style: italic;\r\n font-weight: 400;\r\n }\r\n .email-text-rich-editor .ProseMirror ul,\r\n .email-text-rich-editor .ProseMirror ol { padding-left: 1.25rem; margin: 0.35em 0; }\r\n .email-text-rich-editor .ProseMirror p { margin: 0.35em 0; }\r\n .email-text-rich-editor .ProseMirror h2,\r\n .email-text-rich-editor .ProseMirror h3,\r\n .email-text-rich-editor .ProseMirror h4 { margin: 0.5em 0 0.25em; line-height: 1.25; }\r\n .email-text-rich-editor .ProseMirror blockquote { margin: 0.35em 0; padding-left: 0.75rem; border-left: 3px solid ${C.border}; }\r\n `;\r\n\r\n /** Formatting toolbar + editor (block wrapper styles still from `typography`). */\r\n const compactLayout = editor ? (\r\n <div\r\n style={{\r\n border: `1px solid ${C.border}`,\r\n borderRadius: 6,\r\n background: C.inputBg,\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n maxHeight: \"calc(100vh - 180px)\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: 8,\r\n padding: \"8px 10px\",\r\n borderBottom: `1px solid ${C.border}`,\r\n background: C.surface,\r\n flexShrink: 0,\r\n }}\r\n >\r\n <span style={chromeTitleStyle(C)}>{headerTitle}</span>\r\n <button\r\n type=\"button\"\r\n onClick={() => setExpanded(true)}\r\n style={toolbarIconBtn(C, false)}\r\n title=\"Expand editor\"\r\n aria-label=\"Expand editor\"\r\n >\r\n <Maximize2 size={TOOLBAR_ICON} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n </div>\r\n <FormattingToolbar editor={editor} C={C} />\r\n <style>{proseStyle}</style>\r\n <div\r\n style={{\r\n position: \"relative\",\r\n flex: 1,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <div\r\n className=\"email-text-rich-editor\"\r\n style={{ ...editorWrapStyle(false), overflowY: \"auto\" }}\r\n >\r\n <EditorContent editor={editor} />\r\n </div>\r\n </div>\r\n </div>\r\n ) : (\r\n <div\r\n style={{\r\n border: `1px solid ${C.border}`,\r\n borderRadius: 6,\r\n background: C.inputBg,\r\n minHeight: 200,\r\n }}\r\n />\r\n );\r\n\r\n /** Modal: same floating layout panel on the right inside the editor area. */\r\n const modalBody = editor ? (\r\n <div\r\n style={{\r\n flex: 1,\r\n minWidth: 0,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n border: `1px solid ${C.border}`,\r\n borderRadius: 8,\r\n overflow: \"hidden\",\r\n background: C.inputBg,\r\n }}\r\n >\r\n <FormattingToolbar editor={editor} C={C} />\r\n <style>{proseStyle}</style>\r\n <div\r\n style={{\r\n position: \"relative\",\r\n flex: 1,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <div\r\n className=\"email-text-rich-editor\"\r\n style={{ ...editorWrapStyle(true), overflowY: \"auto\" }}\r\n >\r\n <EditorContent editor={editor} />\r\n </div>\r\n </div>\r\n </div>\r\n ) : null;\r\n\r\n if (!editor) {\r\n return compactLayout;\r\n }\r\n\r\n return (\r\n <>\r\n {!expanded && compactLayout}\r\n {expanded &&\r\n createPortal(\r\n <div\r\n role=\"dialog\"\r\n aria-modal\r\n aria-labelledby={expandedTitleId}\r\n style={{\r\n position: \"fixed\",\r\n inset: 0,\r\n zIndex: 100000,\r\n background: \"rgba(15,23,42,0.55)\",\r\n backdropFilter: \"blur(6px)\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: 16,\r\n }}\r\n onClick={(e) => {\r\n if (e.target === e.currentTarget) setExpanded(false);\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: \"min(1100px, 100%)\",\r\n height: \"min(92vh, 920px)\",\r\n maxHeight: \"min(92vh, 920px)\",\r\n background: C.surface,\r\n border: `1px solid ${C.border}`,\r\n borderRadius: 12,\r\n boxShadow: \"0 24px 80px rgba(0,0,0,0.35)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n gap: 12,\r\n flexShrink: 0,\r\n padding: \"12px 14px\",\r\n borderBottom: `1px solid ${C.border}`,\r\n background: C.surface,\r\n }}\r\n >\r\n <span id={expandedTitleId} style={{ ...chromeTitleStyle(C), fontSize: 12, letterSpacing: \".06em\" }}>\r\n {headerTitle}\r\n </span>\r\n <button\r\n type=\"button\"\r\n onClick={() => setExpanded(false)}\r\n style={toolbarIconBtn(C, false)}\r\n title=\"Close\"\r\n aria-label=\"Close expanded editor\"\r\n >\r\n <X size={TOOLBAR_ICON + 1} strokeWidth={2.25} aria-hidden />\r\n </button>\r\n </div>\r\n <div\r\n style={{\r\n flex: 1,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n padding: \"12px 14px 14px\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n {modalBody}\r\n </div>\r\n </div>\r\n </div>,\r\n document.body,\r\n )}\r\n </>\r\n );\r\n}\r\n","import { Extension } from \"@tiptap/core\";\r\n\r\ndeclare module \"@tiptap/core\" {\r\n interface Commands<ReturnType> {\r\n letterSpacing: {\r\n setLetterSpacing: (letterSpacing: string) => ReturnType;\r\n unsetLetterSpacing: () => ReturnType;\r\n };\r\n }\r\n}\r\n\r\ndeclare module \"@tiptap/extension-text-style\" {\r\n interface TextStyleAttributes {\r\n letterSpacing?: string | null;\r\n }\r\n}\r\n\r\n/** Inline letter-spacing on the `textStyle` mark (same pattern as FontSize / LineHeight). */\r\nexport const LetterSpacing = Extension.create({\r\n name: \"letterSpacing\",\r\n addOptions() {\r\n return { types: [\"textStyle\"] as string[] };\r\n },\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: this.options.types,\r\n attributes: {\r\n letterSpacing: {\r\n default: null,\r\n parseHTML: (element) => {\r\n const v = element.style.letterSpacing;\r\n return v?.replace(/['\"]+/g, \"\").trim() || null;\r\n },\r\n renderHTML: (attributes) => {\r\n if (!attributes.letterSpacing) {\r\n return {};\r\n }\r\n return { style: `letter-spacing: ${attributes.letterSpacing}` };\r\n },\r\n },\r\n },\r\n },\r\n ];\r\n },\r\n addCommands() {\r\n return {\r\n setLetterSpacing:\r\n (letterSpacing: string) =>\r\n ({ chain }) =>\r\n chain().setMark(\"textStyle\", { letterSpacing }).run(),\r\n unsetLetterSpacing:\r\n () =>\r\n ({ chain }) =>\r\n chain().setMark(\"textStyle\", { letterSpacing: null }).removeEmptyTextStyle().run(),\r\n };\r\n },\r\n});\r\n","/** Preset swatches shown in two rows (8 columns × 2 rows). */\r\nconst COLOR_SWATCHES = [\r\n \"#000000\", \"#ffffff\", \"#64748b\", \"#94a3b8\",\r\n \"#ef4444\", \"#f97316\", \"#eab308\", \"#22c55e\",\r\n \"#14b8a6\", \"#0ea5e9\", \"#3b82f6\", \"#6366f1\",\r\n \"#8b5cf6\", \"#a855f7\", \"#ec4899\", \"#78716c\",\r\n];\r\n\r\nexport function ColorSwatchGrid({\r\n value,\r\n onPick,\r\n C,\r\n compact = false,\r\n}: {\r\n value: string | undefined;\r\n onPick: (hex: string) => void;\r\n C: { border: string; accent: string };\r\n /** Toolbar-friendly smaller swatches in one dense row (wraps). */\r\n compact?: boolean;\r\n}) {\r\n const norm = (v: string | undefined) => (v || \"\").trim().toLowerCase();\r\n const current = norm(value);\r\n const cell = compact ? 16 : undefined;\r\n return (\r\n <div\r\n style={\r\n compact\r\n ? {\r\n display: \"flex\",\r\n flexWrap: \"wrap\",\r\n gap: 3,\r\n alignItems: \"center\",\r\n flex: \"1 1 120px\",\r\n minWidth: 0,\r\n }\r\n : {\r\n display: \"grid\",\r\n gridTemplateColumns: \"repeat(8, minmax(0, 1fr))\",\r\n gap: 4,\r\n marginBottom: 2,\r\n }\r\n }\r\n >\r\n {COLOR_SWATCHES.map((hex) => {\r\n const active = current === hex.toLowerCase();\r\n return (\r\n <button\r\n key={hex}\r\n type=\"button\"\r\n title={hex}\r\n onClick={() => onPick(hex)}\r\n style={{\r\n boxSizing: \"border-box\",\r\n margin: 0,\r\n padding: 0,\r\n width: cell ?? \"100%\",\r\n height: cell,\r\n aspectRatio: compact ? undefined : \"1\",\r\n minHeight: 0,\r\n minWidth: compact ? cell : 0,\r\n borderRadius: compact ? 3 : 4,\r\n border: active ? `2px solid ${C.accent}` : `1px solid ${C.border}`,\r\n background: hex,\r\n cursor: \"pointer\",\r\n flexShrink: 0,\r\n boxShadow: hex.toLowerCase() === \"#ffffff\" ? `inset 0 0 0 1px ${C.border}` : undefined,\r\n }}\r\n />\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n","import {\r\n useState,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useLayoutEffect,\r\n type CSSProperties,\r\n type ReactNode,\r\n} from \"react\";\r\nimport { Monitor, Smartphone, Tablet, Columns2 } from \"lucide-react\";\r\nimport { previewEmailSrcDoc } from \"../../lib/emailHtml\";\r\n\r\nexport type MobilePreviewVariant = \"iphone\" | \"android\";\r\n\r\nexport type EmailPreviewModalProps = {\r\n html: string;\r\n contentWidth?: number;\r\n rowCount?: number;\r\n blockCount?: number;\r\n editorZoom?: number;\r\n locale?: string;\r\n initialDevice?: string;\r\n /** Phone shell in mobile / split view: iPhone vs Android frame + viewport width. */\r\n initialMobileVariant?: MobilePreviewVariant;\r\n onClose: () => void;\r\n C: Record<string, string>;\r\n /** Shown as the header line (e.g. email subject). */\r\n title?: string;\r\n secondaryActionLabel?: string;\r\n onSecondaryAction?: () => void;\r\n};\r\n\r\n// ─── PREVIEW MODAL ───────────────────────────────────────────────────────────\r\nconst DEVICES = [\r\n {\r\n key:\"desktop\", label:\"Desktop\", maxW:1024,\r\n screenW:null, screenH:null,\r\n frame: null,\r\n },\r\n {\r\n key:\"tablet\", label:\"Tablet\", maxW:820,\r\n screenW:820, screenH:1180,\r\n chrome: {\r\n body: { width:860, borderRadius:18, background:\"linear-gradient(145deg,#2a2a3a,#1a1a28)\", padding:\"14px 14px 20px\", boxShadow:\"0 0 0 1px #444,0 30px 80px rgba(0,0,0,.7),inset 0 1px 0 rgba(255,255,255,.08)\" },\r\n topBar: { height:20, display:\"flex\", alignItems:\"center\", justifyContent:\"center\", marginBottom:10 },\r\n topBarInner: { width:60, height:6, borderRadius:3, background:\"#333\" },\r\n bottomBar: { height:16, display:\"flex\", alignItems:\"center\", justifyContent:\"center\", marginTop:10 },\r\n homeIndicator: { width:100, height:4, borderRadius:2, background:\"#444\" },\r\n screen: { borderRadius:10, overflow:\"hidden\", border:\"2px solid #111\" },\r\n },\r\n },\r\n {\r\n key:\"mobile\", label:\"Mobile\", maxW:390,\r\n screenW:390, screenH:844,\r\n chrome: {\r\n body: { width:430, borderRadius:52, background:\"linear-gradient(145deg,#2a2a3a,#1a1a28)\", padding:\"16px 16px 24px\", boxShadow:\"0 0 0 1px #555,0 40px 100px rgba(0,0,0,.8),inset 0 1px 0 rgba(255,255,255,.1)\" },\r\n notch: true,\r\n sideButtons: true,\r\n topBar: { height:30, display:\"flex\", alignItems:\"flex-start\", justifyContent:\"center\", paddingTop:8, marginBottom:4 },\r\n topBarInner: null,\r\n bottomBar: { height:24, display:\"flex\", alignItems:\"center\", justifyContent:\"center\", marginTop:6 },\r\n homeIndicator: { width:120, height:5, borderRadius:3, background:\"#555\" },\r\n screen: { borderRadius:42, overflow:\"hidden\", border:\"2px solid #111\" },\r\n },\r\n },\r\n];\r\n\r\n/** Logical points (viewport) — drives `previewEmailSrcDoc` and device aspect ratio. */\r\nconst MOBILE_IPHONE = { logicalW: 390, logicalH: 844, label: \"iPhone\", outerRadius: 46, innerRadius: 38 };\r\nconst MOBILE_ANDROID = { logicalW: 412, logicalH: 915, label: \"Android\", outerRadius: 32, innerRadius: 20 };\r\n\r\nfunction previewIframeWidthPx(deviceKey: \"mobile\" | \"tablet\", mobileVariant: MobilePreviewVariant = \"iphone\"): number {\r\n if (deviceKey === \"tablet\") {\r\n const d = DEVICES.find((x) => x.key === \"tablet\");\r\n return d?.maxW ?? 820;\r\n }\r\n return mobileVariant === \"android\" ? MOBILE_ANDROID.logicalW : MOBILE_IPHONE.logicalW;\r\n}\r\n\r\nfunction PreviewDeviceIcon({ devKey, color }) {\r\n const p = { size: 15, strokeWidth: 1.75, color: color || \"currentColor\", style: { display: \"block\", flexShrink: 0 } };\r\n if (devKey === \"desktop\") return <Monitor {...p} />;\r\n if (devKey === \"tablet\") return <Tablet {...p} />;\r\n return <Smartphone {...p} />;\r\n}\r\n\r\nfunction BrowserBar({ url, C }) {\r\n const icon = C.muted;\r\n return (\r\n <div style={{ background: C.toolbarBg, padding: \"8px 12px\", display: \"flex\", alignItems: \"center\", gap: 8, borderBottom: `1px solid ${C.border}`, flexShrink: 0 }}>\r\n <div style={{ display: \"flex\", gap: 5 }}>\r\n {[\"#ef4444\", \"#f59e0b\", \"#22c55e\"].map((col) => (\r\n <div key={col} style={{ width: 10, height: 10, borderRadius: \"50%\", background: col }} />\r\n ))}\r\n </div>\r\n <div style={{ flex: 1, background: C.surface, borderRadius: 6, padding: \"4px 10px\", display: \"flex\", alignItems: \"center\", gap: 6, border: `1px solid ${C.border}` }}>\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\"><path d=\"M5 1a4 4 0 100 8A4 4 0 005 1z\" stroke={icon} strokeWidth=\"1.2\"/><path d=\"M5 1v8M1 5h8M2.3 2.3l5.4 5.4M7.7 2.3L2.3 7.7\" stroke={icon} strokeWidth=\".8\"/></svg>\r\n <span style={{ fontSize: 11, color: C.muted, fontFamily: \"monospace\", letterSpacing: \".02em\" }}>{url || \"email-preview\"}</span>\r\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill={icon} style={{ marginLeft: \"auto\" }}><path d=\"M1 4a3 3 0 106 0A3 3 0 001 4z\"/></svg>\r\n </div>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <circle cx=\"7\" cy=\"7\" r=\"5.5\" stroke={icon} strokeWidth=\"1.2\"/>\r\n <path d=\"M7 4.5v3l2 1.5\" stroke={icon} strokeWidth=\"1.2\" strokeLinecap=\"round\"/>\r\n </svg>\r\n </div>\r\n );\r\n}\r\n\r\nfunction StatusBar({ time, C, variant = \"light\" }) {\r\n const dark = variant === \"dark\";\r\n const ink = dark ? \"#f5f5f7\" : C.text;\r\n const barBg = dark ? \"#000000\" : C.toolbarBg;\r\n const hair = dark ? \"#2c2c2e\" : C.border;\r\n return (\r\n <div style={{ background: barBg, height: 44, display: \"flex\", alignItems: \"flex-end\", justifyContent: \"space-between\", padding: \"0 24px 8px\", flexShrink: 0, borderBottom: `1px solid ${hair}` }}>\r\n <span style={{ fontSize: 12, fontWeight: 700, color: ink, letterSpacing: \".04em\" }}>{time}</span>\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\r\n <svg width=\"14\" height=\"10\" viewBox=\"0 0 14 10\" fill={ink} opacity=\".75\"><rect x=\"0\" y=\"4\" width=\"2\" height=\"6\" rx=\"1\"/><rect x=\"3\" y=\"3\" width=\"2\" height=\"7\" rx=\"1\"/><rect x=\"6\" y=\"1\" width=\"2\" height=\"9\" rx=\"1\"/><rect x=\"9\" y=\"0\" width=\"2\" height=\"10\" rx=\"1\"/></svg>\r\n <svg width=\"14\" height=\"10\" viewBox=\"0 0 16 12\" fill={ink} opacity=\".75\"><path d=\"M8 2.4C5.6 2.4 3.4 3.4 1.8 5L0 3.2C2.2 1.2 5 0 8 0s5.8 1.2 8 3.2L14.2 5C12.6 3.4 10.4 2.4 8 2.4z\"/><path d=\"M8 6c-1.6 0-3 .7-4 1.7L2.4 6.2C3.8 4.8 5.8 4 8 4s4.2.8 5.6 2.2L12 7.7C11 6.7 9.6 6 8 6z\"/><circle cx=\"8\" cy=\"11\" r=\"1.5\"/></svg>\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\r\n <div style={{ width: 18, height: 9, border: `1.5px solid ${ink}`, borderRadius: 2, display: \"flex\", alignItems: \"center\", padding: \"1px\", opacity: 0.75 }}>\r\n <div style={{ width: \"70%\", height: \"100%\", background: ink, borderRadius: 1 }} />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction AndroidStatusBar({ time }: { time: string }) {\r\n const ink = \"#e8eaed\";\r\n return (\r\n <div\r\n style={{\r\n background: \"#1a1a1c\",\r\n height: 48,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n padding: \"0 18px 0 20px\",\r\n flexShrink: 0,\r\n borderBottom: \"1px solid #2d2d30\",\r\n }}\r\n >\r\n <span style={{ fontSize: 14, fontWeight: 600, color: ink, letterSpacing: \".02em\" }}>{time}</span>\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\r\n <svg width=\"16\" height=\"10\" viewBox=\"0 0 16 10\" fill=\"none\" stroke={ink} strokeWidth={1.2} opacity={0.9}>\r\n <path d=\"M8 9a5 5 0 000-8M3 5a3 3 0 105 0M5.5 5a1.5 1.5 0 103 0\" strokeLinecap=\"round\" />\r\n </svg>\r\n <svg width=\"14\" height=\"10\" viewBox=\"0 0 14 10\" fill={ink} opacity={0.9}>\r\n <rect x=\"1\" y=\"7\" width=\"2\" height=\"2\" rx=\"0.5\" />\r\n <rect x=\"4.5\" y=\"5\" width=\"2\" height=\"4\" rx=\"0.5\" />\r\n <rect x=\"8\" y=\"3\" width=\"2\" height=\"6\" rx=\"0.5\" />\r\n <rect x=\"11\" y=\"1\" width=\"2\" height=\"8\" rx=\"0.5\" />\r\n </svg>\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 2, border: `1.5px solid ${ink}`, borderRadius: 3, padding: \"2px 5px\", opacity: 0.95 }}>\r\n <div style={{ width: 14, height: 7, borderRadius: 1, background: ink, opacity: 0.35 }} />\r\n <div style={{ width: 1, height: 5, background: ink, borderRadius: 1 }} />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/** Aspect-ratio–locked shell; iframe fills remaining height below system chrome. */\r\nfunction MobileDeviceChrome({\r\n variant,\r\n children,\r\n C,\r\n}: {\r\n variant: MobilePreviewVariant;\r\n children: ReactNode;\r\n C: Record<string, string>;\r\n}) {\r\n const spec = variant === \"android\" ? MOBILE_ANDROID : MOBILE_IPHONE;\r\n const now = new Date();\r\n const time = `${now.getHours().toString().padStart(2, \"0\")}:${now.getMinutes().toString().padStart(2, \"0\")}`;\r\n const frameShell =\r\n variant === \"android\"\r\n ? \"linear-gradient(160deg, #3a3a3e 0%, #252528 40%, #1a1a1d 100%)\"\r\n : \"linear-gradient(165deg, #1c1c1e 0%, #000000 48%, #0d0d0f 100%)\";\r\n const sideBtn = \"#2c2c2e\";\r\n const screenBorder = variant === \"android\" ? \"#0d0d0f\" : \"#0a0a0a\";\r\n\r\n /** Fixed CSS width so iframe viewport + aspect ratio stay correct; parent scales to fit viewport. */\r\n const frameOuterW = spec.logicalW + (variant === \"android\" ? 20 : 18);\r\n\r\n return (\r\n <div\r\n style={{\r\n width: frameOuterW,\r\n aspectRatio: `${spec.logicalW} / ${spec.logicalH}`,\r\n boxSizing: \"border-box\",\r\n borderRadius: spec.outerRadius,\r\n background: frameShell,\r\n padding: variant === \"android\" ? \"5px 5px 6px\" : \"0 3px 3px\",\r\n boxShadow: \"0 0 0 1px #000, 0 32px 72px rgba(0,0,0,.55)\",\r\n position: \"relative\",\r\n flexShrink: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n {variant === \"iphone\" ? (\r\n <>\r\n <div style={{ position: \"absolute\", left: -3, top: \"18%\", width: 3, height: 32, background: sideBtn, borderRadius: \"2px 0 0 2px\", zIndex: 2 }} />\r\n <div style={{ position: \"absolute\", left: -3, top: \"26%\", width: 3, height: 60, background: sideBtn, borderRadius: \"2px 0 0 2px\", zIndex: 2 }} />\r\n <div style={{ position: \"absolute\", left: -3, top: \"34%\", width: 3, height: 60, background: sideBtn, borderRadius: \"2px 0 0 2px\", zIndex: 2 }} />\r\n <div style={{ position: \"absolute\", right: -3, top: \"28%\", width: 3, height: 80, background: sideBtn, borderRadius: \"0 2px 2px 0\", zIndex: 2 }} />\r\n </>\r\n ) : null}\r\n\r\n <div\r\n style={{\r\n flex: 1,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n borderRadius: spec.innerRadius,\r\n overflow: \"hidden\",\r\n border: `2px solid ${screenBorder}`,\r\n background: \"#000\",\r\n }}\r\n >\r\n {variant === \"iphone\" ? (\r\n <>\r\n <StatusBar time={time} C={C} variant=\"dark\" />\r\n <div style={{ position: \"relative\", background: \"#000\", marginTop: -1, minHeight: 28, flexShrink: 0 }}>\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n width: 110,\r\n height: 28,\r\n background: \"#000\",\r\n borderRadius: \"0 0 18px 18px\",\r\n zIndex: 10,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n gap: 8,\r\n }}\r\n >\r\n <div style={{ width: 10, height: 10, borderRadius: \"50%\", background: \"#1c1c1e\", border: \"2px solid #3a3a3c\" }} />\r\n <div style={{ width: 54, height: 5, borderRadius: 3, background: \"#3a3a3c\" }} />\r\n </div>\r\n </div>\r\n </>\r\n ) : (\r\n <div style={{ position: \"relative\", flexShrink: 0 }}>\r\n <AndroidStatusBar time={time} />\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n top: 10,\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n width: 12,\r\n height: 12,\r\n borderRadius: \"50%\",\r\n background: \"#0a0a0c\",\r\n border: \"2px solid #2a2a2e\",\r\n zIndex: 5,\r\n pointerEvents: \"none\",\r\n }}\r\n />\r\n </div>\r\n )}\r\n\r\n <div\r\n style={{\r\n flex: 1,\r\n minHeight: 0,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n background: \"#fff\",\r\n padding: 10,\r\n boxSizing: \"border-box\",\r\n }}\r\n >\r\n <div style={{ flex: 1, minHeight: 0, width: \"100%\", position: \"relative\" }}>{children}</div>\r\n </div>\r\n\r\n {variant === \"iphone\" ? (\r\n <div style={{ background: \"#fff\", height: 22, flexShrink: 0, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\r\n <div style={{ width: 120, height: 5, borderRadius: 3, background: \"#d1d5db\" }} />\r\n </div>\r\n ) : (\r\n <div style={{ background: \"#0f0f10\", height: 26, flexShrink: 0, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\r\n <div style={{ width: 112, height: 4, borderRadius: 4, background: \"#4a4a52\" }} />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n/** Scales the phone shell to fit the preview pane (short viewports, split view) without changing iframe logical width. */\r\nfunction MobilePhoneScaleSlot({ variantKey, children }: { variantKey: MobilePreviewVariant; children: ReactNode }) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const phoneRef = useRef<HTMLDivElement>(null);\r\n const [fit, setFit] = useState({ s: 1, w: 0, h: 0 });\r\n\r\n useLayoutEffect(() => {\r\n const container = containerRef.current;\r\n const phone = phoneRef.current;\r\n if (!container || !phone) return;\r\n\r\n const run = () => {\r\n const cw = container.clientWidth;\r\n const ch = container.clientHeight;\r\n const pw = phone.offsetWidth;\r\n const ph = phone.offsetHeight;\r\n if (cw < 12 || ch < 12 || pw < 12 || ph < 12) return;\r\n const pad = 20;\r\n const raw = Math.min(1, (cw - pad) / pw, (ch - pad) / ph);\r\n const s = Number.isFinite(raw) ? Math.max(0.2, raw) : 1;\r\n setFit({ s, w: pw * s, h: ph * s });\r\n };\r\n\r\n const ro = new ResizeObserver(run);\r\n ro.observe(container);\r\n ro.observe(phone);\r\n run();\r\n const t = window.setTimeout(run, 0);\r\n const raf = window.requestAnimationFrame(run);\r\n return () => {\r\n ro.disconnect();\r\n window.clearTimeout(t);\r\n window.cancelAnimationFrame(raf);\r\n };\r\n }, [variantKey]);\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n style={{\r\n flex: 1,\r\n minHeight: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: fit.w > 0 ? fit.w : undefined,\r\n height: fit.h > 0 ? fit.h : undefined,\r\n minWidth: 0,\r\n minHeight: 0,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n transform: `scale(${fit.s})`,\r\n transformOrigin: \"center center\",\r\n willChange: \"transform\",\r\n }}\r\n >\r\n <div ref={phoneRef} style={{ width: \"max-content\" }}>\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction TabletChrome({ children, C }) {\r\n const shell = `linear-gradient(145deg, ${C.canvas} 0%, ${C.surface} 50%, ${C.border} 100%)`;\r\n return (\r\n <div style={{ width: \"max-content\", maxWidth: \"100%\", boxSizing: \"border-box\", borderRadius: 18, background: shell, padding: \"14px 14px 20px\", boxShadow: `0 0 0 1px ${C.border}, 0 24px 56px rgba(15,23,42,.1), inset 0 1px 0 #fff`, flexShrink: 0 }}>\r\n <div style={{ height: 16, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", marginBottom: 10 }}>\r\n <div style={{ width: 60, height: 5, borderRadius: 3, background: C.muted, opacity: 0.5 }} />\r\n </div>\r\n <div style={{ borderRadius: 10, overflow: \"hidden\", border: `2px solid ${C.border}`, background: \"#fff\" }}>\r\n <BrowserBar url=\"email-preview\" C={C} />\r\n <div style={{ overflow: \"hidden\", background: \"#fff\", minHeight: 0, padding: 12 }}>{children}</div>\r\n </div>\r\n <div style={{ height: 18, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", marginTop: 10 }}>\r\n <div style={{ width: 100, height: 4, borderRadius: 2, background: C.muted, opacity: 0.45 }} />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction DesktopChrome({ children, C, maxW }) {\r\n return (\r\n <div style={{ width: \"100%\", maxWidth: maxW, borderRadius: 10, overflow: \"hidden\", boxShadow: `0 16px 48px rgba(15,23,42,.1), 0 0 0 1px ${C.border}`, border: `1px solid ${C.border}`, background: C.sidebar }}>\r\n <BrowserBar url=\"email-preview\" C={C} />\r\n <div style={{ background: \"#fff\", overflow: \"hidden\", minHeight: 0, padding: 12 }}>{children}</div>\r\n </div>\r\n );\r\n}\r\n\r\nfunction PreviewModal({\r\n html,\r\n contentWidth,\r\n rowCount = 0,\r\n blockCount = 0,\r\n editorZoom = 100,\r\n locale = \"en\",\r\n initialDevice,\r\n initialMobileVariant = \"iphone\",\r\n onClose,\r\n C,\r\n title,\r\n secondaryActionLabel,\r\n onSecondaryAction,\r\n}: EmailPreviewModalProps) {\r\n const [dev, setDev] = useState(initialDevice || \"desktop\");\r\n const [zoom, setZoom] = useState(100);\r\n const [split, setSplit] = useState(false);\r\n const [mobileVariant, setMobileVariant] = useState<MobilePreviewVariant>(initialMobileVariant);\r\n\r\n useEffect(() => {\r\n const h = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") onClose();\r\n };\r\n window.addEventListener(\"keydown\", h);\r\n return () => window.removeEventListener(\"keydown\", h);\r\n }, [onClose]);\r\n\r\n // Reset zoom when device changes\r\n useEffect(() => setZoom(100), [dev]);\r\n\r\n /** Desktop: fill chrome. Mobile/tablet: fixed CSS width on the iframe so `srcDoc` layout viewport matches device (responsive CSS applies). */\r\n const iframeHDesktop = \"min(720px, calc(100vh - 200px))\";\r\n const mobileIframeW = previewIframeWidthPx(\"mobile\", mobileVariant);\r\n const tabletIframeW = previewIframeWidthPx(\"tablet\");\r\n const srcDocMobile = useMemo(() => previewEmailSrcDoc(html, mobileIframeW), [html, mobileIframeW]);\r\n const srcDocTablet = useMemo(() => previewEmailSrcDoc(html, tabletIframeW), [html, tabletIframeW]);\r\n\r\n const IframeContent = ({\r\n srcDoc,\r\n title: iframeTitle,\r\n iframeWidth,\r\n fill,\r\n style: s = {},\r\n }: {\r\n srcDoc: string;\r\n title: string;\r\n iframeWidth?: number;\r\n /** Fill parent (e.g. phone shell); use with a `position: relative` flex child. */\r\n fill?: boolean;\r\n style?: CSSProperties;\r\n }) => (\r\n <iframe\r\n srcDoc={srcDoc}\r\n title={iframeTitle}\r\n width={iframeWidth}\r\n scrolling=\"yes\"\r\n style={{\r\n border: \"none\",\r\n display: \"block\",\r\n boxSizing: \"border-box\",\r\n ...(fill\r\n ? {\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n maxWidth: \"100%\",\r\n overflow: \"auto\",\r\n }\r\n : iframeWidth != null\r\n ? {\r\n width: iframeWidth,\r\n maxWidth: \"min(100%, calc(100vw - 80px))\",\r\n }\r\n : {\r\n width: \"100%\",\r\n maxWidth: \"100%\",\r\n }),\r\n ...(!fill ? { height: iframeHDesktop, minHeight: iframeWidth != null ? 220 : 280 } : { minHeight: 0 }),\r\n ...s,\r\n }}\r\n sandbox=\"allow-same-origin allow-scripts\"\r\n />\r\n );\r\n\r\n const deviceBg = C.canvas;\r\n const hairline = C.border;\r\n const tabInactiveBg = \"transparent\";\r\n const tabInactiveFg = C.muted;\r\n const tabActiveBg = C.accent;\r\n const tabActiveFg = \"#fff\";\r\n\r\n const previewBodyStretchMobile = dev === \"mobile\" || split;\r\n const previewBodyPadding = previewBodyStretchMobile ? \"12px 16px\" : \"28px 32px\";\r\n\r\n return (\r\n <div style={{ position: \"fixed\", inset: 0, zIndex: 9000, background: \"rgba(15, 23, 42, 0.45)\", backdropFilter: \"blur(12px)\", display: \"flex\", flexDirection: \"column\", overflow: \"hidden\" }}>\r\n <style>{`\r\n @keyframes pmSlideIn{from{opacity:0;transform:translateY(-12px)}to{opacity:1;transform:translateY(0)}}\r\n @keyframes devicePop{from{opacity:0;transform:scale(.94) translateY(16px)}to{opacity:1;transform:scale(1) translateY(0)}}\r\n .pm-device{animation:devicePop .22s cubic-bezier(.34,1.56,.64,1);}\r\n `}</style>\r\n\r\n {/* ── HEADER: subject left · device + zoom · actions right ── */}\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10, padding: \"8px 16px\", background: C.toolbarBg, borderBottom: `1px solid ${hairline}`, flexShrink: 0, animation: \"pmSlideIn .16s ease\" }}>\r\n\r\n <span\r\n style={{\r\n flex: 1,\r\n minWidth: 0,\r\n fontWeight: 700,\r\n fontSize: 14,\r\n color: C.text,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n title={title || undefined}\r\n >\r\n {title?.trim() ? title : \"\\u2014\"}\r\n </span>\r\n\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, flexShrink: 0 }}>\r\n <div style={{ display: \"flex\", gap: 2, background: C.surface, padding: 3, borderRadius: 8, border: `1px solid ${hairline}` }}>\r\n {DEVICES.map((d) => (\r\n <button\r\n key={d.key}\r\n type=\"button\"\r\n title={d.label}\r\n aria-label={d.label}\r\n onClick={() => {\r\n setDev(d.key);\r\n setSplit(false);\r\n }}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: 34,\r\n height: 30,\r\n padding: 0,\r\n borderRadius: 6,\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n transition: \"all .15s\",\r\n background: dev === d.key && !split ? tabActiveBg : tabInactiveBg,\r\n color: dev === d.key && !split ? tabActiveFg : tabInactiveFg,\r\n }}\r\n >\r\n <PreviewDeviceIcon devKey={d.key} color={dev === d.key && !split ? tabActiveFg : tabInactiveFg} />\r\n </button>\r\n ))}\r\n <button\r\n type=\"button\"\r\n title=\"Split view\"\r\n aria-label=\"Split view\"\r\n onClick={() => setSplit((s) => !s)}\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: 34,\r\n height: 30,\r\n padding: 0,\r\n borderRadius: 6,\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n transition: \"all .15s\",\r\n background: split ? tabActiveBg : tabInactiveBg,\r\n color: split ? tabActiveFg : tabInactiveFg,\r\n }}\r\n >\r\n <Columns2 size={15} strokeWidth={1.75} color={split ? tabActiveFg : tabInactiveFg} style={{ display: \"block\", flexShrink: 0 }} />\r\n </button>\r\n </div>\r\n\r\n {(dev === \"mobile\" || split) ? (\r\n <div\r\n role=\"group\"\r\n aria-label=\"Phone preview\"\r\n style={{\r\n display: \"flex\",\r\n gap: 2,\r\n background: C.surface,\r\n padding: 3,\r\n borderRadius: 8,\r\n border: `1px solid ${hairline}`,\r\n }}\r\n >\r\n {([\"iphone\", \"android\"] as const).map((v) => (\r\n <button\r\n key={v}\r\n type=\"button\"\r\n title={v === \"iphone\" ? MOBILE_IPHONE.label : MOBILE_ANDROID.label}\r\n aria-label={v === \"iphone\" ? MOBILE_IPHONE.label : MOBILE_ANDROID.label}\r\n aria-pressed={mobileVariant === v}\r\n onClick={() => setMobileVariant(v)}\r\n style={{\r\n padding: \"4px 10px\",\r\n borderRadius: 6,\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n fontSize: 11,\r\n fontWeight: 700,\r\n transition: \"all .15s\",\r\n background: mobileVariant === v ? tabActiveBg : tabInactiveBg,\r\n color: mobileVariant === v ? tabActiveFg : tabInactiveFg,\r\n }}\r\n >\r\n {v === \"iphone\" ? \"iPhone\" : \"Android\"}\r\n </button>\r\n ))}\r\n </div>\r\n ) : null}\r\n\r\n {dev === \"desktop\" && !split ? (\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\r\n <button type=\"button\" onClick={() => setZoom((z) => Math.max(50, z - 10))} style={{ background: C.surface, border: `1px solid ${hairline}`, color: C.text, width: 24, height: 24, borderRadius: 4, cursor: \"pointer\", fontSize: 13, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>−</button>\r\n <span style={{ fontSize: 11, color: C.muted, minWidth: 36, textAlign: \"center\" }}>{zoom}%</span>\r\n <button type=\"button\" onClick={() => setZoom((z) => Math.min(150, z + 10))} style={{ background: C.surface, border: `1px solid ${hairline}`, color: C.text, width: 24, height: 24, borderRadius: 4, cursor: \"pointer\", fontSize: 13, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>+</button>\r\n <button type=\"button\" onClick={() => setZoom(100)} style={{ background: \"none\", border: `1px solid ${hairline}`, color: C.muted, padding: \"3px 7px\", borderRadius: 4, cursor: \"pointer\", fontSize: 10 }}>Reset</button>\r\n </div>\r\n ) : null}\r\n\r\n {typeof onSecondaryAction === \"function\" && secondaryActionLabel ? (\r\n <button\r\n type=\"button\"\r\n onClick={onSecondaryAction}\r\n style={{\r\n background: C.surface,\r\n border: `1px solid ${hairline}`,\r\n color: C.text,\r\n padding: \"6px 12px\",\r\n borderRadius: 6,\r\n cursor: \"pointer\",\r\n fontSize: 12,\r\n fontWeight: 700,\r\n }}\r\n >\r\n {secondaryActionLabel}\r\n </button>\r\n ) : null}\r\n\r\n <button\r\n type=\"button\"\r\n onClick={onClose}\r\n style={{\r\n background: \"none\",\r\n border: `1px solid ${hairline}`,\r\n color: C.muted,\r\n width: 30,\r\n height: 30,\r\n borderRadius: 6,\r\n cursor: \"pointer\",\r\n fontSize: 17,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}\r\n >\r\n ×\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* ── BODY (no outer scroll; iframe handles scrolling) ── */}\r\n <div style={{ flex: 1, display: \"flex\", minHeight: 0, overflow: \"hidden\" }}>\r\n <div\r\n style={{\r\n flex: 1,\r\n minHeight: 0,\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n alignItems: previewBodyStretchMobile ? \"stretch\" : dev === \"desktop\" ? \"flex-start\" : \"center\",\r\n justifyContent: \"center\",\r\n padding: previewBodyPadding,\r\n background: deviceBg,\r\n }}\r\n >\r\n {split ? (\r\n <div style={{ display: \"flex\", gap: 24, alignItems: \"stretch\", justifyContent: \"center\", width: \"100%\", minHeight: 0, overflow: \"hidden\" }}>\r\n <div\r\n className=\"pm-device\"\r\n style={{\r\n width: \"100%\",\r\n maxWidth: 440,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n minHeight: 0,\r\n overflow: \"hidden\",\r\n flexShrink: 0,\r\n }}\r\n >\r\n <MobilePhoneScaleSlot variantKey={mobileVariant}>\r\n <MobileDeviceChrome variant={mobileVariant} C={C}>\r\n <IframeContent srcDoc={srcDocMobile} title=\"mobile-split\" iframeWidth={mobileIframeW} fill />\r\n </MobileDeviceChrome>\r\n </MobilePhoneScaleSlot>\r\n </div>\r\n <div className=\"pm-device\" style={{ width: \"100%\", minWidth: 0, flex: 1, maxWidth: 900, overflow: \"hidden\" }}>\r\n <DesktopChrome C={C} maxW={900}>\r\n <IframeContent srcDoc={html} title=\"desktop-split\" />\r\n </DesktopChrome>\r\n </div>\r\n </div>\r\n ) : dev === \"mobile\" ? (\r\n <div className=\"pm-device\" style={{ width: \"380px\", maxWidth: 440, display: \"flex\", justifyContent: \"center\", alignItems: \"center\", overflow: \"hidden\", minHeight: 0 }}>\r\n <MobilePhoneScaleSlot variantKey={mobileVariant}>\r\n <MobileDeviceChrome variant={mobileVariant} C={C}>\r\n <IframeContent srcDoc={srcDocMobile} title=\"mobile\" iframeWidth={mobileIframeW} fill />\r\n </MobileDeviceChrome>\r\n </MobilePhoneScaleSlot>\r\n </div>\r\n ) : dev === \"tablet\" ? (\r\n <div className=\"pm-device\" style={{ width: \"100%\", display: \"flex\", justifyContent: \"center\", overflow: \"hidden\" }}>\r\n <TabletChrome C={C}>\r\n <IframeContent srcDoc={srcDocTablet} title=\"tablet\" iframeWidth={tabletIframeW} />\r\n </TabletChrome>\r\n </div>\r\n ) : (\r\n <div\r\n className=\"pm-device\"\r\n style={{\r\n width: \"100%\",\r\n maxWidth: 1024,\r\n transformOrigin: \"top center\",\r\n transform: `scale(${zoom / 100})`,\r\n marginBottom: zoom < 100 ? `-${(1 - zoom / 100) * 400}px` : 0,\r\n transition: \"transform .2s,margin .2s\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n <DesktopChrome C={C} maxW={1024}>\r\n <IframeContent srcDoc={html} title=\"desktop\" />\r\n </DesktopChrome>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport { PreviewModal, DEVICES };\r\n","import { useEffect, useRef } from \"react\";\r\n\r\nfunction ContextMenu({x,y,items,onClose,C}) {\r\n const ref=useRef(null);\r\n useEffect(()=>{\r\n const h=()=>onClose();\r\n window.addEventListener(\"mousedown\",h);\r\n window.addEventListener(\"keydown\",h);\r\n return()=>{window.removeEventListener(\"mousedown\",h);window.removeEventListener(\"keydown\",h);};\r\n },[onClose]);\r\n return (\r\n <div ref={ref} onMouseDown={e=>e.stopPropagation()} style={{position:\"fixed\",left:x,top:y,zIndex:9999,background:C.sidebar,border:`1px solid ${C.border}`,borderRadius:7,padding:\"4px 0\",boxShadow:`0 8px 32px rgba(0,0,0,.4)`,minWidth:160}}>\r\n {items.map((item,i)=>item.sep?(\r\n <div key={i} style={{height:1,background:C.border,margin:\"3px 0\"}}/>\r\n ):(\r\n <button\r\n key={i}\r\n type=\"button\"\r\n disabled={!!item.disabled}\r\n onClick={()=>{if(item.disabled)return;item.action();onClose();}}\r\n style={{\r\n display:\"block\",width:\"100%\",background:\"none\",border:\"none\",padding:\"7px 14px\",textAlign:\"left\",\r\n cursor:item.disabled?\"not-allowed\":\"pointer\",fontSize:12,\r\n color:item.disabled?C.muted:item.danger?C.danger:C.text,\r\n fontWeight:item.bold?700:400,opacity:item.disabled?0.45:1,\r\n }}\r\n onMouseEnter={e=>{if(!item.disabled)e.currentTarget.style.background=C.surface;}}\r\n onMouseLeave={e=>{e.currentTarget.style.background=\"none\";}}\r\n >\r\n {item.icon&&<span style={{marginRight:8}}>{item.icon}</span>}{item.label}\r\n </button>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport { ContextMenu };\r\n","function ConfirmDialog({message,onConfirm,onCancel,C}) {\r\n return (\r\n <div style={{position:\"fixed\",inset:0,zIndex:9500,background:\"rgba(0,0,0,.7)\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\"}}>\r\n <div style={{background:C.sidebar,border:`1px solid ${C.border}`,borderRadius:10,padding:24,maxWidth:320,textAlign:\"center\",boxShadow:\"0 20px 60px rgba(0,0,0,.5)\"}}>\r\n <div style={{fontSize:24,marginBottom:12}}>⚠️</div>\r\n <div style={{fontSize:14,color:C.text,marginBottom:20,lineHeight:1.5}}>{message}</div>\r\n <div style={{display:\"flex\",gap:10,justifyContent:\"center\"}}>\r\n <button onClick={onCancel} style={{background:\"none\",border:`1px solid ${C.border}`,color:C.text,padding:\"8px 20px\",borderRadius:6,cursor:\"pointer\",fontSize:13}}>Cancel</button>\r\n <button onClick={onConfirm} style={{background:C.danger,border:\"none\",color:\"#fff\",padding:\"8px 20px\",borderRadius:6,cursor:\"pointer\",fontSize:13,fontWeight:700}}>Confirm</button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport { ConfirmDialog };\r\n","import { useState, useRef } from \"react\";\r\n\r\nfunction TBtn({\r\n onClick,\r\n title,\r\n children,\r\n active = false,\r\n accent,\r\n muted,\r\n border,\r\n text,\r\n disabled = false,\r\n style: sx = {},\r\n}) {\r\n const [show,setShow]=useState(false);\r\n const ref=useRef(null);\r\n const [pos,setPos]=useState({left:0,top:0});\r\n return (\r\n <div style={{position:\"relative\",display:\"inline-flex\"}} ref={ref}\r\n onMouseEnter={()=>{setShow(true);if(ref.current){const r=ref.current.getBoundingClientRect();setPos({left:r.left+r.width/2,top:r.bottom+6});}}}\r\n onMouseLeave={()=>setShow(false)}>\r\n <button onClick={onClick} disabled={disabled}\r\n style={{background:active?`${accent}22`:\"none\",border:`1px solid ${active?accent:border}`,color:disabled?muted:active?accent:text,padding:\"5px 10px\",borderRadius:5,cursor:disabled?\"default\":\"pointer\",fontSize:12,fontWeight:600,...sx}}>\r\n {children}\r\n </button>\r\n {show&&<div style={{position:\"fixed\",left:pos.left,top:pos.top,transform:\"translateX(-50%)\",background:\"rgba(0,0,0,.85)\",color:\"#fff\",padding:\"3px 8px\",borderRadius:4,fontSize:11,pointerEvents:\"none\",whiteSpace:\"nowrap\",zIndex:9999}}>{title}</div>}\r\n </div>\r\n );\r\n}\r\n\r\nexport { TBtn };\r\n"],"mappings":"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","names":["ReactEmailEditor","import_react","BOX0","import_jsx_runtime","numOr","tr","pad","base","tr","tr","pad","defaults","merged","import_jsx_runtime","tr","numOr","import_lucide_react","import_react","import_lucide_react","import_react","import_jsx_runtime","pad","StarterKit","TextAlign","Placeholder","import_jsx_runtime","import_jsx_runtime","UploadIcon","g","SolidIcon","GradientIcon","ImageIcon","FONTS","pad","import_react","import_lucide_react","import_jsx_runtime","pad","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","options","r","ColorIcon","ImageIcon","RepeatIcon","GradientIcon","ReactEmailEditor"]}
|