@emabuild/core 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +410 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/{mail-editor-ClkIyPni.js → mail-editor-D0FbEUZu.js} +2 -2
- package/dist/mail-editor-D0FbEUZu.js.map +1 -0
- package/dist/mail-editor.d.ts +3 -3
- package/dist/mail-editor.d.ts.map +1 -1
- package/dist/mail-editor.js +1 -1
- package/dist/state/design-factory.d.ts +3 -3
- package/dist/state/design-factory.d.ts.map +1 -1
- package/dist/state/design-lookup.d.ts +7 -7
- package/dist/state/design-lookup.d.ts.map +1 -1
- package/dist/state/editor-store.d.ts +3 -3
- package/dist/state/editor-store.d.ts.map +1 -1
- package/dist/state/history-manager.d.ts +4 -4
- package/dist/state/history-manager.d.ts.map +1 -1
- package/dist/utils/id-generator.d.ts +4 -4
- package/dist/utils/id-generator.d.ts.map +1 -1
- package/package.json +16 -4
- package/dist/mail-editor-ClkIyPni.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mail-editor-D0FbEUZu.js","sources":["../src/utils/id-generator.ts","../src/utils/event-emitter.ts","../src/state/history-manager.ts","../src/state/design-factory.ts","../src/state/design-lookup.ts","../src/state/editor-store.ts","../src/tools/tool-registry.ts","../src/dnd/drag-state.ts","../src/dnd/drop-indicator.ts","../src/dnd/shadow-dom-utils.ts","../src/dnd/drag-manager.ts","../src/tools/helpers/value-extractor.ts","../src/tools/helpers/email-html.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":["/**\n * Unique ID generator and counter manager.\n *\n * The counter manager tracks incrementing IDs per prefix\n * (e.g. `u_row`, `u_column`, `u_content_text`) to match\n * email editor's `counters` field in the design JSON.\n */\n\nlet instanceCounter = 0;\n\n/** Generate a unique ID for internal use (not email editor-compatible) */\nexport function generateId(): string {\n return `me_${Date.now().toString(36)}_${(instanceCounter++).toString(36)}`;\n}\n\n/** Counter manager return type */\nexport interface CounterManager {\n /** Get a snapshot of all current counters */\n getCounters(): Record<string, number>;\n /** Replace all counters (used when loading a design) */\n setCounters(counters: Record<string, number>): void;\n /** Increment and return the next value for a given prefix */\n next(prefix: string): number;\n}\n\n/** Create an counter manager for ID generation */\nexport function createCounterManager(): CounterManager {\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 for (const key of Object.keys(counters)) {\n delete counters[key];\n }\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","/**\n * Type-safe event emitter with error isolation.\n *\n * Each listener is wrapped in a try/catch so a failing listener\n * doesn't break other listeners or the emitting code.\n */\n\n/** Map of event names to their payload types */\nexport interface EditorEventMap {\n 'design:loaded': { design: unknown };\n 'design:updated': { type: string; item?: unknown; changes?: unknown };\n 'editor:ready': void;\n 'image:uploaded': { url: string; width?: number; height?: number };\n}\n\ntype EventName = keyof EditorEventMap | (string & {});\ntype Listener<T = unknown> = (payload: T) => void;\n\nexport class EventEmitter {\n private listeners = new Map<string, Set<Listener>>();\n\n /** Register a listener for an event */\n on<K extends EventName>(event: K, listener: Listener<K extends keyof EditorEventMap ? EditorEventMap[K] : unknown>): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener as Listener);\n }\n\n /** Remove a specific listener */\n off<K extends EventName>(event: K, listener: Listener): void {\n this.listeners.get(event)?.delete(listener);\n }\n\n /** Emit an event with a payload. Errors in listeners are caught and logged. */\n emit<K extends EventName>(event: K, payload?: K extends keyof EditorEventMap ? EditorEventMap[K] : unknown): void {\n this.listeners.get(event)?.forEach((fn) => {\n try {\n fn(payload);\n } catch (e) {\n console.error(`[emabuild] Error in \"${event}\" listener:`, e);\n }\n });\n }\n\n /** Remove all listeners, optionally scoped to a single event */\n removeAllListeners(event?: string): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n}\n","/**\n * Undo/redo history manager with configurable stack depth.\n *\n * Stores immutable snapshots of the design state using `structuredClone`.\n * Each push creates a new entry and clears the redo stack.\n */\n\nimport type { EmailDesign } from '@emabuild/types';\n\nexport class HistoryManager {\n private undoStack: EmailDesign[] = [];\n private redoStack: EmailDesign[] = [];\n private readonly maxHistory: number;\n\n constructor(maxHistory = 50) {\n this.maxHistory = maxHistory;\n }\n\n /** Whether there are states to undo to */\n get canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n /** Whether there are states to redo to */\n get canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n /** Save current design to the undo stack before a mutation */\n push(design: EmailDesign): void {\n this.undoStack.push(structuredClone(design));\n if (this.undoStack.length > this.maxHistory) {\n this.undoStack.shift();\n }\n this.redoStack = [];\n }\n\n /** Restore the previous state, pushing current state to redo. Returns the restored design or undefined. */\n undo(currentDesign: EmailDesign): EmailDesign | undefined {\n const prev = this.undoStack.pop();\n if (!prev) return undefined;\n this.redoStack.push(structuredClone(currentDesign));\n return prev;\n }\n\n /** Restore the next state, pushing current state to undo. Returns the restored design or undefined. */\n redo(currentDesign: EmailDesign): EmailDesign | undefined {\n const next = this.redoStack.pop();\n if (!next) return undefined;\n this.undoStack.push(structuredClone(currentDesign));\n return next;\n }\n\n /** Clear all history (e.g. when loading a new design) */\n clear(): void {\n this.undoStack = [];\n this.redoStack = [];\n }\n}\n","/**\n * Factory functions for creating design entities.\n *\n * All functions produce properly structured objects matching\n * the design JSON schema with correct `_meta` fields.\n */\n\nimport type { EmailDesign, DesignRow, DesignContent } from '@emabuild/types';\nimport type { CounterManager } from '../utils/id-generator.js';\n\n/** Create a blank design */\nexport function createEmptyDesign(): EmailDesign {\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/** Create a new row with the given column proportions (e.g. [1,1] for 50/50) */\nexport function createRow(cm: CounterManager, cellProportions: number[]): DesignRow {\n const rowNum = cm.next('u_row');\n\n const columns = cellProportions.map(() => {\n const colNum = cm.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 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/** Create a new content block for the given tool type */\nexport function createContent(cm: CounterManager, type: string, values: Record<string, unknown> = {}): DesignContent {\n const counter = cm.next(`u_content_${type}`);\n const id = `u_content_${type}_${counter}`;\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 * Pure lookup functions for traversing the design tree.\n *\n * All functions are stateless — they take the design (or body rows)\n * as input and return references to the matching nodes.\n */\n\nimport type { EmailDesign, DesignRow, DesignColumn, DesignContent } from '@emabuild/types';\n\n/** Find a row by ID */\nexport function findRow(design: EmailDesign, rowId: string): DesignRow | undefined {\n return design.body.rows.find((r) => r.id === rowId);\n}\n\n/** Find a column by ID across all rows */\nexport function findColumn(design: EmailDesign, columnId: string): DesignColumn | undefined {\n for (const row of 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/** Find a content block by ID across all rows and columns */\nexport function findContent(design: EmailDesign, contentId: string): DesignContent | undefined {\n for (const row of 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/** Find the column that contains a given content block */\nexport function findParentColumn(design: EmailDesign, contentId: string): DesignColumn | undefined {\n for (const row of 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/** Find the row that contains a given column */\nexport function findParentRow(design: EmailDesign, columnId: string): DesignRow | undefined {\n for (const row of design.body.rows) {\n if (row.columns.some((c) => c.id === columnId)) return row;\n }\n return undefined;\n}\n\n/** Get the index of a row within the design */\nexport function getRowIndex(design: EmailDesign, rowId: string): number {\n return design.body.rows.findIndex((r) => r.id === rowId);\n}\n","/**\n * @module EditorStore\n *\n * Central state management for the mail editor.\n * Orchestrates design mutations, selection, history, and event emission.\n * Delegates to HistoryManager, design-lookup, and design-factory for specifics.\n *\n * @example\n * ```ts\n * const store = new EditorStore();\n * store.loadDesign(myDesign);\n * store.subscribe(() => console.log('state changed'));\n * store.addRow(store.createRow([1, 1]));\n * ```\n */\n\nimport type {\n EmailDesign,\n DesignBody,\n DesignRow,\n DesignColumn,\n DesignContent,\n BodyValues,\n RowValues,\n ColumnValues,\n ContentValues,\n DesignUpdatedEvent,\n} from '@emabuild/types';\nimport { createCounterManager, type CounterManager } from '../utils/id-generator.js';\nimport { EventEmitter } from '../utils/event-emitter.js';\nimport { HistoryManager } from './history-manager.js';\nimport { createEmptyDesign, createRow, createContent } from './design-factory.js';\nimport * as lookup from './design-lookup.js';\n\nexport type StoreSubscriber = () => void;\n\nexport class EditorStore {\n private design: EmailDesign;\n private history = new HistoryManager();\n private counterManager: CounterManager = createCounterManager();\n private subscribers = new Set<StoreSubscriber>();\n\n /** Public event emitter for design:loaded, design:updated, etc. */\n readonly events = new EventEmitter();\n\n // --- UI state ---\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 // ── Subscriptions ──────────────────────────────────────────\n\n /** Subscribe to all state changes. Returns an unsubscribe function. */\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 // ── Getters ────────────────────────────────────────────────\n\n /** Get the full design document */\n getDesign(): EmailDesign { return this.design; }\n /** Get the design body */\n getBody(): DesignBody { return this.design.body; }\n /** Get all rows */\n getRows(): DesignRow[] { return this.design.body.rows; }\n /** Get body-level values (background, fonts, etc.) */\n getBodyValues(): BodyValues { return this.design.body.values; }\n\n get selectedId(): string | null { return this._selectedId; }\n get hoveredId(): string | null { return this._hoveredId; }\n get viewMode(): 'desktop' | 'mobile' { return this._viewMode; }\n get activeTab(): string { return this._activeTab; }\n get canUndo(): boolean { return this.history.canUndo; }\n get canRedo(): boolean { return this.history.canRedo; }\n\n // ── Design Loading ─────────────────────────────────────────\n\n /** Load a design document, resetting history and selection */\n loadDesign(design: EmailDesign): void {\n this.design = structuredClone(design);\n this.counterManager.setCounters(this.design.counters);\n this.history.clear();\n this._selectedId = null;\n this.notify();\n this.events.emit('design:loaded', { design: this.design });\n }\n\n // ── Undo / Redo ────────────────────────────────────────────\n\n undo(): void {\n const prev = this.history.undo(this.design);\n if (!prev) return;\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.history.redo(this.design);\n if (!next) return;\n this.design = next;\n this.counterManager.setCounters(this.design.counters);\n this.notify();\n this.emitUpdate('content_updated');\n }\n\n // ── Selection / UI State ───────────────────────────────────\n\n select(id: string | null): void { this._selectedId = id; this.notify(); }\n hover(id: string | null): void { this._hoveredId = id; this.notify(); }\n setViewMode(mode: 'desktop' | 'mobile'): void { this._viewMode = mode; this.notify(); }\n setActiveTab(tab: string): void { this._activeTab = tab; this.notify(); }\n\n // ── Row Operations ─────────────────────────────────────────\n\n /** Add a row at the given index (or at the end) */\n addRow(row: DesignRow, index?: number): void {\n this.history.push(this.design);\n const rows = this.design.body.rows;\n const cloned = structuredClone(row);\n if (index !== undefined && index >= 0 && index <= rows.length) {\n rows.splice(index, 0, cloned);\n } else {\n rows.push(cloned);\n }\n this.syncCounters();\n this.notify();\n this.emitUpdate('row_added', cloned);\n }\n\n /** Remove a row by ID */\n removeRow(rowId: string): void {\n const idx = lookup.getRowIndex(this.design, rowId);\n if (idx === -1) return;\n this.history.push(this.design);\n this.design.body.rows.splice(idx, 1);\n if (this._selectedId === rowId) this._selectedId = null;\n this.notify();\n this.emitUpdate('row_removed');\n }\n\n /** Move a row from one index to another */\n moveRow(fromIndex: number, toIndex: number): void {\n this.history.push(this.design);\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 /** Duplicate a row, assigning fresh IDs to all nested elements */\n duplicateRow(rowId: string): void {\n const row = lookup.findRow(this.design, rowId);\n if (!row) return;\n this.history.push(this.design);\n const cloned = structuredClone(row);\n const rowNum = this.counterManager.next('u_row');\n cloned.id = `u_row_${rowNum}`;\n cloned.values._meta = { htmlID: cloned.id, htmlClassNames: 'u_row' };\n for (const col of cloned.columns) {\n const colNum = this.counterManager.next('u_column');\n col.id = `u_column_${colNum}`;\n col.values._meta = { htmlID: col.id, htmlClassNames: 'u_column' };\n for (const content of col.contents) {\n const cNum = this.counterManager.next(`u_content_${content.type}`);\n content.id = `u_content_${content.type}_${cNum}`;\n content.values._meta = { htmlID: content.id, htmlClassNames: `u_content_${content.type}` };\n }\n }\n const idx = lookup.getRowIndex(this.design, rowId);\n this.design.body.rows.splice(idx + 1, 0, cloned);\n this.syncCounters();\n this.notify();\n this.emitUpdate('row_added', cloned);\n }\n\n /** Get the index of a row */\n getRowIndex(rowId: string): number {\n return lookup.getRowIndex(this.design, rowId);\n }\n\n /** Update row-level values */\n updateRowValues(rowId: string, patch: Partial<RowValues>): void {\n const row = lookup.findRow(this.design, rowId);\n if (!row) return;\n this.history.push(this.design);\n Object.assign(row.values, patch);\n this.notify();\n this.emitUpdate('content_updated');\n }\n\n // ── Column Operations ──────────────────────────────────────\n\n /** Update column-level values */\n updateColumnValues(columnId: string, patch: Partial<ColumnValues>): void {\n const col = lookup.findColumn(this.design, columnId);\n if (!col) return;\n this.history.push(this.design);\n Object.assign(col.values, patch);\n this.notify();\n this.emitUpdate('content_updated');\n }\n\n // ── Content Operations ─────────────────────────────────────\n\n /** Add content to a column at the given index */\n addContent(columnId: string, content: DesignContent, index?: number): void {\n const col = lookup.findColumn(this.design, columnId);\n if (!col) return;\n this.history.push(this.design);\n const cloned = structuredClone(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 /** Remove a content block by ID */\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.history.push(this.design);\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 /** Update content values by ID */\n updateContentValues(contentId: string, patch: Partial<ContentValues>): void {\n const content = lookup.findContent(this.design, contentId);\n if (!content) return;\n this.history.push(this.design);\n Object.assign(content.values, patch);\n this.notify();\n this.emitUpdate('content_updated');\n }\n\n /** Move a content block to a different column at a given index */\n moveContent(contentId: string, targetColumnId: string, targetIndex: number): void {\n const content = lookup.findContent(this.design, contentId);\n if (!content) return;\n this.history.push(this.design);\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) { col.contents.splice(idx, 1); break; }\n }\n }\n // Insert at target\n const targetCol = lookup.findColumn(this.design, targetColumnId);\n if (targetCol) targetCol.contents.splice(targetIndex, 0, content);\n this.notify();\n this.emitUpdate('content_reordered');\n }\n\n /** Duplicate a content block, inserting the copy right after the original */\n duplicateContent(contentId: string): void {\n const content = lookup.findContent(this.design, contentId);\n if (!content) return;\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.history.push(this.design);\n const cloned = structuredClone(content);\n const counter = this.counterManager.next(`u_content_${content.type}`);\n cloned.id = `u_content_${content.type}_${counter}`;\n cloned.values._meta = { htmlID: cloned.id, htmlClassNames: `u_content_${content.type}` };\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 // ── Body Values ────────────────────────────────────────────\n\n /** Update body-level values (background, fonts, etc.) */\n updateBodyValues(patch: Partial<BodyValues>): void {\n this.history.push(this.design);\n Object.assign(this.design.body.values, patch);\n this.notify();\n this.emitUpdate('body_updated');\n }\n\n // ── Lookups (delegate to design-lookup) ────────────────────\n\n findRow(rowId: string): DesignRow | undefined { return lookup.findRow(this.design, rowId); }\n findColumn(columnId: string): DesignColumn | undefined { return lookup.findColumn(this.design, columnId); }\n findContent(contentId: string): DesignContent | undefined { return lookup.findContent(this.design, contentId); }\n findParentColumn(contentId: string): DesignColumn | undefined { return lookup.findParentColumn(this.design, contentId); }\n findParentRow(columnId: string): DesignRow | undefined { return lookup.findParentRow(this.design, columnId); }\n\n // ── Factory Methods (delegate to design-factory) ───────────\n\n /** Create a new row with the given column layout */\n createRow(cellProportions: number[]): DesignRow {\n const row = createRow(this.counterManager, cellProportions);\n this.syncCounters();\n return row;\n }\n\n /** Create a new content block for the given tool type */\n createContent(type: string, values: Record<string, unknown> = {}): DesignContent {\n const content = createContent(this.counterManager, type, values);\n this.syncCounters();\n return content;\n }\n\n // ── Private Helpers ────────────────────────────────────────\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 });\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","/**\n * @module drop-indicator\n *\n * Reusable drop indicator creation and positioning.\n * Used by DragManager for both content-level (blue) and row-level (purple) indicators.\n */\n\n/**\n * Create a floating drop indicator element.\n * @param color - CSS color for the indicator line\n * @returns An absolutely-positioned HTMLElement (hidden by default)\n */\nexport function createDropIndicator(color: string): HTMLElement {\n const el = document.createElement('div');\n Object.assign(el.style, {\n position: 'absolute',\n left: '0',\n 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/**\n * Position an indicator at a specific Y offset within a container.\n * @param indicator - The indicator element\n * @param container - The shadow root or element to append the indicator to\n * @param items - The list of elements to position between\n * @param index - The insertion index (0 = before first, items.length = after last)\n * @param insetX - Horizontal inset from edges (e.g. \"4px\" for content, \"0\" for rows)\n */\nexport function positionIndicator(\n indicator: HTMLElement,\n container: ShadowRoot | HTMLElement,\n items: HTMLElement[],\n index: number,\n insetX = '4px',\n): void {\n if (indicator.parentNode !== container) {\n indicator.remove();\n container.appendChild(indicator);\n }\n\n const containerEl = container instanceof ShadowRoot ? container.host as HTMLElement : container;\n const containerRect = containerEl.getBoundingClientRect();\n\n let indicatorY: number;\n if (items.length === 0 || index === 0) {\n indicatorY = items.length === 0 ? 0 : items[0].getBoundingClientRect().top - containerRect.top;\n } else if (index >= items.length) {\n const lastRect = items[items.length - 1].getBoundingClientRect();\n indicatorY = lastRect.bottom - containerRect.top;\n } else {\n const elRect = items[index].getBoundingClientRect();\n indicatorY = elRect.top - containerRect.top;\n }\n\n Object.assign(indicator.style, {\n display: 'block',\n top: `${indicatorY}px`,\n left: insetX,\n right: insetX,\n width: 'auto',\n });\n}\n\n/** Hide a drop indicator */\nexport function hideIndicator(indicator: HTMLElement | null): void {\n if (indicator) indicator.style.display = 'none';\n}\n","/**\n * @module shadow-dom-utils\n *\n * Utilities for traversing nested shadow DOM trees.\n * Required because the editor uses Lit Web Components with shadow DOM,\n * and standard `querySelectorAll` doesn't cross shadow boundaries.\n */\n\n/**\n * Recursively walk all elements across shadow DOM boundaries.\n * @param root - Starting point (ShadowRoot or HTMLElement)\n * @param callback - Called for each element encountered\n */\nexport function walkShadowDom(root: ShadowRoot | HTMLElement, callback: (el: HTMLElement) => void): 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) walkShadowDom(el.shadowRoot, callback);\n if (el.children?.length) walkShadowDom(el, callback);\n }\n}\n\n/**\n * Query all elements matching a selector across shadow DOM boundaries.\n * @param root - Starting point\n * @param selector - CSS selector to match\n * @returns Array of matching elements\n */\nexport function queryShadowAll<T extends HTMLElement>(root: ShadowRoot | HTMLElement, selector: string): T[] {\n const results: T[] = [];\n walkShadowDom(root, (el) => {\n if (el.matches?.(selector)) results.push(el as T);\n });\n return results;\n}\n\n/**\n * Walk up the DOM tree (including shadow DOM boundaries) to find\n * an ancestor with a specific `data-*` attribute.\n * @param el - Starting element\n * @param dataKey - The dataset key to look for (e.g. \"contentId\" for data-content-id)\n * @returns The matching ancestor element, or null\n */\nexport function findAncestorWithData(el: HTMLElement | null, dataKey: string): HTMLElement | null {\n while (el) {\n if (el.dataset?.[dataKey]) 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 * @module DragManager\n *\n * Orchestrates all drag-and-drop operations in the editor.\n * Handles three drag types:\n * - Tool drag: from sidebar palette into canvas columns\n * - Layout drag: from sidebar layout presets between canvas rows\n * - Content drag: reordering existing content blocks between columns\n *\n * Uses {@link drop-indicator} for visual feedback and\n * {@link shadow-dom-utils} for traversing nested shadow DOM.\n */\n\nimport type { EditorStore } from '../state/editor-store.js';\nimport type { ToolRegistry } from '../tools/tool-registry.js';\nimport { dragState } from './drag-state.js';\nimport { createDropIndicator, positionIndicator, hideIndicator } from './drop-indicator.js';\nimport { queryShadowAll } from './shadow-dom-utils.js';\n\ntype DropType = 'content' | 'row';\n\ninterface DropTarget {\n type: DropType;\n columnId?: string;\n contentIndex?: number;\n rowIndex?: number;\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 contentIndicator: 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 all drag event listeners to the shadow root */\n attach(): void {\n this.root.addEventListener('dragover', this.onDragOver as EventListener);\n this.root.addEventListener('drop', this.onDrop as EventListener);\n this.root.addEventListener('dragend', this.onDragEnd as EventListener);\n this.root.addEventListener('dragleave', this.onDragLeave as EventListener);\n this.contentIndicator = createDropIndicator('#3b82f6');\n this.rowIndicator = createDropIndicator('#8b5cf6');\n }\n\n /** Remove all event listeners and clean up indicators */\n detach(): void {\n this.root.removeEventListener('dragover', this.onDragOver as EventListener);\n this.root.removeEventListener('drop', this.onDrop as EventListener);\n this.root.removeEventListener('dragend', this.onDragEnd as EventListener);\n this.root.removeEventListener('dragleave', this.onDragLeave as EventListener);\n this.contentIndicator?.remove();\n this.rowIndicator?.remove();\n }\n\n // ── Event Handlers ─────────────────────────────────────────\n\n private onDragOver = (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 this.currentDrop = this.findRowDropTarget(e.clientY);\n hideIndicator(this.contentIndicator);\n this.showRowIndicator();\n } else {\n this.currentDrop = this.findContentDropTarget(e.clientX, e.clientY);\n hideIndicator(this.rowIndicator);\n this.showContentIndicator();\n }\n };\n\n private onDrop = (e: DragEvent) => {\n e.preventDefault();\n this.hideAllIndicators();\n\n const layoutData = e.dataTransfer?.getData('application/maileditor-layout');\n if (layoutData) {\n this.handleLayoutDrop(JSON.parse(layoutData));\n return this.reset();\n }\n\n const toolName = e.dataTransfer?.getData('application/maileditor-tool');\n if (toolName) {\n this.handleToolDrop(toolName);\n return this.reset();\n }\n\n const contentId = e.dataTransfer?.getData('application/maileditor-content') || dragState.draggingContentId;\n if (contentId) {\n this.handleContentDrop(contentId);\n }\n this.reset();\n };\n\n private onDragEnd = () => {\n this.hideAllIndicators();\n this.reset();\n };\n\n private onDragLeave = (e: DragEvent) => {\n const related = e.relatedTarget as HTMLElement | null;\n if (!related || !this.root.contains(related)) {\n this.hideAllIndicators();\n this.currentDrop = null;\n }\n };\n\n // ── Drop Handlers ──────────────────────────────────────────\n\n private handleLayoutDrop(cells: number[]): void {\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 }\n\n private handleToolDrop(toolName: string): void {\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 with the tool\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 }\n\n private handleContentDrop(contentId: string): void {\n if (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\n // ── Drop Target Detection ─────────────────────────────────\n\n private findRowDropTarget(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) return { type: 'row', rowIndex: 0, y: 0 };\n\n let bestDist = Math.abs(clientY - rows[0].getBoundingClientRect().top);\n let bestTarget: DropTarget = { type: 'row', rowIndex: 0, y: rows[0].getBoundingClientRect().top };\n\n for (let i = 0; i < rows.length; i++) {\n const y = rows[i].getBoundingClientRect().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 return bestTarget;\n }\n\n private findContentDropTarget(clientX: number, clientY: number): DropTarget | null {\n const columns = queryShadowAll<HTMLElement>(this.root, 'me-column-renderer');\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 || !colEl.shadowRoot) continue;\n\n const colRect = colEl.getBoundingClientRect();\n if (clientX < colRect.left || clientX > colRect.right) continue;\n\n const contentEls = Array.from(colEl.shadowRoot.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 // Check before first element\n const firstY = contentEls[0].getBoundingClientRect().top;\n let dist = Math.abs(clientY - firstY);\n if (dist < bestDist) {\n bestDist = dist;\n bestTarget = { type: 'content', columnId, contentIndex: 0, y: firstY };\n }\n\n // Check between and after each element\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 return bestTarget;\n }\n\n // ── Indicator Positioning ──────────────────────────────────\n\n private showContentIndicator(): void {\n if (!this.contentIndicator || !this.currentDrop?.columnId) {\n hideIndicator(this.contentIndicator);\n return;\n }\n\n const columns = queryShadowAll<HTMLElement>(this.root, 'me-column-renderer');\n const colEl = columns.find((c) => c.dataset.columnId === this.currentDrop!.columnId);\n if (!colEl?.shadowRoot) return;\n\n const contentEls = Array.from(colEl.shadowRoot.querySelectorAll('me-content-renderer')) as HTMLElement[];\n positionIndicator(this.contentIndicator, colEl.shadowRoot, contentEls, this.currentDrop.contentIndex ?? 0, '4px');\n }\n\n private showRowIndicator(): void {\n if (!this.rowIndicator || !this.currentDrop) {\n hideIndicator(this.rowIndicator);\n return;\n }\n\n const canvas = this.root.querySelector('me-editor-canvas');\n const canvasBody = canvas?.shadowRoot?.querySelector('.canvas-body') as HTMLElement | null;\n if (!canvasBody) return;\n\n const rows = Array.from(canvas!.shadowRoot!.querySelectorAll('me-row-renderer')) as HTMLElement[];\n positionIndicator(this.rowIndicator, canvasBody, rows, this.currentDrop.rowIndex ?? 0, '0');\n }\n\n private hideAllIndicators(): void {\n hideIndicator(this.contentIndicator);\n hideIndicator(this.rowIndicator);\n }\n\n private reset(): void {\n this.currentDrop = null;\n dragState.reset();\n }\n}\n","/**\n * @module value-extractor\n *\n * Type-safe utilities for extracting values from content value maps.\n * Replaces repetitive `(values.x as string) || 'default'` casts\n * used across all tool renderers.\n */\n\nimport type { ContentValues } from '@emabuild/types';\n\n/**\n * Extract a string value with a fallback default.\n * @param values - The content values map\n * @param key - The property key to extract\n * @param fallback - Default value if key is missing or empty\n */\nexport function str(values: ContentValues, key: string, fallback = ''): string {\n const v = values[key];\n if (typeof v === 'string' && v !== '') return v;\n return fallback;\n}\n\n/**\n * Extract a numeric value with a fallback default.\n * Parses strings like \"14px\" or \"100%\" to their numeric part.\n * @param values - The content values map\n * @param key - The property key to extract\n * @param fallback - Default value if key is missing or not a number\n */\nexport function num(values: ContentValues, key: string, fallback = 0): number {\n const v = values[key];\n if (typeof v === 'number') return v;\n if (typeof v === 'string') {\n const parsed = parseFloat(v);\n return isNaN(parsed) ? fallback : parsed;\n }\n return fallback;\n}\n\n/**\n * Safely parse a JSON string with a typed fallback.\n * Used by tools that store structured data as JSON strings\n * (social icons, menu items, table data, form fields).\n *\n * @param value - The raw value (expected to be a JSON string)\n * @param fallback - Returned if parsing fails or value is not a string\n *\n * @example\n * ```ts\n * const items = jsonParse<MenuItem[]>(values.items, defaultItems);\n * ```\n */\nexport function jsonParse<T>(value: unknown, fallback: T): T {\n if (typeof value !== 'string') return fallback;\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n","/**\n * @module email-html\n *\n * Shared HTML generation utilities for email-safe output.\n * Provides the table-cell wrapper used by every tool's `renderHtml()`,\n * plus VML helpers for Outlook compatibility.\n */\n\n/** Options for the standard email table cell wrapper */\nexport interface TableCellOptions {\n /** CSS padding (e.g. \"10px\" or \"10px 20px\") */\n padding: string;\n /** Horizontal alignment: \"left\" | \"center\" | \"right\" */\n align?: string;\n /** Additional inline styles on the `<td>` element */\n extraTdStyle?: string;\n}\n\n/**\n * Wrap content in the standard email-safe table cell structure.\n * This is the `<table role=\"presentation\">` pattern used by every tool.\n *\n * @param content - The inner HTML content\n * @param options - Cell configuration (padding, alignment, extra styles)\n * @returns Complete table HTML string\n *\n * @example\n * ```ts\n * return emailTableCell('<p>Hello</p>', { padding: '10px', align: 'left' });\n * ```\n */\nexport function emailTableCell(content: string, options: TableCellOptions): string {\n const { padding, align = 'left', extraTdStyle = '' } = options;\n const tdStyle = `overflow-wrap:break-word;word-break:break-word;padding:${padding};font-family:arial,helvetica,sans-serif;${extraTdStyle}`;\n return `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\">\n <tbody><tr><td style=\"${tdStyle}\" align=\"${align}\">\n ${content}\n </td></tr></tbody>\n</table>`;\n}\n\n/** Options for VML rounded-rectangle button (Outlook fallback) */\nexport interface VmlButtonOptions {\n /** Background color */\n bgColor: string;\n /** Text color */\n textColor: string;\n /** Font size (e.g. \"14px\") */\n fontSize: string;\n /** Font weight (e.g. \"700\") */\n fontWeight: string;\n /** CSS border-radius (e.g. \"6px\") */\n borderRadius: string;\n}\n\n/**\n * Generate a VML roundrect button for Outlook email clients.\n * Outlook doesn't support CSS border-radius on `<a>` tags,\n * so VML is needed for rounded buttons.\n *\n * @param text - Button label\n * @param href - Button link URL\n * @param options - Visual styling options\n * @returns VML HTML wrapped in MSO conditional comments\n */\nexport function vmlRoundrectButton(text: string, href: string, options: VmlButtonOptions): string {\n const { bgColor, textColor, fontSize, fontWeight, borderRadius } = options;\n const radiusPx = parseInt(borderRadius) || 0;\n if (radiusPx <= 0) return '';\n\n const arcsize = Math.round((radiusPx / 20) * 100);\n return `<!--[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=\"${arcsize}%\" 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}\n","/**\n * @module text-tool\n *\n * Rich text content block. Renders HTML text with formatting.\n *\n * Email compatibility: Uses `<div>` inside a table cell with inline styles.\n * Supports bold, italic, links, font sizes via HTML content.\n * Works across all major email clients.\n */\n\nimport { 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';\nimport { str } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.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 Content',\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 textAlign: { label: 'Text Align', defaultValue: 'left', widget: 'alignment' },\n lineHeight: {\n label: 'Line Height', defaultValue: '140%', widget: 'dropdown',\n widgetParams: { options: [\n { label: '100%', value: '100%' }, { label: '120%', value: '120%' },\n { label: '140%', value: '140%' }, { label: '160%', value: '160%' },\n { label: '180%', value: '180%' }, { label: '200%', value: '200%' },\n ]},\n },\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): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const bgColor = str(values, 'backgroundColor', 'transparent');\n const color = str(values, 'color', 'inherit');\n const lineHeight = str(values, 'lineHeight', '140%');\n const textContent = str(values, 'text');\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): string {\n const padding = str(values, 'containerPadding', '10px');\n const bgColor = str(values, 'backgroundColor');\n const color = str(values, 'color', '#000000');\n const lineHeight = str(values, 'lineHeight', '140%');\n const textAlign = str(values, 'textAlign', 'left');\n const textContent = str(values, 'text');\n const bgStyle = bgColor ? `background-color:${bgColor};` : '';\n\n const inner = `<div style=\"font-size:14px;color:${color};line-height:${lineHeight};text-align:${textAlign};word-wrap:break-word;\">${textContent}</div>`;\n return emailTableCell(inner, { padding, extraTdStyle: bgStyle });\n },\n },\n};\n","/**\n * @module heading-tool\n *\n * Heading content block (H1-H4).\n *\n * Email compatibility: Renders as semantic heading tag inside a table cell.\n * Margin reset to 0 for consistent cross-client spacing.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.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: { label: 'Text', defaultValue: 'Heading', widget: 'text' },\n headingType: {\n label: 'Heading Type', defaultValue: 'h1', widget: 'dropdown',\n widgetParams: { options: [\n { label: 'H1', value: 'h1' }, { label: 'H2', value: 'h2' },\n { label: 'H3', value: 'h3' }, { label: 'H4', value: 'h4' },\n ]},\n },\n },\n },\n style: {\n title: 'Style',\n options: {\n fontSize: {\n label: 'Font Size', defaultValue: '22px', widget: 'dropdown',\n widgetParams: { options: [\n { label: '14px', value: '14px' }, { label: '16px', value: '16px' },\n { label: '18px', value: '18px' }, { label: '20px', value: '20px' },\n { label: '22px', value: '22px' }, { label: '26px', value: '26px' },\n { label: '30px', value: '30px' }, { label: '36px', value: '36px' },\n { label: '48px', value: '48px' }, { label: '60px', value: '60px' },\n ]},\n },\n color: { label: 'Text Color', defaultValue: '#000000', widget: 'color_picker' },\n textAlign: { label: 'Text Align', defaultValue: 'left', widget: 'alignment' },\n fontWeight: {\n label: 'Font Weight', defaultValue: '700', widget: 'dropdown',\n widgetParams: { options: [\n { label: 'Normal', value: '400' }, { label: 'Medium', value: '500' },\n { label: 'Semi Bold', value: '600' }, { label: 'Bold', value: '700' },\n { label: 'Extra Bold', value: '800' },\n ]},\n },\n lineHeight: {\n label: 'Line Height', defaultValue: '140%', widget: 'dropdown',\n widgetParams: { options: [\n { label: '100%', value: '100%' }, { label: '120%', value: '120%' },\n { label: '140%', value: '140%' }, { label: '160%', value: '160%' },\n { label: '180%', value: '180%' }, { label: '200%', value: '200%' },\n ]},\n },\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: '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: 'Heading', headingType: 'h1', fontSize: '22px', color: '#000000',\n textAlign: 'left', fontWeight: '700', lineHeight: '140%',\n letterSpacing: 'normal', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const fontSize = str(values, 'fontSize', '22px');\n const color = str(values, 'color', '#000000');\n const textAlign = str(values, 'textAlign', 'left');\n const fontWeight = str(values, 'fontWeight', '700');\n const lineHeight = str(values, 'lineHeight', '140%');\n const text = str(values, 'text', '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): string {\n const padding = str(values, 'containerPadding', '10px');\n const fontSize = str(values, 'fontSize', '22px');\n const color = str(values, 'color', '#000000');\n const textAlign = str(values, 'textAlign', 'left');\n const fontWeight = str(values, 'fontWeight', '700');\n const lineHeight = str(values, 'lineHeight', '140%');\n const letterSpacing = str(values, 'letterSpacing', 'normal');\n const tag = str(values, 'headingType', 'h1');\n const text = str(values, 'text', 'Heading');\n\n const inner = `<${tag} style=\"margin:0;font-size:${fontSize};color:${color};text-align:${textAlign};font-weight:${fontWeight};line-height:${lineHeight};letter-spacing:${letterSpacing};\">${text}</${tag}>`;\n return emailTableCell(inner, { padding });\n },\n },\n};\n","/**\n * @module paragraph-tool\n *\n * Block paragraph with configurable line-height and letter-spacing.\n *\n * Email compatibility: Inline styles on a `<div>` inside table cell.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.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 textAlign: { label: 'Text Align', defaultValue: 'left', widget: 'alignment' },\n lineHeight: { label: 'Line Height', defaultValue: '160%', 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: 'padding' },\n },\n },\n },\n defaultValues: {\n text: '<p style=\"font-size:14px;line-height:1.6;\">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>',\n color: '#374151', lineHeight: '160%', letterSpacing: 'normal',\n textAlign: 'left', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const color = str(values, 'color', '#374151');\n const lineHeight = str(values, 'lineHeight', '160%');\n return html`<div style=\"padding:${padding};color:${color};line-height:${lineHeight};word-break:break-word;\">${unsafeHTML(str(values, 'text'))}</div>`;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const color = str(values, 'color', '#374151');\n const lineHeight = str(values, 'lineHeight', '160%');\n const textAlign = str(values, 'textAlign', 'left');\n const letterSpacing = str(values, 'letterSpacing', 'normal');\n const inner = `<div style=\"font-size:14px;color:${color};line-height:${lineHeight};text-align:${textAlign};letter-spacing:${letterSpacing};word-wrap:break-word;\">${str(values, 'text')}</div>`;\n return emailTableCell(inner, { padding });\n },\n },\n};\n","/**\n * @module image-tool\n *\n * Responsive image block with optional link and border-radius.\n *\n * Email compatibility: Uses `<img>` with explicit width attribute,\n * max-width:100% for responsive scaling, display:block to remove\n * the bottom gap. Alt text required for accessibility.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.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: {\n label: 'Width', defaultValue: '100%', widget: 'dropdown',\n widgetParams: { options: [\n { label: 'Auto', value: 'auto' }, { label: '25%', value: '25%' },\n { label: '50%', value: '50%' }, { label: '75%', value: '75%' },\n { label: '100%', value: '100%' },\n ]},\n },\n align: { label: 'Align', defaultValue: 'center', widget: 'alignment' },\n borderRadius: { label: 'Border Radius', defaultValue: '0px', widget: 'text' },\n },\n },\n spacing: {\n title: 'Spacing',\n options: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\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', href: '', target: '_blank', width: '100%',\n maxWidth: '100%', align: 'center', borderRadius: '0px', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const src = str(values, 'src');\n const alt = str(values, 'alt');\n const width = str(values, 'width', '100%');\n const borderRadius = str(values, 'borderRadius', '0px');\n const align = str(values, 'align', 'center');\n\n if (!src) {\n return html`<div style=\"padding:${padding};text-align:${align};\"><div style=\"background:#f1f5f9;border:2px dashed #cbd5e1;border-radius:8px;padding:40px 20px;text-align:center;color:#94a3b8;font-size:13px;\">No image set. Enter a URL in the property panel.</div></div>`;\n }\n return html`<div style=\"padding:${padding};text-align:${align};\"><img src=${src} alt=${alt} style=\"display:inline-block;max-width:100%;width:${width};border-radius:${borderRadius};border:0;\" /></div>`;\n },\n renderHtml(values: ContentValues, ctx: ExportRenderContext): string {\n const padding = str(values, 'containerPadding', '10px');\n const src = str(values, 'src');\n const alt = str(values, 'alt');\n const href = str(values, 'href');\n const target = str(values, 'target', '_blank');\n const width = str(values, 'width', '100%');\n const borderRadius = str(values, 'borderRadius', '0px');\n const align = str(values, 'align', 'center');\n const widthPx = width === '100%' ? ctx.columnWidth : parseInt(width);\n const brStyle = 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;clear:both;display:inline-block!important;border:none;height:auto;float:none;width:${width};max-width:${widthPx}px;${brStyle}\" width=\"${widthPx}\" />`;\n const content = href ? `<a href=\"${href}\" target=\"${target}\" style=\"text-decoration:none;\">${imgTag}</a>` : imgTag;\n return emailTableCell(content, { padding, align });\n },\n },\n};\n","/**\n * @module button-tool\n *\n * Call-to-action button with customizable colors, border-radius, and sizing.\n *\n * Email compatibility: Uses `<a>` tag styled as button with inline styles.\n * Includes VML roundrect fallback for Outlook border-radius support.\n * Uses mso-border-alt for Outlook padding.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str } from '../helpers/value-extractor.js';\nimport { emailTableCell, vmlRoundrectButton } from '../helpers/email-html.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: {\n label: 'Font Size', defaultValue: '14px', widget: 'dropdown',\n widgetParams: { options: [\n { label: '12px', value: '12px' }, { label: '13px', value: '13px' },\n { label: '14px', value: '14px' }, { label: '16px', value: '16px' },\n { label: '18px', value: '18px' }, { label: '20px', value: '20px' },\n ]},\n },\n fontWeight: {\n label: 'Font Weight', defaultValue: '700', widget: 'dropdown',\n widgetParams: { options: [{ label: 'Normal', value: '400' }, { label: 'Bold', value: '700' }] },\n },\n borderRadius: { label: 'Border Radius', defaultValue: '4px', widget: 'text' },\n buttonWidth: {\n label: 'Width', defaultValue: 'auto', widget: 'dropdown',\n widgetParams: { options: [\n { label: 'Auto', value: 'auto' }, { label: '100%', value: '100%' }, { label: '50%', value: '50%' },\n ]},\n },\n textAlign: { label: 'Align', defaultValue: 'center', widget: 'alignment' },\n buttonPadding: { label: 'Button Padding', defaultValue: '10px 20px', widget: 'padding' },\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: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\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', href: '#', target: '_blank', backgroundColor: '#3b82f6',\n textColor: '#ffffff', fontSize: '14px', fontWeight: '700', borderRadius: '4px',\n buttonWidth: 'auto', textAlign: 'center', buttonPadding: '10px 20px',\n borderColor: '', borderWidth: '0px', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const bg = str(values, 'backgroundColor', '#3b82f6');\n const color = str(values, 'textColor', '#ffffff');\n const fontSize = str(values, 'fontSize', '14px');\n const fontWeight = str(values, 'fontWeight', '700');\n const radius = str(values, 'borderRadius', '4px');\n const btnPad = str(values, 'buttonPadding', '10px 20px');\n const text = str(values, 'text', 'Click Me');\n const align = str(values, 'textAlign', 'center');\n const btnWidth = str(values, 'buttonWidth', 'auto');\n const bw = str(values, 'borderWidth', '0px');\n const bc = str(values, 'borderColor', bg);\n const borderStyle = bw !== '0px' ? `border:${bw} solid ${bc};` : 'border:none;';\n const widthStyle = btnWidth === 'auto' ? 'display:inline-block;' : `display:block;width:${btnWidth};`;\n\n return html`\n <div style=\"padding:${padding};text-align:${align};\">\n <a style=\"${widthStyle}background-color:${bg};color:${color};font-size:${fontSize};font-weight:${fontWeight};border-radius:${radius};padding:${btnPad};text-decoration:none;text-align:center;${borderStyle}cursor:pointer;font-family:arial,helvetica,sans-serif;box-sizing:border-box;\">${text}</a>\n </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const bg = str(values, 'backgroundColor', '#3b82f6');\n const color = str(values, 'textColor', '#ffffff');\n const fontSize = str(values, 'fontSize', '14px');\n const fontWeight = str(values, 'fontWeight', '700');\n const radius = str(values, 'borderRadius', '4px');\n const btnPad = str(values, 'buttonPadding', '10px 20px');\n const text = str(values, 'text', 'Click Me');\n const align = str(values, 'textAlign', 'center');\n const href = str(values, 'href', '#');\n const target = str(values, 'target', '_blank');\n const bw = str(values, 'borderWidth', '0px');\n const bc = str(values, 'borderColor', bg);\n const borderStyle = bw !== '0px' ? `border:${bw} solid ${bc};` : 'border:none;';\n\n const vml = vmlRoundrectButton(text, href, { bgColor: bg, textColor: color, fontSize, fontWeight, borderRadius: radius });\n const vmlOpen = vml ? `${vml}\\n <!--[if !mso]><!-->` : '<!--[if !mso]><!-->';\n const vmlClose = '<!--<![endif]-->';\n\n const inner = `<div align=\"${align}\">\n ${vmlOpen}\n <a href=\"${href}\" target=\"${target}\" style=\"box-sizing:border-box;display:inline-block;text-decoration:none;text-align:center;color:${color};background-color:${bg};border-radius:${radius};font-size:${fontSize};font-weight:${fontWeight};padding:${btnPad};font-family:arial,helvetica,sans-serif;${borderStyle}mso-border-alt:none;word-break:keep-all;\"><span style=\"line-height:120%;\">${text}</span></a>\n ${vmlClose}\n </div>`;\n return emailTableCell(inner, { padding, align });\n },\n },\n};\n","/**\n * @module divider-tool\n *\n * Horizontal line divider with configurable style, width, and color.\n *\n * Email compatibility: Uses border-top on a nested table for consistent rendering.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.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: {\n label: 'Style', defaultValue: 'solid', widget: 'dropdown',\n widgetParams: { options: [\n { label: 'Solid', value: 'solid' }, { label: 'Dashed', value: 'dashed' },\n { label: 'Dotted', value: 'dotted' }, { label: 'Double', value: 'double' },\n ]},\n },\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: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\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', borderTopStyle: 'solid', borderTopColor: '#cccccc',\n width: '100%', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const width = str(values, 'width', '100%');\n const border = `${str(values, 'borderTopWidth', '1px')} ${str(values, 'borderTopStyle', 'solid')} ${str(values, 'borderTopColor', '#cccccc')}`;\n return html`<div style=\"padding:${padding};\"><div style=\"border-top:${border};width:${width};margin:0 auto;\"></div></div>`;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const width = str(values, 'width', '100%');\n const border = `${str(values, 'borderTopWidth', '1px')} ${str(values, 'borderTopStyle', 'solid')} ${str(values, 'borderTopColor', '#cccccc')}`;\n const inner = `<table role=\"presentation\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"${width}\" style=\"border-collapse:collapse;border-top:${border};\"><tbody><tr><td style=\"font-size:0;line-height:0;\"> </td></tr></tbody></table>`;\n return emailTableCell(inner, { padding, align: 'center' });\n },\n },\n};\n","/**\n * @module html-tool\n *\n * Raw HTML content block for custom code injection.\n *\n * Email compatibility: Content is inserted as-is inside a table cell.\n * The user is responsible for email-safe HTML in this block.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.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: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'text' } },\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 return html`<div style=\"padding:${str(values, 'containerPadding', '10px')};\">${unsafeHTML(str(values, 'html'))}</div>`;\n },\n renderHtml(values: ContentValues): string {\n return emailTableCell(str(values, 'html'), { padding: str(values, 'containerPadding', '10px') });\n },\n },\n};\n","/**\n * @module social-tool\n *\n * Social media icon links (Facebook, Twitter, Instagram, LinkedIn, etc.).\n *\n * Email compatibility: Uses nested tables for icon layout.\n * Each icon is a colored circle with centered text, rendered\n * as a table cell for cross-client consistency.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str, jsonParse } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\nimport type { SocialIcon } from '../helpers/types.js';\n\nconst DEFAULT_ICONS: 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(DEFAULT_ICONS), 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: { textAlign: { label: 'Align', defaultValue: 'center', widget: 'alignment' } },\n },\n spacing: {\n title: 'Spacing',\n options: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\n },\n },\n defaultValues: {\n icons: JSON.stringify(DEFAULT_ICONS), iconSize: '32px', iconSpacing: '8px',\n textAlign: 'center', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const align = str(values, 'textAlign', 'center');\n const iconSize = str(values, 'iconSize', '32px');\n const spacing = str(values, 'iconSpacing', '8px');\n const icons = jsonParse<SocialIcon[]>(values.icons, DEFAULT_ICONS);\n\n return html`\n <div style=\"padding:${padding};text-align:${align};\">\n ${icons.map((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 </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const align = str(values, 'textAlign', 'center');\n const iconSize = str(values, 'iconSize', '32');\n const spacing = str(values, 'iconSpacing', '8px');\n const icons = jsonParse<SocialIcon[]>(values.icons, DEFAULT_ICONS);\n\n const cells = icons.map((s) =>\n `<td align=\"center\" valign=\"middle\" style=\"padding:0 ${spacing};\"><a href=\"${s.url}\" target=\"_blank\" style=\"text-decoration:none;\"><table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td width=\"${iconSize}\" height=\"${iconSize}\" align=\"center\" valign=\"middle\" style=\"width:${iconSize}px;height:${iconSize}px;background:${s.color};border-radius:50%;color:#fff;font-size:14px;font-weight:bold;font-family:arial,sans-serif;\">${s.icon}</td></tr></table></a></td>`\n ).join('\\n');\n\n const inner = `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"${align}\"><tr>${cells}</tr></table>`;\n return emailTableCell(inner, { padding, align });\n },\n },\n};\n","/**\n * @module menu-tool\n *\n * Horizontal navigation menu with separator characters.\n *\n * Email compatibility: Uses inline `<a>` tags with text separators.\n * All styles are inline for cross-client rendering.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str, jsonParse } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\nimport type { MenuItem } from '../helpers/types.js';\n\nconst DEFAULT_ITEMS: 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: { items: { label: 'Items (JSON)', defaultValue: JSON.stringify(DEFAULT_ITEMS), widget: 'rich_text' } },\n },\n style: {\n title: 'Style',\n options: {\n textAlign: { label: 'Align', defaultValue: 'center', widget: 'alignment' },\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: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\n },\n },\n defaultValues: {\n items: JSON.stringify(DEFAULT_ITEMS), textAlign: 'center', fontSize: '14px',\n color: '#333333', separator: '|', separatorColor: '#cccccc', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const align = str(values, 'textAlign', 'center');\n const fontSize = str(values, 'fontSize', '14px');\n const color = str(values, 'color', '#333333');\n const sep = str(values, 'separator', '|');\n const sepColor = str(values, 'separatorColor', '#cccccc');\n const items = jsonParse<MenuItem[]>(values.items, DEFAULT_ITEMS);\n\n return html`\n <div style=\"padding:${padding};text-align:${align};font-size:${fontSize};font-family:arial,sans-serif;\">\n ${items.map((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 </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const align = str(values, 'textAlign', 'center');\n const fontSize = str(values, 'fontSize', '14px');\n const color = str(values, 'color', '#333333');\n const sep = str(values, 'separator', '|');\n const sepColor = str(values, 'separatorColor', '#cccccc');\n const items = jsonParse<MenuItem[]>(values.items, DEFAULT_ITEMS);\n\n const links = 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 emailTableCell(`<div style=\"text-align:${align};\">${links}</div>`, { padding, align });\n },\n },\n};\n","/**\n * @module video-tool\n *\n * Video embed block with thumbnail and play button overlay.\n * Supports YouTube and Vimeo URLs with auto-thumbnail detection.\n *\n * Email compatibility: Video cannot play in email — renders as\n * a linked thumbnail image with a play button overlay.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues, ExportRenderContext } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\n\n/** Extract YouTube video ID and return thumbnail URL */\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\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: { textAlign: { label: 'Align', defaultValue: 'center', widget: 'alignment' } },\n },\n spacing: {\n title: 'Spacing',\n options: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\n },\n },\n defaultValues: {\n url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',\n thumbnailUrl: '', alt: 'Video', textAlign: 'center', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const url = str(values, 'url');\n const thumbnail = str(values, 'thumbnailUrl') || getYouTubeThumbnail(url) || '';\n const align = str(values, 'textAlign', 'center');\n\n if (!thumbnail) {\n return html`<div style=\"padding:${padding};text-align:${align};\"><div style=\"background:#0f172a;border-radius:8px;padding:40px;text-align:center;color:white;font-family:sans-serif;\"><div style=\"font-size:48px;opacity:0.8;\">▶</div><div style=\"font-size:12px;margin-top:8px;opacity:0.6;\">${url || 'Enter video URL'}</div></div></div>`;\n }\n return html`<div style=\"padding:${padding};text-align:${align};\"><div style=\"position:relative;display:inline-block;max-width:100%;cursor:pointer;\"><img src=${thumbnail} alt=\"Video thumbnail\" style=\"display:block;max-width:100%;border-radius:4px;\" /><div style=\"position:absolute;inset:0;display:flex;align-items:center;justify-content:center;\"><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></div></div></div>`;\n },\n renderHtml(values: ContentValues, ctx: ExportRenderContext): string {\n const padding = str(values, 'containerPadding', '10px');\n const url = str(values, 'url', '#');\n const thumbnail = str(values, 'thumbnailUrl') || getYouTubeThumbnail(url) || '';\n const alt = str(values, 'alt', 'Video');\n const align = str(values, 'textAlign', 'center');\n\n const imgTag = thumbnail\n ? `<img src=\"${thumbnail}\" alt=\"${alt}\" width=\"${ctx.columnWidth}\" style=\"display:block;max-width:100%;width:${ctx.columnWidth}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 return emailTableCell(`<a href=\"${url}\" target=\"_blank\" style=\"text-decoration:none;\">${imgTag}</a>`, { padding, align });\n },\n },\n};\n","/**\n * @module timer-tool\n *\n * Countdown timer display block.\n *\n * Email compatibility: Renders as a static styled block.\n * For live countdowns, integrate with a third-party countdown\n * image service (e.g. CountdownMail) in the `endDate` property.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.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: 'alignment' },\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: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\n },\n },\n defaultValues: {\n endDate: new Date(Date.now() + 7 * 86400000).toISOString().split('T')[0],\n expiredMessage: 'This offer has expired', textAlign: 'center',\n backgroundColor: '#1f2937', textColor: '#ffffff', fontSize: '32px', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const bg = str(values, 'backgroundColor', '#1f2937');\n const color = str(values, 'textColor', '#ffffff');\n const fontSize = str(values, 'fontSize', '32px');\n const align = str(values, 'textAlign', 'center');\n\n return html`<div style=\"padding:${padding};\"><div style=\"background:${bg};color:${color};font-size:${fontSize};text-align:${align};padding:20px;border-radius:4px;font-family:monospace;font-weight:bold;letter-spacing:4px;\">00 : 00 : 00 : 00<div style=\"font-size:11px;letter-spacing:8px;opacity:0.6;margin-top:4px;\">DAYS HRS MIN SEC</div></div></div>`;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const bg = str(values, 'backgroundColor', '#1f2937');\n const color = str(values, 'textColor', '#ffffff');\n const fontSize = str(values, 'fontSize', '32px');\n const align = str(values, 'textAlign', 'center');\n\n const inner = `<div style=\"background-color:${bg};color:${color};font-size:${fontSize};text-align:${align};padding:20px;border-radius:4px;font-family:'Courier New',monospace;font-weight:bold;letter-spacing:4px;\"><div>00 : 00 : 00 : 00</div><div style=\"font-size:11px;letter-spacing:8px;opacity:0.6;margin-top:4px;\">DAYS HRS MIN SEC</div></div>`;\n return emailTableCell(inner, { padding, align });\n },\n },\n};\n","/**\n * @module table-tool\n *\n * Data table with configurable header styling and borders.\n *\n * Email compatibility: Uses standard HTML `<table>` with inline styles.\n * All borders, padding, and colors are inline for cross-client support.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str, jsonParse } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\n\nconst DEFAULT_DATA = [\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: { tableData: { label: 'Table Data (JSON)', defaultValue: JSON.stringify(DEFAULT_DATA), widget: 'rich_text' } },\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: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\n },\n },\n defaultValues: {\n tableData: JSON.stringify(DEFAULT_DATA), headerBg: '#f3f4f6', headerColor: '#111827',\n borderColor: '#e5e7eb', cellPadding: '8px 12px', fontSize: '14px', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const hBg = str(values, 'headerBg', '#f3f4f6');\n const hColor = str(values, 'headerColor', '#111827');\n const bColor = str(values, 'borderColor', '#e5e7eb');\n const cPad = str(values, 'cellPadding', '8px 12px');\n const fSize = str(values, 'fontSize', '14px');\n const data = jsonParse<string[][]>(values.tableData, DEFAULT_DATA);\n\n return html`\n <div style=\"padding:${padding};overflow-x:auto;\">\n <table style=\"width:100%;border-collapse:collapse;font-size:${fSize};font-family:arial,sans-serif;\">\n <thead><tr>${data[0]?.map((c) => html`<th style=\"padding:${cPad};background:${hBg};color:${hColor};border:1px solid ${bColor};text-align:left;font-weight:600;\">${c}</th>`)}</tr></thead>\n <tbody>${data.slice(1).map((row) => html`<tr>${row.map((c) => html`<td style=\"padding:${cPad};border:1px solid ${bColor};\">${c}</td>`)}</tr>`)}</tbody>\n </table>\n </div>\n `;\n },\n renderHtml(values: ContentValues): string {\n const padding = str(values, 'containerPadding', '10px');\n const hBg = str(values, 'headerBg', '#f3f4f6');\n const hColor = str(values, 'headerColor', '#111827');\n const bColor = str(values, 'borderColor', '#e5e7eb');\n const cPad = str(values, 'cellPadding', '8px 12px');\n const fSize = str(values, 'fontSize', '14px');\n const data = jsonParse<string[][]>(values.tableData, DEFAULT_DATA);\n const font = 'font-family:arial,helvetica,sans-serif;';\n\n const hCells = (data[0] || []).map((c) => `<th style=\"padding:${cPad};background-color:${hBg};color:${hColor};border:1px solid ${bColor};text-align:left;font-weight:600;${font}font-size:${fSize};\">${c}</th>`).join('');\n const bRows = data.slice(1).map((row) => `<tr>${row.map((c) => `<td style=\"padding:${cPad};border:1px solid ${bColor};${font}font-size:${fSize};\">${c}</td>`).join('')}</tr>`).join('');\n const inner = `<table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" border=\"0\" style=\"border-collapse:collapse;\"><thead><tr>${hCells}</tr></thead><tbody>${bRows}</tbody></table>`;\n return emailTableCell(inner, { padding });\n },\n },\n};\n","/**\n * @module form-tool\n *\n * Input form with configurable fields and submit button.\n * Only available in \"web\" display mode (forms don't work in email).\n *\n * Email compatibility: N/A — this tool is for web/popup display mode only.\n */\n\nimport { html, TemplateResult } from 'lit';\nimport type { ContentValues } from '@emabuild/types';\nimport type { LitToolDefinition } from '../tool-registry.js';\nimport { str, jsonParse } from '../helpers/value-extractor.js';\nimport { emailTableCell } from '../helpers/email-html.js';\nimport type { FormField } from '../helpers/types.js';\n\nconst DEFAULT_FIELDS: FormField[] = [\n { label: 'Name', name: 'name', type: 'text', placeholder: 'Your name' },\n { label: 'Email', name: 'email', type: 'email', placeholder: 'your@email.com' },\n];\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(DEFAULT_FIELDS), 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: { containerPadding: { label: 'Padding', defaultValue: '10px', widget: 'padding' } },\n },\n },\n defaultValues: {\n actionUrl: '#', method: 'POST', submitText: 'Submit',\n fields: JSON.stringify(DEFAULT_FIELDS), buttonBg: '#3b82f6',\n buttonColor: '#ffffff', containerPadding: '10px',\n },\n renderer: {\n renderEditor(values: ContentValues): TemplateResult {\n const padding = str(values, 'containerPadding', '10px');\n const submitText = str(values, 'submitText', 'Submit');\n const btnBg = str(values, 'buttonBg', '#3b82f6');\n const btnColor = str(values, 'buttonColor', '#ffffff');\n const fields = jsonParse<FormField[]>(values.fields, DEFAULT_FIELDS);\n\n return html`\n <div style=\"padding:${padding};font-family:arial,sans-serif;\">\n ${fields.map((f) => 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:${btnBg};color:${btnColor};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 = str(values, 'containerPadding', '10px');\n const actionUrl = str(values, 'actionUrl', '#');\n const method = str(values, 'method', 'POST');\n const submitText = str(values, 'submitText', 'Submit');\n const btnBg = str(values, 'buttonBg', '#3b82f6');\n const btnColor = str(values, 'buttonColor', '#ffffff');\n const fields = jsonParse<FormField[]>(values.fields, DEFAULT_FIELDS);\n const font = 'font-family:arial,helvetica,sans-serif;';\n\n const fieldsHtml = fields.map((f) =>\n `<div style=\"margin-bottom:12px;\"><label style=\"display:block;font-size:13px;color:#374151;margin-bottom:4px;font-weight:500;${font}\">${f.label}</label><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}\" /></div>`\n ).join('');\n\n const inner = `<form action=\"${actionUrl}\" method=\"${method}\">${fieldsHtml}<button type=\"submit\" style=\"background-color:${btnBg};color:${btnColor};border:none;padding:10px 24px;border-radius:4px;font-size:14px;font-weight:600;cursor:pointer;${font}\">${submitText}</button></form>`;\n return emailTableCell(inner, { padding });\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 EmailDesign,\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 this.setAttribute('tabindex', '0');\n this.addEventListener('keydown', this._handleKeydown);\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 private _handleKeydown = (e: KeyboardEvent) => {\n const mod = e.metaKey || e.ctrlKey;\n\n // Don't capture if user is typing in an input/textarea\n const tag = (e.target as HTMLElement)?.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return;\n\n if (mod && e.key === 'z' && !e.shiftKey) {\n e.preventDefault();\n this.store.undo();\n } else if (mod && (e.key === 'y' || (e.key === 'z' && e.shiftKey))) {\n e.preventDefault();\n this.store.redo();\n } else if ((e.key === 'Delete' || e.key === 'Backspace') && this.store.selectedId) {\n e.preventDefault();\n this.store.removeContent(this.store.selectedId);\n } else if (e.key === 'Escape') {\n this.store.select(null);\n }\n };\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.dragManager?.detach();\n this.unsubscribe?.();\n this.store.events.removeAllListeners();\n this.removeEventListener('keydown', this._handleKeydown);\n }\n\n // ----------------------------------------------------------\n // Public API — public API\n // ----------------------------------------------------------\n\n loadDesign(design: EmailDesign): void {\n this.store.loadDesign(design);\n }\n\n saveDesign(callback: (design: EmailDesign) => 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":["lookup.getRowIndex","lookup.findRow","lookup.findColumn","lookup.findContent","lookup.findParentColumn","lookup.findParentRow","dist"],"mappings":"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"}
|
package/dist/mail-editor.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { LitElement } from 'lit';
|
|
2
|
-
import {
|
|
2
|
+
import { EmailDesign, MailEditorConfig, ExportResult, ExportOptions, PropertyEditorDefinition, CustomTabDefinition } from '@emabuild/types';
|
|
3
3
|
import { LitToolDefinition } from './tools/tool-registry.js';
|
|
4
4
|
export declare class MailEditorElement extends LitElement {
|
|
5
5
|
static styles: import('lit').CSSResult;
|
|
@@ -13,8 +13,8 @@ export declare class MailEditorElement extends LitElement {
|
|
|
13
13
|
firstUpdated(): void;
|
|
14
14
|
private _handleKeydown;
|
|
15
15
|
disconnectedCallback(): void;
|
|
16
|
-
loadDesign(design:
|
|
17
|
-
saveDesign(callback: (design:
|
|
16
|
+
loadDesign(design: EmailDesign): void;
|
|
17
|
+
saveDesign(callback: (design: EmailDesign) => void): void;
|
|
18
18
|
exportHtml(callback: (result: ExportResult) => void, options?: ExportOptions): void;
|
|
19
19
|
exportHtmlAsync(options?: ExportOptions): Promise<ExportResult>;
|
|
20
20
|
registerTool(definition: LitToolDefinition): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mail-editor.d.ts","sourceRoot":"","sources":["../src/mail-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"mail-editor.d.ts","sourceRoot":"","sources":["../src/mail-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,aAAa,EAEb,wBAAwB,EACxB,mBAAmB,EAIpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAUhF,OAAO,2BAA2B,CAAC;AACnC,OAAO,6BAA6B,CAAC;AACrC,OAAO,gCAAgC,CAAC;AAExC,qBACa,iBAAkB,SAAQ,UAAU;IAC/C,MAAM,CAAC,MAAM,0BAaX;IAE0B,OAAO,EAAE,gBAAgB,CAAM;IAE3D,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,WAAW,CAA6B;IAEhD,iBAAiB;IAQjB,YAAY;IAoBZ,OAAO,CAAC,cAAc,CAmBpB;IAEF,oBAAoB;IAYpB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAIrC,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IAIzD,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;IAY7E,eAAe,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAIrE,YAAY,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAKjD,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,IAAI;IAI9E,WAAW,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAI5C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIxD,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI;IAIpC,IAAI,IAAI,IAAI;IAIZ,IAAI,IAAI,IAAI;IAIZ,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAQpD,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,YAAY;IAMpB,MAAM;CAgBP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,iBAAiB,CAAC;KAClC;CACF"}
|
package/dist/mail-editor.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EmailDesign, DesignRow, DesignContent } from '@emabuild/types';
|
|
2
2
|
import { CounterManager } from '../utils/id-generator.js';
|
|
3
|
-
/** Create a blank
|
|
4
|
-
export declare function createEmptyDesign():
|
|
3
|
+
/** Create a blank design */
|
|
4
|
+
export declare function createEmptyDesign(): EmailDesign;
|
|
5
5
|
/** Create a new row with the given column proportions (e.g. [1,1] for 50/50) */
|
|
6
6
|
export declare function createRow(cm: CounterManager, cellProportions: number[]): DesignRow;
|
|
7
7
|
/** Create a new content block for the given tool type */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-factory.d.ts","sourceRoot":"","sources":["../../src/state/design-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"design-factory.d.ts","sourceRoot":"","sources":["../../src/state/design-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,4BAA4B;AAC5B,wBAAgB,iBAAiB,IAAI,WAAW,CA4C/C;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,SAAS,CAmClF;AAED,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,aAAa,CAiBnH"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EmailDesign, DesignRow, DesignColumn, DesignContent } from '@emabuild/types';
|
|
2
2
|
/** Find a row by ID */
|
|
3
|
-
export declare function findRow(design:
|
|
3
|
+
export declare function findRow(design: EmailDesign, rowId: string): DesignRow | undefined;
|
|
4
4
|
/** Find a column by ID across all rows */
|
|
5
|
-
export declare function findColumn(design:
|
|
5
|
+
export declare function findColumn(design: EmailDesign, columnId: string): DesignColumn | undefined;
|
|
6
6
|
/** Find a content block by ID across all rows and columns */
|
|
7
|
-
export declare function findContent(design:
|
|
7
|
+
export declare function findContent(design: EmailDesign, contentId: string): DesignContent | undefined;
|
|
8
8
|
/** Find the column that contains a given content block */
|
|
9
|
-
export declare function findParentColumn(design:
|
|
9
|
+
export declare function findParentColumn(design: EmailDesign, contentId: string): DesignColumn | undefined;
|
|
10
10
|
/** Find the row that contains a given column */
|
|
11
|
-
export declare function findParentRow(design:
|
|
11
|
+
export declare function findParentRow(design: EmailDesign, columnId: string): DesignRow | undefined;
|
|
12
12
|
/** Get the index of a row within the design */
|
|
13
|
-
export declare function getRowIndex(design:
|
|
13
|
+
export declare function getRowIndex(design: EmailDesign, rowId: string): number;
|
|
14
14
|
//# sourceMappingURL=design-lookup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-lookup.d.ts","sourceRoot":"","sources":["../../src/state/design-lookup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"design-lookup.d.ts","sourceRoot":"","sources":["../../src/state/design-lookup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE3F,uBAAuB;AACvB,wBAAgB,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAEjF;AAED,0CAA0C;AAC1C,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAM1F;AAED,6DAA6D;AAC7D,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAQ7F;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAOjG;AAED,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAK1F;AAED,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtE"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EmailDesign, DesignBody, DesignRow, DesignColumn, DesignContent, BodyValues, RowValues, ColumnValues, ContentValues } from '@emabuild/types';
|
|
2
2
|
import { EventEmitter } from '../utils/event-emitter.js';
|
|
3
3
|
export type StoreSubscriber = () => void;
|
|
4
4
|
export declare class EditorStore {
|
|
@@ -17,7 +17,7 @@ export declare class EditorStore {
|
|
|
17
17
|
subscribe(fn: StoreSubscriber): () => void;
|
|
18
18
|
private notify;
|
|
19
19
|
/** Get the full design document */
|
|
20
|
-
getDesign():
|
|
20
|
+
getDesign(): EmailDesign;
|
|
21
21
|
/** Get the design body */
|
|
22
22
|
getBody(): DesignBody;
|
|
23
23
|
/** Get all rows */
|
|
@@ -31,7 +31,7 @@ export declare class EditorStore {
|
|
|
31
31
|
get canUndo(): boolean;
|
|
32
32
|
get canRedo(): boolean;
|
|
33
33
|
/** Load a design document, resetting history and selection */
|
|
34
|
-
loadDesign(design:
|
|
34
|
+
loadDesign(design: EmailDesign): void;
|
|
35
35
|
undo(): void;
|
|
36
36
|
redo(): void;
|
|
37
37
|
select(id: string | null): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor-store.d.ts","sourceRoot":"","sources":["../../src/state/editor-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"editor-store.d.ts","sourceRoot":"","sources":["../../src/state/editor-store.ts"],"names":[],"mappings":"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"}
|