@emabuild/core 0.0.1 → 0.0.3
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/canvas/row-renderer.d.ts +4 -0
- package/dist/canvas/row-renderer.d.ts.map +1 -1
- package/dist/dnd/drag-manager.d.ts +13 -14
- package/dist/dnd/drag-manager.d.ts.map +1 -1
- package/dist/dnd/drop-indicator.d.ts +24 -0
- package/dist/dnd/drop-indicator.d.ts.map +1 -0
- package/dist/dnd/shadow-dom-utils.d.ts +29 -0
- package/dist/dnd/shadow-dom-utils.d.ts.map +1 -0
- package/dist/index.js +1 -1
- package/dist/{mail-editor-DzI7SmSe.js → mail-editor-ClkIyPni.js} +830 -871
- package/dist/mail-editor-ClkIyPni.js.map +1 -0
- package/dist/mail-editor.d.ts +1 -0
- package/dist/mail-editor.d.ts.map +1 -1
- package/dist/mail-editor.js +1 -1
- package/dist/properties/property-panel.d.ts +4 -6
- package/dist/properties/property-panel.d.ts.map +1 -1
- package/dist/properties/widgets/alignment-widget.d.ts +4 -0
- package/dist/properties/widgets/alignment-widget.d.ts.map +1 -0
- package/dist/properties/widgets/color-picker-widget.d.ts +4 -0
- package/dist/properties/widgets/color-picker-widget.d.ts.map +1 -0
- package/dist/properties/widgets/dropdown-widget.d.ts +4 -0
- package/dist/properties/widgets/dropdown-widget.d.ts.map +1 -0
- package/dist/properties/widgets/index.d.ts +8 -0
- package/dist/properties/widgets/index.d.ts.map +1 -0
- package/dist/properties/widgets/padding-widget.d.ts +4 -0
- package/dist/properties/widgets/padding-widget.d.ts.map +1 -0
- package/dist/properties/widgets/text-input-widget.d.ts +4 -0
- package/dist/properties/widgets/text-input-widget.d.ts.map +1 -0
- package/dist/properties/widgets/textarea-widget.d.ts +4 -0
- package/dist/properties/widgets/textarea-widget.d.ts.map +1 -0
- package/dist/properties/widgets/toggle-widget.d.ts +4 -0
- package/dist/properties/widgets/toggle-widget.d.ts.map +1 -0
- package/dist/sidebar/body-settings.d.ts +15 -0
- package/dist/sidebar/body-settings.d.ts.map +1 -0
- package/dist/sidebar/editor-sidebar.d.ts.map +1 -1
- package/dist/state/design-factory.d.ts +9 -0
- package/dist/state/design-factory.d.ts.map +1 -0
- package/dist/state/design-lookup.d.ts +14 -0
- package/dist/state/design-lookup.d.ts.map +1 -0
- package/dist/state/editor-store.d.ts +26 -7
- package/dist/state/editor-store.d.ts.map +1 -1
- package/dist/state/history-manager.d.ts +20 -0
- package/dist/state/history-manager.d.ts.map +1 -0
- package/dist/tools/built-in/button-tool.d.ts.map +1 -1
- package/dist/tools/built-in/divider-tool.d.ts.map +1 -1
- package/dist/tools/built-in/form-tool.d.ts.map +1 -1
- package/dist/tools/built-in/heading-tool.d.ts.map +1 -1
- package/dist/tools/built-in/html-tool.d.ts.map +1 -1
- package/dist/tools/built-in/image-tool.d.ts.map +1 -1
- package/dist/tools/built-in/menu-tool.d.ts.map +1 -1
- package/dist/tools/built-in/paragraph-tool.d.ts.map +1 -1
- package/dist/tools/built-in/social-tool.d.ts.map +1 -1
- package/dist/tools/built-in/table-tool.d.ts.map +1 -1
- package/dist/tools/built-in/text-tool.d.ts.map +1 -1
- package/dist/tools/built-in/timer-tool.d.ts.map +1 -1
- package/dist/tools/built-in/video-tool.d.ts.map +1 -1
- package/dist/tools/helpers/email-html.d.ts +55 -0
- package/dist/tools/helpers/email-html.d.ts.map +1 -0
- package/dist/tools/helpers/index.d.ts +5 -0
- package/dist/tools/helpers/index.d.ts.map +1 -0
- package/dist/tools/helpers/types.d.ts +36 -0
- package/dist/tools/helpers/types.d.ts.map +1 -0
- package/dist/tools/helpers/value-extractor.d.ts +31 -0
- package/dist/tools/helpers/value-extractor.d.ts.map +1 -0
- package/dist/utils/event-emitter.d.ts +32 -4
- package/dist/utils/event-emitter.d.ts.map +1 -1
- package/dist/utils/id-generator.d.ts +17 -3
- package/dist/utils/id-generator.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/mail-editor-DzI7SmSe.js.map +0 -1
- package/dist/utils/deep-clone.d.ts +0 -2
- package/dist/utils/deep-clone.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mail-editor-DzI7SmSe.js","sources":["../src/utils/deep-clone.ts","../src/utils/id-generator.ts","../src/utils/event-emitter.ts","../src/state/editor-store.ts","../src/tools/tool-registry.ts","../src/dnd/drag-state.ts","../src/dnd/drag-manager.ts","../src/tools/built-in/text-tool.ts","../src/tools/built-in/heading-tool.ts","../src/tools/built-in/paragraph-tool.ts","../src/tools/built-in/image-tool.ts","../src/tools/built-in/button-tool.ts","../src/tools/built-in/divider-tool.ts","../src/tools/built-in/html-tool.ts","../src/tools/built-in/social-tool.ts","../src/tools/built-in/menu-tool.ts","../src/tools/built-in/video-tool.ts","../src/tools/built-in/timer-tool.ts","../src/tools/built-in/table-tool.ts","../src/tools/built-in/form-tool.ts","../../email-renderer/dist/index.js","../src/mail-editor.ts"],"sourcesContent":["export function deepClone<T>(obj: T): T {\n return structuredClone(obj);\n}\n","let counter = 0;\n\nexport function generateId(): string {\n return `me_${Date.now().toString(36)}_${(counter++).toString(36)}`;\n}\n\nexport function createCounterManager() {\n const counters: Record<string, number> = {};\n\n return {\n getCounters(): Record<string, number> {\n return { ...counters };\n },\n\n setCounters(c: Record<string, number>): void {\n Object.keys(counters).forEach((k) => delete counters[k]);\n Object.assign(counters, c);\n },\n\n next(prefix: string): number {\n const current = counters[prefix] ?? 0;\n counters[prefix] = current + 1;\n return counters[prefix];\n },\n };\n}\n","type Listener = (...args: unknown[]) => void;\n\nexport class EventEmitter {\n private listeners = new Map<string, Set<Listener>>();\n\n on(event: string, listener: Listener): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener);\n }\n\n off(event: string, listener: Listener): void {\n this.listeners.get(event)?.delete(listener);\n }\n\n emit(event: string, ...args: unknown[]): void {\n this.listeners.get(event)?.forEach((fn) => {\n try {\n fn(...args);\n } catch (e) {\n console.error(`[maileditor] Error in \"${event}\" listener:`, e);\n }\n });\n }\n\n removeAllListeners(event?: string): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n}\n","import type {\n UnlayerDesign,\n DesignBody,\n DesignRow,\n DesignColumn,\n DesignContent,\n BodyValues,\n RowValues,\n ColumnValues,\n ContentValues,\n MailEditorConfig,\n ExportOptions,\n ExportResult,\n DesignUpdatedEvent,\n} from '@emabuild/types';\nimport { deepClone } from '../utils/deep-clone.js';\nimport { createCounterManager } from '../utils/id-generator.js';\nimport { EventEmitter } from '../utils/event-emitter.js';\n\n// ============================================================\n// Default empty design\n// ============================================================\n\nfunction createEmptyDesign(): UnlayerDesign {\n return {\n counters: { u_row: 0, u_column: 0 },\n body: {\n id: 'u_body',\n rows: [],\n headers: [],\n footers: [],\n values: {\n backgroundColor: '#e7e7e7',\n contentAlign: 'center',\n contentVerticalAlign: 'center',\n contentWidth: '600px',\n fontFamily: { label: 'Arial', value: 'arial,helvetica,sans-serif' },\n textColor: '#000000',\n linkStyle: {\n body: true,\n linkColor: '#0000ee',\n linkHoverColor: '#0000ee',\n linkUnderline: true,\n linkHoverUnderline: true,\n },\n preheaderText: '',\n popupPosition: 'center',\n popupWidth: '600px',\n popupHeight: 'auto',\n borderRadius: '10px',\n popupBackgroundColor: '#FFFFFF',\n popupBackgroundImage: { url: '', fullWidth: true, repeat: 'no-repeat', center: true, cover: true },\n popupOverlay_backgroundColor: 'rgba(0, 0, 0, 0.1)',\n popupCloseButton_position: 'top-right',\n popupCloseButton_backgroundColor: '#DDDDDD',\n popupCloseButton_iconColor: '#000000',\n popupCloseButton_borderRadius: '0px',\n popupCloseButton_margin: '0px',\n popupCloseButton_action: {\n name: 'close_popup',\n attrs: { onClick: \"document.querySelector('.u-popup-container').style.display = 'none';\" },\n },\n _meta: { htmlID: 'u_body', htmlClassNames: 'u_body' },\n },\n },\n schemaVersion: 16,\n };\n}\n\n// ============================================================\n// Editor Store\n// ============================================================\n\nexport type StoreSubscriber = () => void;\n\nexport class EditorStore {\n private design: UnlayerDesign;\n private undoStack: UnlayerDesign[] = [];\n private redoStack: UnlayerDesign[] = [];\n private maxHistory = 50;\n private subscribers = new Set<StoreSubscriber>();\n private counterManager = createCounterManager();\n readonly events = new EventEmitter();\n\n // Selection\n private _selectedId: string | null = null;\n private _hoveredId: string | null = null;\n private _viewMode: 'desktop' | 'mobile' = 'desktop';\n private _activeTab = 'content';\n\n constructor() {\n this.design = createEmptyDesign();\n }\n\n // ----------------------------------------------------------\n // Subscriptions (for Lit reactive controllers)\n // ----------------------------------------------------------\n\n subscribe(fn: StoreSubscriber): () => void {\n this.subscribers.add(fn);\n return () => this.subscribers.delete(fn);\n }\n\n private notify(): void {\n this.subscribers.forEach((fn) => fn());\n }\n\n // ----------------------------------------------------------\n // Getters\n // ----------------------------------------------------------\n\n getDesign(): UnlayerDesign {\n return this.design;\n }\n\n getBody(): DesignBody {\n return this.design.body;\n }\n\n getRows(): DesignRow[] {\n return this.design.body.rows;\n }\n\n getBodyValues(): BodyValues {\n return this.design.body.values;\n }\n\n get selectedId(): string | null {\n return this._selectedId;\n }\n\n get hoveredId(): string | null {\n return this._hoveredId;\n }\n\n get viewMode(): 'desktop' | 'mobile' {\n return this._viewMode;\n }\n\n get activeTab(): string {\n return this._activeTab;\n }\n\n get canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n get canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n // ----------------------------------------------------------\n // Design loading\n // ----------------------------------------------------------\n\n loadDesign(design: UnlayerDesign): void {\n this.design = deepClone(design);\n this.counterManager.setCounters(this.design.counters);\n this.undoStack = [];\n this.redoStack = [];\n this._selectedId = null;\n this.notify();\n this.events.emit('design:loaded', { design: this.design });\n }\n\n // ----------------------------------------------------------\n // History (undo/redo)\n // ----------------------------------------------------------\n\n private pushHistory(): void {\n this.undoStack.push(deepClone(this.design));\n if (this.undoStack.length > this.maxHistory) {\n this.undoStack.shift();\n }\n this.redoStack = [];\n }\n\n undo(): void {\n const prev = this.undoStack.pop();\n if (!prev) return;\n this.redoStack.push(deepClone(this.design));\n this.design = prev;\n this.counterManager.setCounters(this.design.counters);\n this.notify();\n this.emitUpdate('content_updated');\n }\n\n redo(): void {\n const next = this.redoStack.pop();\n if (!next) return;\n this.undoStack.push(deepClone(this.design));\n this.design = next;\n this.counterManager.setCounters(this.design.counters);\n this.notify();\n this.emitUpdate('content_updated');\n }\n\n // ----------------------------------------------------------\n // Selection / UI state\n // ----------------------------------------------------------\n\n select(id: string | null): void {\n this._selectedId = id;\n this.notify();\n }\n\n hover(id: string | null): void {\n this._hoveredId = id;\n this.notify();\n }\n\n setViewMode(mode: 'desktop' | 'mobile'): void {\n this._viewMode = mode;\n this.notify();\n }\n\n setActiveTab(tab: string): void {\n this._activeTab = tab;\n this.notify();\n }\n\n // ----------------------------------------------------------\n // Row operations\n // ----------------------------------------------------------\n\n addRow(row: DesignRow, index?: number): void {\n this.pushHistory();\n const rows = this.design.body.rows;\n if (index !== undefined && index >= 0 && index <= rows.length) {\n rows.splice(index, 0, deepClone(row));\n } else {\n rows.push(deepClone(row));\n }\n this.syncCounters();\n this.notify();\n this.emitUpdate('row_added', row);\n }\n\n removeRow(rowId: string): void {\n this.pushHistory();\n const rows = this.design.body.rows;\n const idx = rows.findIndex((r) => r.id === rowId);\n if (idx !== -1) {\n rows.splice(idx, 1);\n if (this._selectedId === rowId) this._selectedId = null;\n this.notify();\n this.emitUpdate('row_removed');\n }\n }\n\n moveRow(fromIndex: number, toIndex: number): void {\n this.pushHistory();\n const rows = this.design.body.rows;\n const [row] = rows.splice(fromIndex, 1);\n rows.splice(toIndex, 0, row);\n this.notify();\n this.emitUpdate('row_reordered');\n }\n\n updateRowValues(rowId: string, patch: Partial<RowValues>): void {\n const row = this.findRow(rowId);\n if (!row) return;\n this.pushHistory();\n Object.assign(row.values, patch);\n this.notify();\n this.emitUpdate('content_updated');\n }\n\n // ----------------------------------------------------------\n // Column operations\n // ----------------------------------------------------------\n\n updateColumnValues(columnId: string, patch: Partial<ColumnValues>): void {\n const col = this.findColumn(columnId);\n if (!col) return;\n this.pushHistory();\n Object.assign(col.values, patch);\n this.notify();\n this.emitUpdate('content_updated');\n }\n\n // ----------------------------------------------------------\n // Content operations\n // ----------------------------------------------------------\n\n addContent(columnId: string, content: DesignContent, index?: number): void {\n const col = this.findColumn(columnId);\n if (!col) return;\n this.pushHistory();\n const cloned = deepClone(content);\n if (index !== undefined && index >= 0 && index <= col.contents.length) {\n col.contents.splice(index, 0, cloned);\n } else {\n col.contents.push(cloned);\n }\n this.syncCounters();\n this.notify();\n this.emitUpdate('content_added', cloned);\n }\n\n removeContent(contentId: string): void {\n for (const row of this.design.body.rows) {\n for (const col of row.columns) {\n const idx = col.contents.findIndex((c) => c.id === contentId);\n if (idx !== -1) {\n this.pushHistory();\n col.contents.splice(idx, 1);\n if (this._selectedId === contentId) this._selectedId = null;\n this.notify();\n this.emitUpdate('content_removed');\n return;\n }\n }\n }\n }\n\n updateContentValues(contentId: string, patch: Partial<ContentValues>): void {\n const content = this.findContent(contentId);\n if (!content) return;\n this.pushHistory();\n Object.assign(content.values, patch);\n this.notify();\n this.emitUpdate('content_updated');\n }\n\n moveContent(contentId: string, targetColumnId: string, targetIndex: number): void {\n const content = this.findContent(contentId);\n if (!content) return;\n\n // Remove from source\n for (const row of this.design.body.rows) {\n for (const col of row.columns) {\n const idx = col.contents.findIndex((c) => c.id === contentId);\n if (idx !== -1) {\n this.pushHistory();\n col.contents.splice(idx, 1);\n break;\n }\n }\n }\n\n // Insert at target\n const targetCol = this.findColumn(targetColumnId);\n if (targetCol) {\n targetCol.contents.splice(targetIndex, 0, content);\n }\n\n this.notify();\n this.emitUpdate('content_reordered');\n }\n\n duplicateContent(contentId: string): void {\n const content = this.findContent(contentId);\n if (!content) return;\n\n for (const row of this.design.body.rows) {\n for (const col of row.columns) {\n const idx = col.contents.findIndex((c) => c.id === contentId);\n if (idx !== -1) {\n const cloned = deepClone(content);\n const counter = this.counterManager.next(`u_content_${content.type}`);\n cloned.id = `u_content_${content.type}_${counter}`;\n cloned.values._meta = {\n htmlID: cloned.id,\n htmlClassNames: `u_content_${content.type}`,\n };\n this.pushHistory();\n col.contents.splice(idx + 1, 0, cloned);\n this.syncCounters();\n this.notify();\n this.emitUpdate('content_added', cloned);\n return;\n }\n }\n }\n }\n\n // ----------------------------------------------------------\n // Body values\n // ----------------------------------------------------------\n\n updateBodyValues(patch: Partial<BodyValues>): void {\n this.pushHistory();\n Object.assign(this.design.body.values, patch);\n this.notify();\n this.emitUpdate('body_updated');\n }\n\n // ----------------------------------------------------------\n // Lookup helpers\n // ----------------------------------------------------------\n\n findRow(rowId: string): DesignRow | undefined {\n return this.design.body.rows.find((r) => r.id === rowId);\n }\n\n findColumn(columnId: string): DesignColumn | undefined {\n for (const row of this.design.body.rows) {\n const col = row.columns.find((c) => c.id === columnId);\n if (col) return col;\n }\n return undefined;\n }\n\n findContent(contentId: string): DesignContent | undefined {\n for (const row of this.design.body.rows) {\n for (const col of row.columns) {\n const content = col.contents.find((c) => c.id === contentId);\n if (content) return content;\n }\n }\n return undefined;\n }\n\n findParentColumn(contentId: string): DesignColumn | undefined {\n for (const row of this.design.body.rows) {\n for (const col of row.columns) {\n if (col.contents.some((c) => c.id === contentId)) return col;\n }\n }\n return undefined;\n }\n\n findParentRow(columnId: string): DesignRow | undefined {\n for (const row of this.design.body.rows) {\n if (row.columns.some((c) => c.id === columnId)) return row;\n }\n return undefined;\n }\n\n // ----------------------------------------------------------\n // Helpers\n // ----------------------------------------------------------\n\n /** Creates a new row with the given column layout */\n createRow(cellProportions: number[]): DesignRow {\n const rowNum = this.counterManager.next('u_row');\n const columns: DesignColumn[] = cellProportions.map((_, i) => {\n const colNum = this.counterManager.next('u_column');\n return {\n id: `u_column_${colNum}`,\n contents: [],\n values: {\n backgroundColor: '',\n padding: '0px',\n border: {},\n borderRadius: '0px',\n _meta: { htmlID: `u_column_${colNum}`, htmlClassNames: 'u_column' },\n },\n };\n });\n\n this.syncCounters();\n\n return {\n id: `u_row_${rowNum}`,\n cells: cellProportions,\n columns,\n values: {\n displayCondition: null,\n columns: false,\n backgroundColor: '',\n columnsBackgroundColor: '',\n backgroundImage: { url: '', fullWidth: true, repeat: false, center: true, cover: false },\n padding: '0px',\n anchor: '',\n hideDesktop: false,\n hideMobile: false,\n _meta: { htmlID: `u_row_${rowNum}`, htmlClassNames: 'u_row' },\n },\n };\n }\n\n /** Creates a new content block for the given tool type */\n createContent(type: string, values: Record<string, unknown> = {}): DesignContent {\n const counter = this.counterManager.next(`u_content_${type}`);\n const id = `u_content_${type}_${counter}`;\n\n this.syncCounters();\n\n return {\n id,\n type,\n values: {\n containerPadding: '10px',\n anchor: '',\n hideDesktop: false,\n hideMobile: false,\n displayCondition: null,\n _meta: { htmlID: id, htmlClassNames: `u_content_${type}` },\n ...values,\n },\n };\n }\n\n private syncCounters(): void {\n this.design.counters = this.counterManager.getCounters();\n }\n\n private emitUpdate(type: DesignUpdatedEvent['type'], item?: unknown): void {\n this.events.emit('design:updated', { type, item } satisfies DesignUpdatedEvent);\n }\n}\n","import type { TemplateResult } from 'lit';\nimport type { ToolDefinition, ToolPropertyGroup, ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\n\n// ============================================================\n// Lit-specific tool definition (narrows TEditorResult to TemplateResult)\n// ============================================================\n\nexport interface LitToolDefinition extends ToolDefinition<TemplateResult> {\n renderer: {\n renderEditor(values: ContentValues, context: EditorRenderContext): TemplateResult;\n renderHtml(values: ContentValues, context: ExportRenderContext): string;\n };\n}\n\n// ============================================================\n// Tool Registry\n// ============================================================\n\nexport class ToolRegistry {\n private tools = new Map<string, LitToolDefinition>();\n\n register(tool: LitToolDefinition): void {\n this.tools.set(tool.name, tool);\n }\n\n get(name: string): LitToolDefinition | undefined {\n return this.tools.get(name);\n }\n\n getAll(): LitToolDefinition[] {\n return Array.from(this.tools.values()).sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n }\n\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n getDefaultValues(name: string): Record<string, unknown> {\n const tool = this.tools.get(name);\n if (!tool) return {};\n\n const defaults: Record<string, unknown> = { ...tool.defaultValues };\n\n // Also collect defaults from property definitions\n for (const group of Object.values(tool.options)) {\n for (const [key, prop] of Object.entries(group.options)) {\n if (!(key in defaults)) {\n defaults[key] = prop.defaultValue;\n }\n }\n }\n\n return defaults;\n }\n\n getPropertyGroups(name: string): Record<string, ToolPropertyGroup> {\n return this.tools.get(name)?.options ?? {};\n }\n}\n","/** Shared drag state — simple module-level singleton to avoid shadow DOM event propagation issues */\nexport const dragState = {\n /** ID of the content currently being dragged (null if not dragging content) */\n draggingContentId: null as string | null,\n\n startContentDrag(contentId: string) {\n this.draggingContentId = contentId;\n },\n\n reset() {\n this.draggingContentId = null;\n },\n};\n","import type { EditorStore } from '../state/editor-store.js';\nimport type { ToolRegistry } from '../tools/tool-registry.js';\nimport { dragState } from './drag-state.js';\n\ntype DropType = 'content' | 'row';\n\ninterface DropTarget {\n type: DropType;\n /** For content drops: the column ID */\n columnId?: string;\n /** For content drops: index within column */\n contentIndex?: number;\n /** For row drops: index within body.rows */\n rowIndex?: number;\n /** Y position for sorting */\n y: number;\n}\n\nexport class DragManager {\n private store: EditorStore;\n private toolRegistry: ToolRegistry;\n private root: ShadowRoot;\n private currentDrop: DropTarget | null = null;\n private indicator: HTMLElement | null = null;\n private rowIndicator: HTMLElement | null = null;\n\n constructor(store: EditorStore, toolRegistry: ToolRegistry, root: ShadowRoot) {\n this.store = store;\n this.toolRegistry = toolRegistry;\n this.root = root;\n }\n\n attach(): void {\n this.root.addEventListener('dragover', this.handleDragOver as EventListener);\n this.root.addEventListener('drop', this.handleDrop as EventListener);\n this.root.addEventListener('dragend', this.handleDragEnd as EventListener);\n this.root.addEventListener('dragleave', this.handleDragLeave as EventListener);\n this.root.addEventListener('dragstart', this.handleDragStart as EventListener);\n\n // Content drop indicator (inside columns)\n this.indicator = this.createIndicator('#3b82f6');\n // Row drop indicator (between rows on the canvas)\n this.rowIndicator = this.createIndicator('#8b5cf6');\n }\n\n private createIndicator(color: string): HTMLElement {\n const el = document.createElement('div');\n Object.assign(el.style, {\n position: 'absolute',\n left: '0', right: '0',\n height: '3px',\n background: color,\n borderRadius: '2px',\n pointerEvents: 'none',\n zIndex: '1000',\n display: 'none',\n boxShadow: `0 0 6px ${color}80`,\n });\n return el;\n }\n\n detach(): void {\n this.root.removeEventListener('dragover', this.handleDragOver as EventListener);\n this.root.removeEventListener('drop', this.handleDrop as EventListener);\n this.root.removeEventListener('dragend', this.handleDragEnd as EventListener);\n this.root.removeEventListener('dragleave', this.handleDragLeave as EventListener);\n this.root.removeEventListener('dragstart', this.handleDragStart as EventListener);\n this.indicator?.remove();\n this.rowIndicator?.remove();\n }\n\n // ----------------------------------------------------------\n // Drag start — content reordering\n // Content renderers set dataTransfer in their own handler,\n // but we can't read getData during dragover (browser security).\n // So we also track via a shared state on the DragManager.\n // ----------------------------------------------------------\n\n private handleDragStart = (_e: DragEvent) => {\n // Content renderers update dragState directly (shared module state)\n // We read it in handleDragOver/handleDrop\n };\n\n // ----------------------------------------------------------\n // Drag over — find nearest drop slot and show indicator\n // ----------------------------------------------------------\n\n private handleDragOver = (e: DragEvent) => {\n const types = e.dataTransfer?.types || [];\n const isToolDrag = types.includes('application/maileditor-tool');\n const isLayoutDrag = types.includes('application/maileditor-layout');\n const isContentDrag = types.includes('application/maileditor-content') || !!dragState.draggingContentId;\n\n if (!isToolDrag && !isContentDrag && !isLayoutDrag) return;\n\n e.preventDefault();\n e.dataTransfer!.dropEffect = (isToolDrag || isLayoutDrag) ? 'copy' : 'move';\n\n if (isLayoutDrag) {\n // Layout drops go between rows\n const drop = this.findRowDropPosition(e.clientY);\n this.hideIndicator();\n if (drop) {\n this.currentDrop = drop;\n this.showRowIndicator(drop);\n } else {\n this.hideRowIndicator();\n this.currentDrop = null;\n }\n } else {\n // Tool/content drops go inside columns\n const drop = this.findContentDropPosition(e.clientX, e.clientY);\n this.hideRowIndicator();\n if (drop) {\n this.currentDrop = drop;\n this.showContentIndicator(drop);\n } else {\n this.hideIndicator();\n this.currentDrop = null;\n }\n }\n };\n\n // ----------------------------------------------------------\n // Drop\n // ----------------------------------------------------------\n\n private handleDrop = (e: DragEvent) => {\n e.preventDefault();\n this.hideIndicator();\n this.hideRowIndicator();\n\n // Layout drop\n const layoutData = e.dataTransfer?.getData('application/maileditor-layout');\n if (layoutData) {\n const cells = JSON.parse(layoutData) as number[];\n const row = this.store.createRow(cells);\n const rowIndex = this.currentDrop?.type === 'row' ? this.currentDrop.rowIndex : undefined;\n this.store.addRow(row, rowIndex);\n this.reset();\n return;\n }\n\n // Tool drop\n const toolName = e.dataTransfer?.getData('application/maileditor-tool');\n if (toolName) {\n if (this.currentDrop?.type === 'content' && this.currentDrop.columnId) {\n const defaults = this.toolRegistry.getDefaultValues(toolName);\n const content = this.store.createContent(toolName, defaults);\n this.store.addContent(this.currentDrop.columnId, content, this.currentDrop.contentIndex);\n this.store.select(content.id);\n } else {\n // No target column — create new row\n const row = this.store.createRow([1]);\n this.store.addRow(row);\n const defaults = this.toolRegistry.getDefaultValues(toolName);\n const content = this.store.createContent(toolName, defaults);\n this.store.addContent(row.columns[0].id, content);\n this.store.select(content.id);\n }\n this.reset();\n return;\n }\n\n // Content reorder\n const contentId = e.dataTransfer?.getData('application/maileditor-content') || dragState.draggingContentId;\n if (contentId && this.currentDrop?.type === 'content' && this.currentDrop.columnId) {\n this.store.moveContent(contentId, this.currentDrop.columnId, this.currentDrop.contentIndex!);\n this.store.select(contentId);\n }\n\n this.reset();\n dragState.reset();\n };\n\n private handleDragEnd = () => {\n this.hideIndicator();\n this.hideRowIndicator();\n this.reset();\n };\n\n private handleDragLeave = (e: DragEvent) => {\n const related = e.relatedTarget as HTMLElement | null;\n if (!related || !this.root.contains(related)) {\n this.hideIndicator();\n this.hideRowIndicator();\n this.currentDrop = null;\n }\n };\n\n // ----------------------------------------------------------\n // Find row drop position (between rows)\n // ----------------------------------------------------------\n\n private findRowDropPosition(clientY: number): DropTarget | null {\n const canvas = this.root.querySelector('me-editor-canvas');\n if (!canvas?.shadowRoot) return null;\n\n const rows = Array.from(canvas.shadowRoot.querySelectorAll('me-row-renderer')) as HTMLElement[];\n if (rows.length === 0) {\n return { type: 'row', rowIndex: 0, y: 0 };\n }\n\n // Before first row\n const firstRect = rows[0].getBoundingClientRect();\n let bestDist = Math.abs(clientY - firstRect.top);\n let bestTarget: DropTarget = { type: 'row', rowIndex: 0, y: firstRect.top };\n\n // Between/after each row\n for (let i = 0; i < rows.length; i++) {\n const rect = rows[i].getBoundingClientRect();\n const y = rect.bottom;\n const dist = Math.abs(clientY - y);\n if (dist < bestDist) {\n bestDist = dist;\n bestTarget = { type: 'row', rowIndex: i + 1, y };\n }\n }\n\n return bestTarget;\n }\n\n // ----------------------------------------------------------\n // Find content drop position (inside columns)\n // ----------------------------------------------------------\n\n private findContentDropPosition(clientX: number, clientY: number): DropTarget | null {\n const columns = this.queryShadowAll<HTMLElement>(this.root, 'me-column-renderer');\n\n let bestTarget: DropTarget | null = null;\n let bestDist = Infinity;\n\n for (const colEl of columns) {\n const columnId = colEl.dataset.columnId;\n if (!columnId) continue;\n\n const colShadow = colEl.shadowRoot;\n if (!colShadow) continue;\n\n const colRect = colEl.getBoundingClientRect();\n // Only consider columns that the mouse is horizontally within\n if (clientX < colRect.left || clientX > colRect.right) continue;\n\n const contentEls = Array.from(colShadow.querySelectorAll('me-content-renderer')) as HTMLElement[];\n\n if (contentEls.length === 0) {\n const dist = Math.abs(clientY - (colRect.top + colRect.height / 2));\n if (dist < bestDist) {\n bestDist = dist;\n bestTarget = { type: 'content', columnId, contentIndex: 0, y: colRect.top + colRect.height / 2 };\n }\n continue;\n }\n\n // Before first content\n const firstRect = contentEls[0].getBoundingClientRect();\n let dist = Math.abs(clientY - firstRect.top);\n if (dist < bestDist) {\n bestDist = dist;\n bestTarget = { type: 'content', columnId, contentIndex: 0, y: firstRect.top };\n }\n\n // Between and after each content\n for (let i = 0; i < contentEls.length; i++) {\n const rect = contentEls[i].getBoundingClientRect();\n const nextRect = contentEls[i + 1]?.getBoundingClientRect();\n const y = nextRect ? (rect.bottom + nextRect.top) / 2 : rect.bottom;\n dist = Math.abs(clientY - y);\n if (dist < bestDist) {\n bestDist = dist;\n bestTarget = { type: 'content', columnId, contentIndex: i + 1, y };\n }\n }\n }\n\n return bestTarget;\n }\n\n // ----------------------------------------------------------\n // Indicator positioning\n // ----------------------------------------------------------\n\n private showContentIndicator(drop: DropTarget) {\n if (!this.indicator || !drop.columnId) return;\n\n const columns = this.queryShadowAll<HTMLElement>(this.root, 'me-column-renderer');\n const colEl = columns.find((c) => c.dataset.columnId === drop.columnId);\n if (!colEl?.shadowRoot) return;\n\n if (this.indicator.parentNode !== colEl.shadowRoot) {\n this.indicator.remove();\n colEl.shadowRoot.appendChild(this.indicator);\n }\n\n const contentEls = Array.from(colEl.shadowRoot.querySelectorAll('me-content-renderer')) as HTMLElement[];\n const colRect = colEl.getBoundingClientRect();\n\n let indicatorY: number;\n if (contentEls.length === 0 || drop.contentIndex === 0) {\n indicatorY = 0;\n } else if (drop.contentIndex! >= contentEls.length) {\n const lastRect = contentEls[contentEls.length - 1].getBoundingClientRect();\n indicatorY = lastRect.bottom - colRect.top;\n } else {\n const elRect = contentEls[drop.contentIndex!].getBoundingClientRect();\n indicatorY = elRect.top - colRect.top;\n }\n\n Object.assign(this.indicator.style, {\n display: 'block',\n top: `${indicatorY}px`,\n left: '4px', right: '4px', width: 'auto',\n });\n }\n\n private showRowIndicator(drop: DropTarget) {\n if (!this.rowIndicator) return;\n\n const canvas = this.root.querySelector('me-editor-canvas');\n if (!canvas?.shadowRoot) return;\n\n const canvasBody = canvas.shadowRoot.querySelector('.canvas-body') as HTMLElement;\n if (!canvasBody) return;\n\n if (this.rowIndicator.parentNode !== canvasBody) {\n this.rowIndicator.remove();\n canvasBody.appendChild(this.rowIndicator);\n }\n\n const rows = Array.from(canvas.shadowRoot.querySelectorAll('me-row-renderer')) as HTMLElement[];\n const bodyRect = canvasBody.getBoundingClientRect();\n\n let indicatorY: number;\n if (rows.length === 0 || drop.rowIndex === 0) {\n indicatorY = 0;\n } else if (drop.rowIndex! >= rows.length) {\n const lastRect = rows[rows.length - 1].getBoundingClientRect();\n indicatorY = lastRect.bottom - bodyRect.top;\n } else {\n const elRect = rows[drop.rowIndex!].getBoundingClientRect();\n indicatorY = elRect.top - bodyRect.top;\n }\n\n Object.assign(this.rowIndicator.style, {\n display: 'block',\n top: `${indicatorY}px`,\n left: '0', right: '0', width: 'auto',\n });\n }\n\n private hideIndicator() {\n if (this.indicator) this.indicator.style.display = 'none';\n }\n\n private hideRowIndicator() {\n if (this.rowIndicator) this.rowIndicator.style.display = 'none';\n }\n\n private reset() {\n this.currentDrop = null;\n this.hideIndicator();\n this.hideRowIndicator();\n }\n\n // ----------------------------------------------------------\n // Shadow DOM traversal\n // ----------------------------------------------------------\n\n private queryShadowAll<T extends HTMLElement>(root: ShadowRoot | HTMLElement, selector: string): T[] {\n const results: T[] = [];\n this.walkShadowDom(root, (el) => {\n if (el.matches?.(selector)) results.push(el as T);\n });\n return results;\n }\n\n private walkShadowDom(root: ShadowRoot | HTMLElement, callback: (el: HTMLElement) => void) {\n const children = root instanceof ShadowRoot ? root.children : root.children;\n for (const child of Array.from(children)) {\n const el = child as HTMLElement;\n callback(el);\n if (el.shadowRoot) this.walkShadowDom(el.shadowRoot, callback);\n if (el.children?.length) this.walkShadowDom(el, callback);\n }\n }\n\n private findContentElement(el: HTMLElement | null): HTMLElement | null {\n while (el) {\n if (el.dataset?.contentId) return el;\n if (el.tagName?.toLowerCase() === 'me-content-renderer') return el;\n if (el.parentElement) {\n el = el.parentElement;\n } else if ((el.getRootNode() as ShadowRoot).host) {\n el = (el.getRootNode() as ShadowRoot).host as HTMLElement;\n } else {\n break;\n }\n }\n return null;\n }\n}\n","import { html, css, TemplateResult } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport type { ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\n\nexport const textTool: LitToolDefinition = {\n name: 'text',\n label: 'Text',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 7V4h16v3\"/><path d=\"M9 20h6\"/><path d=\"M12 4v16\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 1,\n options: {\n text: {\n title: 'Text',\n options: {\n text: {\n label: 'Text',\n defaultValue: '<p style=\"font-size: 14px;\">This is a new text block. Change the text.</p>',\n widget: 'rich_text',\n },\n },\n },\n style: {\n title: 'Style',\n options: {\n color: { label: 'Text Color', defaultValue: '#000000', widget: 'color_picker' },\n backgroundColor: { label: 'Background Color', defaultValue: '', widget: 'color_picker' },\n lineHeight: { label: 'Line Height', defaultValue: '140%', widget: 'text' },\n linkStyle: { label: 'Link Style', defaultValue: undefined, widget: 'link_style' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: {\n containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' },\n },\n },\n general: {\n title: 'General',\n options: {\n anchor: { label: 'Anchor', defaultValue: '', widget: 'text' },\n hideDesktop: { label: 'Hide on Desktop', defaultValue: false, widget: 'toggle' },\n hideMobile: { label: 'Hide on Mobile', defaultValue: false, widget: 'toggle' },\n },\n },\n },\n defaultValues: {\n text: '<p style=\"font-size: 14px;\">This is a new text block. Change the text.</p>',\n color: '#000000',\n backgroundColor: '',\n lineHeight: '140%',\n containerPadding: '10px',\n textAlign: 'left',\n },\n renderer: {\n renderEditor(values: ContentValues, context: EditorRenderContext): TemplateResult {\n const padding = (values.containerPadding as string) || '10px';\n const bgColor = (values.backgroundColor as string) || 'transparent';\n const color = (values.color as string) || 'inherit';\n const lineHeight = (values.lineHeight as string) || '140%';\n const textContent = (values.text as string) || '';\n\n return html`\n <div style=\"padding:${padding};background-color:${bgColor};color:${color};line-height:${lineHeight};word-break:break-word;\">\n ${unsafeHTML(textContent)}\n </div>\n `;\n },\n\n renderHtml(values: ContentValues, context: ExportRenderContext): string {\n const padding = (values.containerPadding as string) || '10px';\n const bgColor = (values.backgroundColor as string) || '';\n const color = (values.color as string) || '#000000';\n const lineHeight = (values.lineHeight as string) || '140%';\n const textContent = (values.text as string) || '';\n const textAlign = (values.textAlign as string) || 'left';\n\n const bgStyle = bgColor ? `background-color:${bgColor};` : '';\n\n return `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\">\n <tbody>\n <tr>\n <td style=\"overflow-wrap:break-word;word-break:break-word;padding:${padding};${bgStyle}font-family:arial,helvetica,sans-serif;\" align=\"left\">\n <div style=\"font-size:14px;color:${color};line-height:${lineHeight};text-align:${textAlign};word-wrap:break-word;\">\n ${textContent}\n </div>\n </td>\n </tr>\n </tbody>\n</table>`;\n },\n },\n};\n","import { html, TemplateResult } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport type { ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\n\nexport const headingTool: LitToolDefinition = {\n name: 'heading',\n label: 'Heading',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 12h12\"/><path d=\"M6 4v16\"/><path d=\"M18 4v16\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 2,\n options: {\n text: {\n title: 'Heading',\n options: {\n text: {\n label: 'Text',\n defaultValue: 'Heading',\n widget: 'text',\n },\n headingType: {\n label: 'Heading Type',\n defaultValue: 'h1',\n widget: 'dropdown',\n widgetParams: {\n options: [\n { label: 'H1', value: 'h1' },\n { label: 'H2', value: 'h2' },\n { label: 'H3', value: 'h3' },\n { label: 'H4', value: 'h4' },\n ],\n },\n },\n },\n },\n style: {\n title: 'Style',\n options: {\n fontSize: { label: 'Font Size', defaultValue: '22px', widget: 'text' },\n color: { label: 'Text Color', defaultValue: '#000000', widget: 'color_picker' },\n textAlign: { label: 'Text Align', defaultValue: 'left', widget: 'text' },\n fontWeight: { label: 'Font Weight', defaultValue: '700', widget: 'text' },\n lineHeight: { label: 'Line Height', defaultValue: '140%', widget: 'text' },\n letterSpacing: { label: 'Letter Spacing', defaultValue: 'normal', widget: 'text' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: {\n containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'text' },\n },\n },\n general: {\n title: 'General',\n options: {\n anchor: { label: 'Anchor', defaultValue: '', widget: 'text' },\n hideDesktop: { label: 'Hide on Desktop', defaultValue: false, widget: 'toggle' },\n hideMobile: { label: 'Hide on Mobile', defaultValue: false, widget: 'toggle' },\n },\n },\n },\n defaultValues: {\n text: 'Heading',\n headingType: 'h1',\n fontSize: '22px',\n color: '#000000',\n textAlign: 'left',\n fontWeight: '700',\n lineHeight: '140%',\n letterSpacing: 'normal',\n containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues, ctx: EditorRenderContext): TemplateResult {\n const padding = (values.containerPadding as string) || '10px';\n const fontSize = (values.fontSize as string) || '22px';\n const color = (values.color as string) || '#000000';\n const textAlign = (values.textAlign as string) || 'left';\n const fontWeight = (values.fontWeight as string) || '700';\n const lineHeight = (values.lineHeight as string) || '140%';\n const text = (values.text as string) || 'Heading';\n\n return html`\n <div style=\"padding:${padding};font-size:${fontSize};color:${color};text-align:${textAlign};font-weight:${fontWeight};line-height:${lineHeight};\">\n ${text}\n </div>\n `;\n },\n renderHtml(values: ContentValues, ctx: ExportRenderContext): string {\n const padding = (values.containerPadding as string) || '10px';\n const fontSize = (values.fontSize as string) || '22px';\n const color = (values.color as string) || '#000000';\n const textAlign = (values.textAlign as string) || 'left';\n const fontWeight = (values.fontWeight as string) || '700';\n const lineHeight = (values.lineHeight as string) || '140%';\n const letterSpacing = (values.letterSpacing as string) || 'normal';\n const tag = (values.headingType as string) || 'h1';\n const text = (values.text as string) || 'Heading';\n\n return `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\">\n <tbody><tr><td style=\"overflow-wrap:break-word;word-break:break-word;padding:${padding};font-family:arial,helvetica,sans-serif;\" align=\"left\">\n <${tag} style=\"margin:0;font-size:${fontSize};color:${color};text-align:${textAlign};font-weight:${fontWeight};line-height:${lineHeight};letter-spacing:${letterSpacing};\">${text}</${tag}>\n </td></tr></tbody>\n</table>`;\n },\n },\n};\n","import { html, TemplateResult } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport type { ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\n\nexport const paragraphTool: LitToolDefinition = {\n name: 'paragraph',\n label: 'Paragraph',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/><line x1=\"3\" y1=\"14\" x2=\"17\" y2=\"14\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 3,\n options: {\n text: {\n title: 'Paragraph',\n options: {\n text: {\n label: 'Text',\n defaultValue: '<p style=\"font-size:14px;line-height:1.6;\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>',\n widget: 'rich_text',\n },\n },\n },\n style: {\n title: 'Style',\n options: {\n color: { label: 'Text Color', defaultValue: '#374151', widget: 'color_picker' },\n lineHeight: { label: 'Line Height', defaultValue: '160%', widget: 'text' },\n letterSpacing: { label: 'Letter Spacing', defaultValue: 'normal', widget: 'text' },\n textAlign: { label: 'Text Align', defaultValue: 'left', widget: 'text' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: {\n containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'text' },\n },\n },\n },\n defaultValues: {\n text: '<p style=\"font-size:14px;line-height:1.6;\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>',\n color: '#374151',\n lineHeight: '160%',\n letterSpacing: 'normal',\n textAlign: 'left',\n containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = (values.containerPadding as string) || '10px';\n const color = (values.color as string) || '#374151';\n const lineHeight = (values.lineHeight as string) || '160%';\n const text = (values.text as string) || '';\n return html`<div style=\"padding:${padding};color:${color};line-height:${lineHeight};word-break:break-word;\">${unsafeHTML(text)}</div>`;\n },\n renderHtml(values: ContentValues): string {\n const padding = (values.containerPadding as string) || '10px';\n const color = (values.color as string) || '#374151';\n const lineHeight = (values.lineHeight as string) || '160%';\n const letterSpacing = (values.letterSpacing as string) || 'normal';\n const textAlign = (values.textAlign as string) || 'left';\n const text = (values.text as string) || '';\n return `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\">\n <tbody><tr><td style=\"overflow-wrap:break-word;word-break:break-word;padding:${padding};font-family:arial,helvetica,sans-serif;\" align=\"left\">\n <div style=\"font-size:14px;color:${color};line-height:${lineHeight};text-align:${textAlign};letter-spacing:${letterSpacing};word-wrap:break-word;\">${text}</div>\n </td></tr></tbody>\n</table>`;\n },\n },\n};\n","import { html, TemplateResult } from 'lit';\nimport type { ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\n\nexport const imageTool: LitToolDefinition = {\n name: 'image',\n label: 'Image',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><circle cx=\"9\" cy=\"9\" r=\"2\"/><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 3,\n options: {\n image: {\n title: 'Image',\n options: {\n src: { label: 'Image URL', defaultValue: '', widget: 'text' },\n alt: { label: 'Alt Text', defaultValue: '', widget: 'text' },\n href: { label: 'Link URL', defaultValue: '', widget: 'text' },\n target: { label: 'Link Target', defaultValue: '_blank', widget: 'text' },\n },\n },\n style: {\n title: 'Style',\n options: {\n width: { label: 'Width', defaultValue: '100%', widget: 'text' },\n maxWidth: { label: 'Max Width', defaultValue: '100%', widget: 'text' },\n align: { label: 'Align', defaultValue: 'center', widget: 'text' },\n borderRadius: { label: 'Border Radius', defaultValue: '0px', widget: 'text' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: {\n containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'text' },\n },\n },\n general: {\n title: 'General',\n options: {\n anchor: { label: 'Anchor', defaultValue: '', widget: 'text' },\n hideDesktop: { label: 'Hide on Desktop', defaultValue: false, widget: 'toggle' },\n hideMobile: { label: 'Hide on Mobile', defaultValue: false, widget: 'toggle' },\n },\n },\n },\n defaultValues: {\n src: 'https://placehold.co/600x200/e2e8f0/64748b?text=Drop+Image+Here',\n alt: 'Image',\n href: '',\n target: '_blank',\n width: '100%',\n maxWidth: '100%',\n align: 'center',\n borderRadius: '0px',\n containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues, ctx: EditorRenderContext): TemplateResult {\n const padding = (values.containerPadding as string) || '10px';\n const src = (values.src as string) || '';\n const alt = (values.alt as string) || '';\n const width = (values.width as string) || '100%';\n const borderRadius = (values.borderRadius as string) || '0px';\n const align = (values.align as string) || 'center';\n\n if (!src) {\n return html`\n <div style=\"padding:${padding};text-align:${align};\">\n <div style=\"background:#f1f5f9;border:2px dashed #cbd5e1;border-radius:8px;padding:40px 20px;text-align:center;color:#94a3b8;font-family:sans-serif;font-size:13px;\">\n No image set. Enter a URL in the property panel.\n </div>\n </div>\n `;\n }\n\n return html`\n <div style=\"padding:${padding};text-align:${align};\">\n <img src=${src} alt=${alt} style=\"display:inline-block;max-width:100%;width:${width};border-radius:${borderRadius};border:0;\" />\n </div>\n `;\n },\n renderHtml(values: ContentValues, ctx: ExportRenderContext): string {\n const padding = (values.containerPadding as string) || '10px';\n const src = (values.src as string) || '';\n const alt = (values.alt as string) || '';\n const href = (values.href as string) || '';\n const target = (values.target as string) || '_blank';\n const width = (values.width as string) || '100%';\n const borderRadius = (values.borderRadius as string) || '0px';\n const align = (values.align as string) || 'center';\n const widthPx = width === '100%' ? ctx.columnWidth : parseInt(width);\n const borderStyle = borderRadius !== '0px' ? `border-radius:${borderRadius};` : '';\n\n const imgTag = `<img align=\"${align}\" border=\"0\" src=\"${src}\" alt=\"${alt}\" title=\"${alt}\" style=\"outline:none;text-decoration:none;-ms-interpolation-mode:bicubic;clear:both;display:inline-block!important;border:none;height:auto;float:none;width:${width};max-width:${widthPx}px;${borderStyle}\" width=\"${widthPx}\" />`;\n\n const content = href\n ? `<a href=\"${href}\" target=\"${target}\" style=\"text-decoration:none;\">${imgTag}</a>`\n : imgTag;\n\n return `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\">\n <tbody><tr><td style=\"overflow-wrap:break-word;word-break:break-word;padding:${padding};font-family:arial,helvetica,sans-serif;\" align=\"${align}\">\n ${content}\n </td></tr></tbody>\n</table>`;\n },\n },\n};\n","import { html, TemplateResult } from 'lit';\nimport type { ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\n\nexport const buttonTool: LitToolDefinition = {\n name: 'button',\n label: 'Button',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"7\" width=\"20\" height=\"10\" rx=\"2\"/><path d=\"M12 7v10\"/><path d=\"m8 12 4-3 4 3\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 4,\n options: {\n button: {\n title: 'Button',\n options: {\n text: { label: 'Button Text', defaultValue: 'Click Me', widget: 'text' },\n href: { label: 'Link URL', defaultValue: '#', widget: 'text' },\n target: { label: 'Target', defaultValue: '_blank', widget: 'text' },\n },\n },\n style: {\n title: 'Style',\n options: {\n backgroundColor: { label: 'Button Color', defaultValue: '#3b82f6', widget: 'color_picker' },\n textColor: { label: 'Text Color', defaultValue: '#ffffff', widget: 'color_picker' },\n fontSize: { label: 'Font Size', defaultValue: '14px', widget: 'text' },\n fontWeight: { label: 'Font Weight', defaultValue: '700', widget: 'text' },\n borderRadius: { label: 'Border Radius', defaultValue: '4px', widget: 'text' },\n buttonWidth: { label: 'Width', defaultValue: 'auto', widget: 'text' },\n textAlign: { label: 'Align', defaultValue: 'center', widget: 'text' },\n buttonPadding: { label: 'Button Padding', defaultValue: '10px 20px', widget: 'text' },\n borderColor: { label: 'Border Color', defaultValue: '', widget: 'color_picker' },\n borderWidth: { label: 'Border Width', defaultValue: '0px', widget: 'text' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: {\n containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'text' },\n },\n },\n general: {\n title: 'General',\n options: {\n anchor: { label: 'Anchor', defaultValue: '', widget: 'text' },\n hideDesktop: { label: 'Hide on Desktop', defaultValue: false, widget: 'toggle' },\n hideMobile: { label: 'Hide on Mobile', defaultValue: false, widget: 'toggle' },\n },\n },\n },\n defaultValues: {\n text: 'Click Me',\n href: '#',\n target: '_blank',\n backgroundColor: '#3b82f6',\n textColor: '#ffffff',\n fontSize: '14px',\n fontWeight: '700',\n borderRadius: '4px',\n buttonWidth: 'auto',\n textAlign: 'center',\n buttonPadding: '10px 20px',\n borderColor: '',\n borderWidth: '0px',\n containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues, ctx: EditorRenderContext): TemplateResult {\n const padding = (values.containerPadding as string) || '10px';\n const bgColor = (values.backgroundColor as string) || '#3b82f6';\n const textColor = (values.textColor as string) || '#ffffff';\n const fontSize = (values.fontSize as string) || '14px';\n const fontWeight = (values.fontWeight as string) || '700';\n const borderRadius = (values.borderRadius as string) || '4px';\n const buttonPadding = (values.buttonPadding as string) || '10px 20px';\n const text = (values.text as string) || 'Click Me';\n const textAlign = (values.textAlign as string) || 'center';\n const buttonWidth = (values.buttonWidth as string) || 'auto';\n const borderColor = (values.borderColor as string) || bgColor;\n const borderWidth = (values.borderWidth as string) || '0px';\n const borderStyle = borderWidth !== '0px' ? `border:${borderWidth} solid ${borderColor};` : 'border:none;';\n const widthStyle = buttonWidth === 'auto' ? 'display:inline-block;' : `display:block;width:${buttonWidth};`;\n\n return html`\n <div style=\"padding:${padding};text-align:${textAlign};\">\n <a style=\"${widthStyle}background-color:${bgColor};color:${textColor};font-size:${fontSize};font-weight:${fontWeight};border-radius:${borderRadius};padding:${buttonPadding};text-decoration:none;text-align:center;${borderStyle}cursor:pointer;font-family:arial,helvetica,sans-serif;box-sizing:border-box;\">\n ${text}\n </a>\n </div>\n `;\n },\n renderHtml(values: ContentValues, ctx: ExportRenderContext): string {\n const padding = (values.containerPadding as string) || '10px';\n const bgColor = (values.backgroundColor as string) || '#3b82f6';\n const textColor = (values.textColor as string) || '#ffffff';\n const fontSize = (values.fontSize as string) || '14px';\n const fontWeight = (values.fontWeight as string) || '700';\n const borderRadius = (values.borderRadius as string) || '4px';\n const buttonPadding = (values.buttonPadding as string) || '10px 20px';\n const text = (values.text as string) || 'Click Me';\n const textAlign = (values.textAlign as string) || 'center';\n const href = (values.href as string) || '#';\n const target = (values.target as string) || '_blank';\n const borderColor = (values.borderColor as string) || bgColor;\n const borderWidth = (values.borderWidth as string) || '0px';\n const borderStyle = borderWidth !== '0px' ? `border:${borderWidth} solid ${borderColor};` : 'border:none;';\n\n // VML roundrect for Outlook border-radius support\n const vml = parseInt(borderRadius) > 0 ? `\n <!--[if mso]>\n <v:roundrect xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:w=\"urn:schemas-microsoft-com:office:word\" href=\"${href}\" style=\"height:auto;v-text-anchor:middle;width:auto;\" arcsize=\"${Math.round((parseInt(borderRadius) / 20) * 100)}%\" stroke=\"f\" fillcolor=\"${bgColor}\">\n <w:anchorlock/>\n <center style=\"color:${textColor};font-family:arial,helvetica,sans-serif;font-size:${fontSize};font-weight:${fontWeight};\">${text}</center>\n </v:roundrect>\n <![endif]-->\n <!--[if !mso]><!-->` : '<!--[if !mso]><!-->';\n const vmlEnd = parseInt(borderRadius) > 0 ? '<!--<![endif]-->' : '<!--<![endif]-->';\n\n return `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\">\n <tbody><tr><td style=\"overflow-wrap:break-word;word-break:break-word;padding:${padding};font-family:arial,helvetica,sans-serif;\" align=\"${textAlign}\">\n <div align=\"${textAlign}\">\n ${vml}\n <a href=\"${href}\" target=\"${target}\" style=\"box-sizing:border-box;display:inline-block;text-decoration:none;-webkit-text-size-adjust:none;text-align:center;color:${textColor};background-color:${bgColor};border-radius:${borderRadius};-webkit-border-radius:${borderRadius};-moz-border-radius:${borderRadius};font-size:${fontSize};font-weight:${fontWeight};padding:${buttonPadding};font-family:arial,helvetica,sans-serif;${borderStyle}mso-border-alt:none;word-break:keep-all;\">\n <span style=\"line-height:120%;\">${text}</span>\n </a>\n ${vmlEnd}\n </div>\n </td></tr></tbody>\n</table>`;\n },\n },\n};\n","import { html, TemplateResult } from 'lit';\nimport type { ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\n\nexport const dividerTool: LitToolDefinition = {\n name: 'divider',\n label: 'Divider',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 5,\n options: {\n style: {\n title: 'Style',\n options: {\n borderTopWidth: { label: 'Width', defaultValue: '1px', widget: 'text' },\n borderTopStyle: { label: 'Style', defaultValue: 'solid', widget: 'text' },\n borderTopColor: { label: 'Color', defaultValue: '#cccccc', widget: 'color_picker' },\n width: { label: 'Line Width', defaultValue: '100%', widget: 'text' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: {\n containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'text' },\n },\n },\n general: {\n title: 'General',\n options: {\n hideDesktop: { label: 'Hide on Desktop', defaultValue: false, widget: 'toggle' },\n hideMobile: { label: 'Hide on Mobile', defaultValue: false, widget: 'toggle' },\n },\n },\n },\n defaultValues: {\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderTopColor: '#cccccc',\n width: '100%',\n containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = (values.containerPadding as string) || '10px';\n const width = (values.width as string) || '100%';\n const bw = (values.borderTopWidth as string) || '1px';\n const bs = (values.borderTopStyle as string) || 'solid';\n const bc = (values.borderTopColor as string) || '#cccccc';\n\n return html`\n <div style=\"padding:${padding};\">\n <div style=\"border-top:${bw} ${bs} ${bc};width:${width};margin:0 auto;\"></div>\n </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = (values.containerPadding as string) || '10px';\n const width = (values.width as string) || '100%';\n const bw = (values.borderTopWidth as string) || '1px';\n const bs = (values.borderTopStyle as string) || 'solid';\n const bc = (values.borderTopColor as string) || '#cccccc';\n\n return `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\">\n <tbody><tr><td style=\"overflow-wrap:break-word;word-break:break-word;padding:${padding};font-family:arial,helvetica,sans-serif;\" align=\"center\">\n <table role=\"presentation\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"${width}\" style=\"border-collapse:collapse;table-layout:fixed;border-spacing:0;mso-table-lspace:0;mso-table-rspace:0;vertical-align:top;border-top:${bw} ${bs} ${bc};-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;\">\n <tbody><tr><td style=\"font-size:0;line-height:0;\"> </td></tr></tbody>\n </table>\n </td></tr></tbody>\n</table>`;\n },\n },\n};\n","import { html, TemplateResult } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport type { ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\n\nexport const htmlTool: LitToolDefinition = {\n name: 'html',\n label: 'HTML',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 6,\n options: {\n html: {\n title: 'HTML',\n options: {\n html: {\n label: 'Custom HTML',\n defaultValue: '<div style=\"padding:20px;text-align:center;color:#999;\">Custom HTML Block</div>',\n widget: 'rich_text',\n },\n },\n },\n spacing: {\n title: 'Spacing',\n options: {\n containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'text' },\n },\n },\n general: {\n title: 'General',\n options: {\n hideDesktop: { label: 'Hide on Desktop', defaultValue: false, widget: 'toggle' },\n hideMobile: { label: 'Hide on Mobile', defaultValue: false, widget: 'toggle' },\n },\n },\n },\n defaultValues: {\n html: '<div style=\"padding:20px;text-align:center;color:#999;\">Custom HTML Block</div>',\n containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = (values.containerPadding as string) || '10px';\n const content = (values.html as string) || '';\n return html`<div style=\"padding:${padding};\">${unsafeHTML(content)}</div>`;\n },\n renderHtml(values: ContentValues): string {\n const padding = (values.containerPadding as string) || '10px';\n const content = (values.html as string) || '';\n return `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\">\n <tbody><tr><td style=\"overflow-wrap:break-word;word-break:break-word;padding:${padding};font-family:arial,helvetica,sans-serif;\" align=\"left\">\n ${content}\n </td></tr></tbody>\n</table>`;\n },\n },\n};\n","import { html, TemplateResult } from 'lit';\nimport type { ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\n\ninterface SocialIcon {\n name: string;\n url: string;\n icon: string;\n color: string;\n}\n\nconst defaultSocials: SocialIcon[] = [\n { name: 'Facebook', url: 'https://facebook.com/', icon: 'f', color: '#1877F2' },\n { name: 'Twitter', url: 'https://twitter.com/', icon: '𝕏', color: '#000000' },\n { name: 'Instagram', url: 'https://instagram.com/', icon: '📷', color: '#E4405F' },\n { name: 'LinkedIn', url: 'https://linkedin.com/', icon: 'in', color: '#0A66C2' },\n];\n\nexport const socialTool: LitToolDefinition = {\n name: 'social',\n label: 'Social',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"18\" cy=\"5\" r=\"3\"/><circle cx=\"6\" cy=\"12\" r=\"3\"/><circle cx=\"18\" cy=\"19\" r=\"3\"/><line x1=\"8.59\" y1=\"13.51\" x2=\"15.42\" y2=\"17.49\"/><line x1=\"15.41\" y1=\"6.51\" x2=\"8.59\" y2=\"10.49\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 8,\n options: {\n icons: {\n title: 'Social Icons',\n options: {\n icons: { label: 'Icons (JSON)', defaultValue: JSON.stringify(defaultSocials), widget: 'rich_text' },\n iconSize: { label: 'Icon Size', defaultValue: '32px', widget: 'text' },\n iconSpacing: { label: 'Spacing', defaultValue: '8px', widget: 'text' },\n },\n },\n style: {\n title: 'Style',\n options: {\n textAlign: { label: 'Align', defaultValue: 'center', widget: 'text' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: {\n containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'text' },\n },\n },\n },\n defaultValues: {\n icons: JSON.stringify(defaultSocials),\n iconSize: '32px',\n iconSpacing: '8px',\n textAlign: 'center',\n containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = (values.containerPadding as string) || '10px';\n const textAlign = (values.textAlign as string) || 'center';\n const iconSize = (values.iconSize as string) || '32px';\n const spacing = (values.iconSpacing as string) || '8px';\n let icons: SocialIcon[] = defaultSocials;\n try { icons = JSON.parse(values.icons as string); } catch {}\n\n return html`\n <div style=\"padding:${padding};text-align:${textAlign};\">\n ${icons.map(\n (s) => html`\n <a href=${s.url} target=\"_blank\" style=\"display:inline-block;width:${iconSize};height:${iconSize};line-height:${iconSize};text-align:center;background:${s.color};color:white;border-radius:50%;text-decoration:none;font-size:14px;font-weight:bold;margin:0 ${spacing};font-family:arial,sans-serif;vertical-align:middle;\">${s.icon}</a>\n `,\n )}\n </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = (values.containerPadding as string) || '10px';\n const textAlign = (values.textAlign as string) || 'center';\n const iconSize = parseInt((values.iconSize as string) || '32');\n const spacing = (values.iconSpacing as string) || '8px';\n let icons: SocialIcon[] = defaultSocials;\n try { icons = JSON.parse(values.icons as string); } catch {}\n\n const iconsHtml = icons.map((s) =>\n `<td align=\"center\" valign=\"middle\" style=\"padding:0 ${spacing};\">\n <a href=\"${s.url}\" target=\"_blank\" style=\"text-decoration:none;\">\n <table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr>\n <td width=\"${iconSize}\" height=\"${iconSize}\" align=\"center\" valign=\"middle\" style=\"width:${iconSize}px;height:${iconSize}px;background:${s.color};border-radius:50%;color:#ffffff;font-size:14px;font-weight:bold;font-family:arial,sans-serif;\">\n ${s.icon}\n </td>\n </tr></table>\n </a>\n </td>`\n ).join('\\n');\n\n return `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\">\n <tbody><tr><td style=\"overflow-wrap:break-word;word-break:break-word;padding:${padding};font-family:arial,helvetica,sans-serif;\" align=\"${textAlign}\">\n <table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"${textAlign}\"><tr>${iconsHtml}</tr></table>\n </td></tr></tbody>\n</table>`;\n },\n },\n};\n","import { html, TemplateResult } from 'lit';\nimport type { ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\n\ninterface MenuItem {\n text: string;\n href: string;\n}\n\nconst defaultItems: MenuItem[] = [\n { text: 'Home', href: '#' },\n { text: 'About', href: '#' },\n { text: 'Contact', href: '#' },\n];\n\nexport const menuTool: LitToolDefinition = {\n name: 'menu',\n label: 'Menu',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\"/><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 9,\n options: {\n menu: {\n title: 'Menu',\n options: {\n items: { label: 'Items (JSON)', defaultValue: JSON.stringify(defaultItems), widget: 'rich_text' },\n },\n },\n style: {\n title: 'Style',\n options: {\n textAlign: { label: 'Align', defaultValue: 'center', widget: 'text' },\n fontSize: { label: 'Font Size', defaultValue: '14px', widget: 'text' },\n color: { label: 'Text Color', defaultValue: '#333333', widget: 'color_picker' },\n separator: { label: 'Separator', defaultValue: '|', widget: 'text' },\n separatorColor: { label: 'Separator Color', defaultValue: '#cccccc', widget: 'color_picker' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: {\n containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'text' },\n },\n },\n },\n defaultValues: {\n items: JSON.stringify(defaultItems),\n textAlign: 'center',\n fontSize: '14px',\n color: '#333333',\n separator: '|',\n separatorColor: '#cccccc',\n containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = (values.containerPadding as string) || '10px';\n const textAlign = (values.textAlign as string) || 'center';\n const fontSize = (values.fontSize as string) || '14px';\n const color = (values.color as string) || '#333333';\n const sep = (values.separator as string) || '|';\n const sepColor = (values.separatorColor as string) || '#cccccc';\n let items: MenuItem[] = defaultItems;\n try { items = JSON.parse(values.items as string); } catch {}\n\n return html`\n <div style=\"padding:${padding};text-align:${textAlign};font-size:${fontSize};font-family:arial,sans-serif;\">\n ${items.map(\n (item, i) => html`${i > 0 ? html`<span style=\"color:${sepColor};padding:0 8px;\">${sep}</span>` : ''}\n <a href=${item.href} style=\"color:${color};text-decoration:none;\">${item.text}</a>`,\n )}\n </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = (values.containerPadding as string) || '10px';\n const textAlign = (values.textAlign as string) || 'center';\n const fontSize = (values.fontSize as string) || '14px';\n const color = (values.color as string) || '#333333';\n const sep = (values.separator as string) || '|';\n const sepColor = (values.separatorColor as string) || '#cccccc';\n let items: MenuItem[] = defaultItems;\n try { items = JSON.parse(values.items as string); } catch {}\n\n const linksHtml = items.map((item, i) => {\n const prefix = i > 0 ? `<span style=\"color:${sepColor};padding:0 8px;\">${sep}</span>` : '';\n return `${prefix}<a href=\"${item.href}\" target=\"_blank\" style=\"color:${color};text-decoration:none;font-family:arial,helvetica,sans-serif;font-size:${fontSize};\">${item.text}</a>`;\n }).join('');\n\n return `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\">\n <tbody><tr><td style=\"overflow-wrap:break-word;word-break:break-word;padding:${padding};font-family:arial,helvetica,sans-serif;\" align=\"${textAlign}\">\n <div style=\"text-align:${textAlign};\">${linksHtml}</div>\n </td></tr></tbody>\n</table>`;\n },\n },\n};\n","import { html, TemplateResult } from 'lit';\nimport type { ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\n\nfunction getYouTubeThumbnail(url: string): string | null {\n const match = url.match(/(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([a-zA-Z0-9_-]{11})/);\n return match ? `https://img.youtube.com/vi/${match[1]}/maxresdefault.jpg` : null;\n}\n\nfunction getVimeoId(url: string): string | null {\n const match = url.match(/vimeo\\.com\\/(\\d+)/);\n return match ? match[1] : null;\n}\n\nexport const videoTool: LitToolDefinition = {\n name: 'video',\n label: 'Video',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 10,\n options: {\n video: {\n title: 'Video',\n options: {\n url: { label: 'Video URL', defaultValue: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', widget: 'text' },\n thumbnailUrl: { label: 'Thumbnail URL (auto)', defaultValue: '', widget: 'text' },\n alt: { label: 'Alt Text', defaultValue: 'Video', widget: 'text' },\n },\n },\n style: {\n title: 'Style',\n options: {\n textAlign: { label: 'Align', defaultValue: 'center', widget: 'text' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: {\n containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'text' },\n },\n },\n },\n defaultValues: {\n url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',\n thumbnailUrl: '',\n alt: 'Video',\n textAlign: 'center',\n containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = (values.containerPadding as string) || '10px';\n const url = (values.url as string) || '';\n const thumbnail = (values.thumbnailUrl as string) || getYouTubeThumbnail(url) || '';\n const textAlign = (values.textAlign as string) || 'center';\n\n if (!thumbnail) {\n return html`\n <div style=\"padding:${padding};text-align:${textAlign};\">\n <div style=\"background:#0f172a;border-radius:8px;padding:40px;text-align:center;color:white;font-family:sans-serif;position:relative;\">\n <div style=\"font-size:48px;opacity:0.8;\">▶</div>\n <div style=\"font-size:12px;margin-top:8px;opacity:0.6;\">${url || 'Enter video URL'}</div>\n </div>\n </div>\n `;\n }\n\n return html`\n <div style=\"padding:${padding};text-align:${textAlign};\">\n <div style=\"position:relative;display:inline-block;max-width:100%;cursor:pointer;\">\n <img src=${thumbnail} alt=\"Video thumbnail\" style=\"display:block;max-width:100%;border-radius:4px;\" />\n <div style=\"position:absolute;inset:0;display:flex;align-items:center;justify-content:center;\">\n <div style=\"width:60px;height:60px;background:rgba(0,0,0,0.7);border-radius:50%;display:flex;align-items:center;justify-content:center;color:white;font-size:24px;\">▶</div>\n </div>\n </div>\n </div>\n `;\n },\n renderHtml(values: ContentValues, ctx: ExportRenderContext): string {\n const padding = (values.containerPadding as string) || '10px';\n const url = (values.url as string) || '#';\n const thumbnail = (values.thumbnailUrl as string) || getYouTubeThumbnail(url) || '';\n const alt = (values.alt as string) || 'Video';\n const textAlign = (values.textAlign as string) || 'center';\n const widthPx = ctx.columnWidth;\n\n const imgTag = thumbnail\n ? `<img src=\"${thumbnail}\" alt=\"${alt}\" width=\"${widthPx}\" style=\"display:block;max-width:100%;width:${widthPx}px;border:0;\" />`\n : `<div style=\"background:#0f172a;padding:40px;text-align:center;color:white;font-family:arial,sans-serif;font-size:16px;\">▶ Watch Video</div>`;\n\n return `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\">\n <tbody><tr><td style=\"overflow-wrap:break-word;word-break:break-word;padding:${padding};font-family:arial,helvetica,sans-serif;\" align=\"${textAlign}\">\n <a href=\"${url}\" target=\"_blank\" style=\"text-decoration:none;\">\n ${imgTag}\n </a>\n </td></tr></tbody>\n</table>`;\n },\n },\n};\n","import { html, TemplateResult } from 'lit';\nimport type { ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\n\nexport const timerTool: LitToolDefinition = {\n name: 'timer',\n label: 'Timer',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 11,\n options: {\n timer: {\n title: 'Timer',\n options: {\n endDate: { label: 'End Date (ISO)', defaultValue: new Date(Date.now() + 7 * 86400000).toISOString().split('T')[0], widget: 'text' },\n expiredMessage: { label: 'Expired Message', defaultValue: 'This offer has expired', widget: 'text' },\n },\n },\n style: {\n title: 'Style',\n options: {\n textAlign: { label: 'Align', defaultValue: 'center', widget: 'text' },\n backgroundColor: { label: 'Background', defaultValue: '#1f2937', widget: 'color_picker' },\n textColor: { label: 'Text Color', defaultValue: '#ffffff', widget: 'color_picker' },\n fontSize: { label: 'Font Size', defaultValue: '32px', widget: 'text' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: {\n containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'text' },\n },\n },\n },\n defaultValues: {\n endDate: new Date(Date.now() + 7 * 86400000).toISOString().split('T')[0],\n expiredMessage: 'This offer has expired',\n textAlign: 'center',\n backgroundColor: '#1f2937',\n textColor: '#ffffff',\n fontSize: '32px',\n containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = (values.containerPadding as string) || '10px';\n const bg = (values.backgroundColor as string) || '#1f2937';\n const color = (values.textColor as string) || '#ffffff';\n const fontSize = (values.fontSize as string) || '32px';\n const textAlign = (values.textAlign as string) || 'center';\n\n return html`\n <div style=\"padding:${padding};\">\n <div style=\"background:${bg};color:${color};font-size:${fontSize};text-align:${textAlign};padding:20px;border-radius:4px;font-family:monospace;font-weight:bold;letter-spacing:4px;\">\n 00 : 00 : 00 : 00\n <div style=\"font-size:11px;letter-spacing:8px;opacity:0.6;margin-top:4px;\">DAYS HRS MIN SEC</div>\n </div>\n </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = (values.containerPadding as string) || '10px';\n const bg = (values.backgroundColor as string) || '#1f2937';\n const color = (values.textColor as string) || '#ffffff';\n const fontSize = (values.fontSize as string) || '32px';\n const textAlign = (values.textAlign as string) || 'center';\n const endDate = (values.endDate as string) || '';\n\n return `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\">\n <tbody><tr><td style=\"overflow-wrap:break-word;word-break:break-word;padding:${padding};font-family:arial,helvetica,sans-serif;\" align=\"${textAlign}\">\n <div style=\"background-color:${bg};color:${color};font-size:${fontSize};text-align:${textAlign};padding:20px;border-radius:4px;font-family:'Courier New',monospace;font-weight:bold;letter-spacing:4px;\">\n <div>00 : 00 : 00 : 00</div>\n <div style=\"font-size:11px;letter-spacing:8px;opacity:0.6;margin-top:4px;\">DAYS HRS MIN SEC</div>\n </div>\n </td></tr></tbody>\n</table>`;\n },\n },\n};\n","import { html, TemplateResult } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport type { ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\n\nconst defaultTableData = [\n ['Header 1', 'Header 2', 'Header 3'],\n ['Cell 1', 'Cell 2', 'Cell 3'],\n ['Cell 4', 'Cell 5', 'Cell 6'],\n];\n\nexport const tableTool: LitToolDefinition = {\n name: 'table',\n label: 'Table',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M3 9h18\"/><path d=\"M3 15h18\"/><path d=\"M9 3v18\"/><path d=\"M15 3v18\"/></svg>`,\n supportedDisplayModes: ['email', 'web'],\n position: 12,\n options: {\n table: {\n title: 'Table',\n options: {\n tableData: { label: 'Table Data (JSON)', defaultValue: JSON.stringify(defaultTableData), widget: 'rich_text' },\n },\n },\n style: {\n title: 'Style',\n options: {\n headerBg: { label: 'Header Background', defaultValue: '#f3f4f6', widget: 'color_picker' },\n headerColor: { label: 'Header Text Color', defaultValue: '#111827', widget: 'color_picker' },\n borderColor: { label: 'Border Color', defaultValue: '#e5e7eb', widget: 'color_picker' },\n cellPadding: { label: 'Cell Padding', defaultValue: '8px 12px', widget: 'text' },\n fontSize: { label: 'Font Size', defaultValue: '14px', widget: 'text' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: {\n containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'text' },\n },\n },\n },\n defaultValues: {\n tableData: JSON.stringify(defaultTableData),\n headerBg: '#f3f4f6',\n headerColor: '#111827',\n borderColor: '#e5e7eb',\n cellPadding: '8px 12px',\n fontSize: '14px',\n containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = (values.containerPadding as string) || '10px';\n const headerBg = (values.headerBg as string) || '#f3f4f6';\n const headerColor = (values.headerColor as string) || '#111827';\n const borderColor = (values.borderColor as string) || '#e5e7eb';\n const cellPadding = (values.cellPadding as string) || '8px 12px';\n const fontSize = (values.fontSize as string) || '14px';\n let data: string[][] = defaultTableData;\n try { data = JSON.parse(values.tableData as string); } catch {}\n\n const headerRow = data[0] || [];\n const bodyRows = data.slice(1);\n\n return html`\n <div style=\"padding:${padding};overflow-x:auto;\">\n <table style=\"width:100%;border-collapse:collapse;font-size:${fontSize};font-family:arial,sans-serif;\">\n <thead>\n <tr>\n ${headerRow.map((cell) => html`<th style=\"padding:${cellPadding};background:${headerBg};color:${headerColor};border:1px solid ${borderColor};text-align:left;font-weight:600;\">${cell}</th>`)}\n </tr>\n </thead>\n <tbody>\n ${bodyRows.map((row) => html`\n <tr>\n ${row.map((cell) => html`<td style=\"padding:${cellPadding};border:1px solid ${borderColor};\">${cell}</td>`)}\n </tr>\n `)}\n </tbody>\n </table>\n </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = (values.containerPadding as string) || '10px';\n const headerBg = (values.headerBg as string) || '#f3f4f6';\n const headerColor = (values.headerColor as string) || '#111827';\n const borderColor = (values.borderColor as string) || '#e5e7eb';\n const cellPadding = (values.cellPadding as string) || '8px 12px';\n const fontSize = (values.fontSize as string) || '14px';\n let data: string[][] = defaultTableData;\n try { data = JSON.parse(values.tableData as string); } catch {}\n\n const headerRow = data[0] || [];\n const bodyRows = data.slice(1);\n\n const headerHtml = headerRow.map((c) =>\n `<th style=\"padding:${cellPadding};background-color:${headerBg};color:${headerColor};border:1px solid ${borderColor};text-align:left;font-weight:600;font-family:arial,helvetica,sans-serif;font-size:${fontSize};\">${c}</th>`\n ).join('');\n\n const bodyHtml = bodyRows.map((row) =>\n `<tr>${row.map((c) => `<td style=\"padding:${cellPadding};border:1px solid ${borderColor};font-family:arial,helvetica,sans-serif;font-size:${fontSize};\">${c}</td>`).join('')}</tr>`\n ).join('');\n\n return `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\">\n <tbody><tr><td style=\"overflow-wrap:break-word;word-break:break-word;padding:${padding};font-family:arial,helvetica,sans-serif;\" align=\"left\">\n <table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\" style=\"border-collapse:collapse;\">\n <thead><tr>${headerHtml}</tr></thead>\n <tbody>${bodyHtml}</tbody>\n </table>\n </td></tr></tbody>\n</table>`;\n },\n },\n};\n","import { html, TemplateResult } from 'lit';\nimport type { ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\n\nexport const formTool: LitToolDefinition = {\n name: 'form',\n label: 'Form',\n icon: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M7 7h10\"/><path d=\"M7 12h10\"/><path d=\"M7 17h6\"/></svg>`,\n supportedDisplayModes: ['web'],\n position: 13,\n options: {\n form: {\n title: 'Form',\n options: {\n actionUrl: { label: 'Action URL', defaultValue: '#', widget: 'text' },\n method: { label: 'Method', defaultValue: 'POST', widget: 'text' },\n submitText: { label: 'Submit Text', defaultValue: 'Submit', widget: 'text' },\n fields: { label: 'Fields (JSON)', defaultValue: JSON.stringify([\n { label: 'Name', name: 'name', type: 'text', placeholder: 'Your name' },\n { label: 'Email', name: 'email', type: 'email', placeholder: 'your@email.com' },\n ]), widget: 'rich_text' },\n },\n },\n style: {\n title: 'Style',\n options: {\n buttonBg: { label: 'Button Color', defaultValue: '#3b82f6', widget: 'color_picker' },\n buttonColor: { label: 'Button Text', defaultValue: '#ffffff', widget: 'color_picker' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: {\n containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'text' },\n },\n },\n },\n defaultValues: {\n actionUrl: '#',\n method: 'POST',\n submitText: 'Submit',\n fields: JSON.stringify([\n { label: 'Name', name: 'name', type: 'text', placeholder: 'Your name' },\n { label: 'Email', name: 'email', type: 'email', placeholder: 'your@email.com' },\n ]),\n buttonBg: '#3b82f6',\n buttonColor: '#ffffff',\n containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = (values.containerPadding as string) || '10px';\n const submitText = (values.submitText as string) || 'Submit';\n const buttonBg = (values.buttonBg as string) || '#3b82f6';\n const buttonColor = (values.buttonColor as string) || '#ffffff';\n let fields: any[] = [];\n try { fields = JSON.parse(values.fields as string); } catch {}\n\n return html`\n <div style=\"padding:${padding};font-family:arial,sans-serif;\">\n ${fields.map((f: any) => html`\n <div style=\"margin-bottom:12px;\">\n <label style=\"display:block;font-size:13px;color:#374151;margin-bottom:4px;font-weight:500;\">${f.label}</label>\n <input type=${f.type || 'text'} placeholder=${f.placeholder || ''} style=\"width:100%;padding:8px 12px;border:1px solid #d1d5db;border-radius:4px;font-size:14px;box-sizing:border-box;\" />\n </div>\n `)}\n <button style=\"background:${buttonBg};color:${buttonColor};border:none;padding:10px 24px;border-radius:4px;font-size:14px;font-weight:600;cursor:pointer;\">${submitText}</button>\n </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = (values.containerPadding as string) || '10px';\n const actionUrl = (values.actionUrl as string) || '#';\n const method = (values.method as string) || 'POST';\n const submitText = (values.submitText as string) || 'Submit';\n const buttonBg = (values.buttonBg as string) || '#3b82f6';\n const buttonColor = (values.buttonColor as string) || '#ffffff';\n let fields: any[] = [];\n try { fields = JSON.parse(values.fields as string); } catch {}\n\n const fieldsHtml = fields.map((f: any) =>\n `<div style=\"margin-bottom:12px;\">\n <label style=\"display:block;font-size:13px;color:#374151;margin-bottom:4px;font-weight:500;font-family:arial,helvetica,sans-serif;\">${f.label}</label>\n <input type=\"${f.type || 'text'}\" name=\"${f.name}\" placeholder=\"${f.placeholder || ''}\" style=\"width:100%;padding:8px 12px;border:1px solid #d1d5db;border-radius:4px;font-size:14px;box-sizing:border-box;font-family:arial,helvetica,sans-serif;\" />\n </div>`\n ).join('');\n\n return `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\">\n <tbody><tr><td style=\"overflow-wrap:break-word;word-break:break-word;padding:${padding};font-family:arial,helvetica,sans-serif;\" align=\"left\">\n <form action=\"${actionUrl}\" method=\"${method}\">\n ${fieldsHtml}\n <button type=\"submit\" style=\"background-color:${buttonBg};color:${buttonColor};border:none;padding:10px 24px;border-radius:4px;font-size:14px;font-weight:600;cursor:pointer;font-family:arial,helvetica,sans-serif;\">${submitText}</button>\n </form>\n </td></tr></tbody>\n</table>`;\n },\n },\n};\n","function wrapInDocumentShell(bodyHtml, cssBlock, bodyValues) {\n const bgColor = bodyValues.backgroundColor || \"#e7e7e7\";\n const contentWidth = bodyValues.contentWidth || \"600px\";\n const fontFamily = bodyValues.fontFamily?.value || \"arial,helvetica,sans-serif\";\n const textColor = bodyValues.textColor || \"#000000\";\n const preheaderText = bodyValues.preheaderText || \"\";\n const preheader = preheaderText ? `<div style=\"display:none;font-size:1px;color:${bgColor};line-height:1px;max-height:0px;max-width:0px;opacity:0;overflow:hidden;\">${preheaderText}${\"‌ \".repeat(80)}</div>` : \"\";\n return `<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <meta name=\"x-apple-disable-message-reformatting\">\n <meta name=\"format-detection\" content=\"telephone=no,address=no,email=no,date=no,url=no\">\n <meta name=\"color-scheme\" content=\"light dark\">\n <meta name=\"supported-color-schemes\" content=\"light dark\">\n <title></title>\n <!--[if mso]>\n <noscript><xml>\n <o:OfficeDocumentSettings>\n <o:AllowPNG/><o:PixelsPerInch>96</o:PixelsPerInch>\n </o:OfficeDocumentSettings>\n </xml></noscript>\n <style type=\"text/css\">\n table, td, th { font-family: ${fontFamily} !important; }\n </style>\n <![endif]-->\n <!--[if !mso]><!-->\n <style type=\"text/css\">\n ${cssBlock}\n </style>\n <!--<![endif]-->\n <style type=\"text/css\">\n body { margin: 0; padding: 0; }\n table, tr, td { vertical-align: top; border-collapse: collapse; }\n p { margin: 0; }\n .ie-container table, .mso-container table { table-layout: fixed; }\n * { line-height: inherit; }\n a[x-apple-data-detectors='true'] { color: inherit !important; text-decoration: none !important; }\n </style>\n</head>\n<body class=\"clean-body u_body\" style=\"margin:0;padding:0;-webkit-text-size-adjust:100%;background-color:${bgColor};color:${textColor};\">\n ${preheader}\n <table id=\"u_body\" style=\"border-collapse:collapse;table-layout:fixed;border-spacing:0;mso-table-lspace:0pt;mso-table-rspace:0pt;vertical-align:top;min-width:320px;margin:0 auto;background-color:${bgColor};width:100%;\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n <tbody>\n <tr style=\"vertical-align:top;\">\n <td style=\"word-break:break-word;border-collapse:collapse !important;vertical-align:top;\">\n <!--[if (mso)|(IE)]><table width=\"${parseInt(contentWidth)}\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td><![endif]-->\n ${bodyHtml}\n <!--[if (mso)|(IE)]></td></tr></table><![endif]-->\n </td>\n </tr>\n </tbody>\n </table>\n</body>\n</html>`;\n}\nfunction renderRow(row, bodyValues, toolRenderers) {\n const contentWidth = parseInt(bodyValues.contentWidth || \"600\");\n const bgColor = row.values.backgroundColor || \"\";\n const colsBgColor = row.values.columnsBackgroundColor || \"\";\n const padding = row.values.padding || \"0px\";\n const totalCells = row.cells.reduce((a, b) => a + b, 0);\n const bgStyle = bgColor ? `background-color:${bgColor};` : \"\";\n const bgImage = row.values.backgroundImage?.url ? `background-image:url('${row.values.backgroundImage.url}');background-repeat:${row.values.backgroundImage.repeat ? \"repeat\" : \"no-repeat\"};background-position:center top;background-size:${row.values.backgroundImage.cover ? \"cover\" : \"auto\"};` : \"\";\n const columnsHtml = row.columns.map((col, i) => {\n const colWidthPx = Math.round(row.cells[i] / totalCells * contentWidth);\n return renderColumn(col, colWidthPx, colsBgColor, bodyValues, toolRenderers);\n });\n const needsGhostTable = row.columns.length > 1;\n let innerHtml;\n if (needsGhostTable) {\n const ghostCols = row.columns.map((col, i) => {\n const colWidthPx = Math.round(row.cells[i] / totalCells * contentWidth);\n const colHtml = renderColumn(col, colWidthPx, colsBgColor, bodyValues, toolRenderers);\n return `<!--[if (mso)|(IE)]><td align=\"center\" width=\"${colWidthPx}\" style=\"width:${colWidthPx}px;padding:0px;border:none;\" valign=\"top\"><![endif]-->\n${colHtml}\n<!--[if (mso)|(IE)]></td><![endif]-->`;\n });\n innerHtml = `<!--[if (mso)|(IE)]><table role=\"presentation\" width=\"${contentWidth}\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr>${ghostCols.join(\"\\n\")}</tr></table><![endif]-->\n\n<!--[if !mso]><!-->\n<div style=\"max-width:${contentWidth}px;margin:0 auto;\">\n${columnsHtml.join(\"\\n\")}\n</div>\n<!--<![endif]-->`;\n } else {\n innerHtml = columnsHtml.join(\"\\n\");\n }\n const hideDesktop = row.values.hideDesktop ? \" u_hide_desktop\" : \"\";\n const hideMobile = row.values.hideMobile ? \" u_hide_mobile\" : \"\";\n return `<div class=\"u_row${hideDesktop}${hideMobile}\" style=\"padding:${padding};${bgStyle}${bgImage}\">\n <div style=\"margin:0 auto;min-width:320px;max-width:${contentWidth}px;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;background-color:transparent;\">\n <div style=\"border-collapse:collapse;display:table;width:100%;height:100%;background-color:transparent;\">\n ${innerHtml}\n </div>\n </div>\n</div>`;\n}\nfunction renderColumn(col, widthPx, colsBgColor, bodyValues, toolRenderers) {\n const bgColor = col.values.backgroundColor || colsBgColor || \"\";\n const padding = col.values.padding || \"0px\";\n const borderRadius = col.values.borderRadius || \"0px\";\n const bgStyle = bgColor ? `background-color:${bgColor};` : \"\";\n const contentsHtml = col.contents.map((content) => {\n const renderer = toolRenderers.get(content.type);\n if (!renderer) return `<!-- unknown tool: ${content.type} -->`;\n const ctx = {\n columnWidth: widthPx,\n displayMode: \"email\",\n contentWidth: parseInt(bodyValues.contentWidth || \"600\"),\n bodyValues\n };\n return renderer(content.values, ctx);\n }).join(\"\\n\");\n return `<div class=\"u_column\" style=\"max-width:${widthPx}px;min-width:${Math.min(widthPx, 320)}px;display:table-cell;vertical-align:top;\">\n <div style=\"height:100%;width:100% !important;border-radius:${borderRadius};-webkit-border-radius:${borderRadius};${bgStyle}\">\n <div style=\"box-sizing:border-box;height:100%;padding:${padding};border:none;border-radius:${borderRadius};-webkit-border-radius:${borderRadius};\">\n ${contentsHtml || '<!--[if (!mso)&(!IE)]><!--><div style=\"height:0;min-height:1px;font-size:0;\"> </div><!--<![endif]-->'}\n </div>\n </div>\n</div>`;\n}\nfunction getResponsiveCss(contentWidth) {\n return `\n@media only screen and (min-width: ${contentWidth + 20}px) {\n .u_row .u_column { display: table-cell; }\n}\n\n@media only screen and (max-width: ${contentWidth + 20}px) {\n .u_row .u_column {\n display: block !important;\n width: 100% !important;\n min-width: 320px !important;\n max-width: 100% !important;\n }\n .u_row {\n width: 100% !important;\n }\n}\n\n@media only screen and (max-width: 620px) {\n .u_row-container {\n max-width: 100% !important;\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n}\n\n@media (prefers-color-scheme: dark) {\n /* Dark mode overrides — add per-client rules as needed */\n}\n\n/* Outlook dark mode */\n[data-ogsb] body,\n[data-ogsb] table,\n[data-ogsb] td {\n /* Preserve original colors */\n}\n\n.u_hide_desktop { display: block !important; }\n.u_hide_mobile { display: block !important; }\n\n@media only screen and (max-width: ${contentWidth + 20}px) {\n .u_hide_desktop { display: block !important; }\n .u_hide_mobile { display: none !important; }\n}\n\n@media only screen and (min-width: ${contentWidth + 21}px) {\n .u_hide_desktop { display: none !important; }\n .u_hide_mobile { display: block !important; }\n}`;\n}\nfunction renderDesignToHtml(design, toolRenderers, options) {\n const bodyValues = design.body.values;\n const contentWidth = parseInt(bodyValues.contentWidth || \"600\");\n const rowsHtml = design.body.rows.map((row) => renderRow(row, bodyValues, toolRenderers)).join(\"\\n\");\n const cssBlock = getResponsiveCss(contentWidth);\n let fullHtml = wrapInDocumentShell(rowsHtml, cssBlock, bodyValues);\n if (options?.mergeTags) {\n for (const [tag, value] of Object.entries(options.mergeTags)) {\n fullHtml = fullHtml.replaceAll(`{{${tag}}}`, value);\n }\n }\n const bodyMatch = fullHtml.match(/<body[^>]*>([\\s\\S]*)<\\/body>/i);\n const cssMatch = fullHtml.match(/<style[^>]*>([\\s\\S]*?)<\\/style>/gi);\n const fontsUsed = [];\n if (bodyValues.fontFamily?.url) {\n fontsUsed.push(bodyValues.fontFamily.url);\n }\n return {\n design: structuredClone(design),\n html: fullHtml,\n chunks: {\n body: bodyMatch?.[1] ?? rowsHtml,\n css: cssMatch?.map((s) => s.replace(/<\\/?style[^>]*>/gi, \"\")).join(\"\\n\") ?? cssBlock,\n fonts: fontsUsed,\n js: \"\"\n }\n };\n}\nexport {\n getResponsiveCss,\n renderDesignToHtml,\n renderRow,\n wrapInDocumentShell\n};\n//# sourceMappingURL=index.js.map\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport type {\n UnlayerDesign,\n MailEditorConfig,\n ExportResult,\n ExportOptions,\n ToolDefinition,\n PropertyEditorDefinition,\n CustomTabDefinition,\n CallbackType,\n ImageUploadCallback,\n DisplayConditionCallback,\n} from '@emabuild/types';\nimport { EditorStore } from './state/editor-store.js';\nimport { ToolRegistry, type LitToolDefinition } from './tools/tool-registry.js';\nimport { DragManager } from './dnd/drag-manager.js';\nimport {\n textTool, headingTool, paragraphTool, imageTool, buttonTool,\n dividerTool, htmlTool, socialTool, menuTool, videoTool,\n timerTool, tableTool, formTool,\n} from './tools/built-in/index.js';\nimport { renderDesignToHtml } from '@emabuild/email-renderer';\n\n// Import sub-components\nimport './canvas/editor-canvas.js';\nimport './sidebar/editor-sidebar.js';\nimport './properties/property-panel.js';\n\n@customElement('mail-editor')\nexport class MailEditorElement extends LitElement {\n static styles = css`\n :host {\n display: flex;\n width: 100%;\n height: 100%;\n min-height: 500px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n color: #111827;\n box-sizing: border-box;\n overflow: hidden;\n position: relative;\n }\n * { box-sizing: border-box; }\n `;\n\n @property({ type: Object }) options: MailEditorConfig = {};\n\n private store = new EditorStore();\n private toolRegistry = new ToolRegistry();\n private dragManager: DragManager | null = null;\n private callbacks = new Map<string, Function>();\n private unsubscribe: (() => void) | null = null;\n\n connectedCallback() {\n super.connectedCallback();\n this.registerBuiltInTools();\n this.applyOptions();\n }\n\n firstUpdated() {\n // Attach DnD to shadow root\n this.dragManager = new DragManager(this.store, this.toolRegistry, this.shadowRoot!);\n this.dragManager.attach();\n\n // Subscribe to store changes for re-render\n this.unsubscribe = this.store.subscribe(() => this.requestUpdate());\n\n // Forward events\n this.store.events.on('design:loaded', (detail) => {\n this.dispatchEvent(new CustomEvent('design:loaded', { detail, bubbles: true, composed: true }));\n });\n this.store.events.on('design:updated', (detail) => {\n this.dispatchEvent(new CustomEvent('design:updated', { detail, bubbles: true, composed: true }));\n });\n\n // Fire ready event\n this.dispatchEvent(new CustomEvent('editor:ready', { bubbles: true, composed: true }));\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.dragManager?.detach();\n this.unsubscribe?.();\n this.store.events.removeAllListeners();\n }\n\n // ----------------------------------------------------------\n // Public API — mirrors Unlayer\n // ----------------------------------------------------------\n\n loadDesign(design: UnlayerDesign): void {\n this.store.loadDesign(design);\n }\n\n saveDesign(callback: (design: UnlayerDesign) => void): void {\n callback(structuredClone(this.store.getDesign()));\n }\n\n exportHtml(callback: (result: ExportResult) => void, options?: ExportOptions): void {\n const design = this.store.getDesign();\n const toolRenderers = new Map<string, (values: Record<string, unknown>, ctx: any) => string>();\n\n for (const tool of this.toolRegistry.getAll()) {\n toolRenderers.set(tool.name, (values, ctx) => tool.renderer.renderHtml(values as any, ctx));\n }\n\n const result = renderDesignToHtml(design, toolRenderers, options);\n callback(result);\n }\n\n async exportHtmlAsync(options?: ExportOptions): Promise<ExportResult> {\n return new Promise((resolve) => this.exportHtml(resolve, options));\n }\n\n registerTool(definition: LitToolDefinition): void {\n this.toolRegistry.register(definition);\n this.requestUpdate();\n }\n\n registerPropertyEditor(_name: string, _editor: PropertyEditorDefinition): void {\n // TODO: implement custom property editor registry\n }\n\n registerTab(_tab: CustomTabDefinition): void {\n // TODO: implement custom tab registry\n }\n\n registerCallback(type: string, callback: Function): void {\n this.callbacks.set(type, callback);\n }\n\n setMergeTags(_tags: unknown[]): void {\n // TODO: implement merge tag manager\n }\n\n undo(): void {\n this.store.undo();\n }\n\n redo(): void {\n this.store.redo();\n }\n\n setBodyValues(values: Record<string, unknown>): void {\n this.store.updateBodyValues(values as any);\n }\n\n // ----------------------------------------------------------\n // Internal\n // ----------------------------------------------------------\n\n private registerBuiltInTools() {\n this.toolRegistry.register(textTool);\n this.toolRegistry.register(headingTool);\n this.toolRegistry.register(paragraphTool);\n this.toolRegistry.register(imageTool);\n this.toolRegistry.register(buttonTool);\n this.toolRegistry.register(dividerTool);\n this.toolRegistry.register(htmlTool);\n this.toolRegistry.register(socialTool);\n this.toolRegistry.register(menuTool);\n this.toolRegistry.register(videoTool);\n this.toolRegistry.register(timerTool);\n this.toolRegistry.register(tableTool);\n this.toolRegistry.register(formTool);\n }\n\n private applyOptions() {\n if (this.options.design) {\n this.store.loadDesign(this.options.design);\n }\n }\n\n render() {\n return html`\n <me-editor-sidebar\n .store=${this.store}\n .toolRegistry=${this.toolRegistry}\n ></me-editor-sidebar>\n <me-editor-canvas\n .store=${this.store}\n .toolRegistry=${this.toolRegistry}\n ></me-editor-canvas>\n <me-property-panel\n .store=${this.store}\n .toolRegistry=${this.toolRegistry}\n ></me-property-panel>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'mail-editor': MailEditorElement;\n }\n}\n"],"names":["dist"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deep-clone.d.ts","sourceRoot":"","sources":["../../src/utils/deep-clone.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAEtC"}
|