@emabuild/core 0.0.8 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canvas/content-renderer.d.ts.map +1 -1
- package/dist/canvas/row-renderer.d.ts.map +1 -1
- package/dist/{form-tool-C9ccGMTE.js → form-tool-DSXsWpjQ.js} +2 -2
- package/dist/{form-tool-C9ccGMTE.js.map → form-tool-DSXsWpjQ.js.map} +1 -1
- package/dist/{html-tool-Dx0bJnRa.js → html-tool-Be4HAhoj.js} +2 -2
- package/dist/{html-tool-Dx0bJnRa.js.map → html-tool-Be4HAhoj.js.map} +1 -1
- package/dist/index-CZt184D3.js +2695 -0
- package/dist/index-CZt184D3.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -4
- package/dist/{menu-tool-D34uGd81.js → menu-tool-HPxxeiRV.js} +2 -2
- package/dist/{menu-tool-D34uGd81.js.map → menu-tool-HPxxeiRV.js.map} +1 -1
- package/dist/register-elements.d.ts +6 -0
- package/dist/register-elements.d.ts.map +1 -0
- package/dist/{social-tool-_2fRc5-k.js → social-tool-bc46FNgk.js} +2 -2
- package/dist/{social-tool-_2fRc5-k.js.map → social-tool-bc46FNgk.js.map} +1 -1
- package/dist/{table-tool-B_MVWfF5.js → table-tool-LzRcAPFb.js} +2 -2
- package/dist/{table-tool-B_MVWfF5.js.map → table-tool-LzRcAPFb.js.map} +1 -1
- package/dist/{timer-tool-BUl5TiH0.js → timer-tool-GPhdsvRE.js} +2 -2
- package/dist/{timer-tool-BUl5TiH0.js.map → timer-tool-GPhdsvRE.js.map} +1 -1
- package/dist/tools/built-in/image-tool.d.ts.map +1 -1
- package/dist/tools/helpers/index.d.ts +1 -1
- package/dist/tools/helpers/index.d.ts.map +1 -1
- package/dist/tools/helpers/value-extractor.d.ts +35 -0
- package/dist/tools/helpers/value-extractor.d.ts.map +1 -1
- package/dist/{video-tool-HOA8TCla.js → video-tool-CPjCWbTX.js} +2 -2
- package/dist/{video-tool-HOA8TCla.js.map → video-tool-CPjCWbTX.js.map} +1 -1
- package/package.json +3 -7
- package/dist/mail-editor-D3QbvBKs.js +0 -1569
- package/dist/mail-editor-D3QbvBKs.js.map +0 -1
- package/dist/mail-editor.js +0 -7
- package/dist/mail-editor.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mail-editor-D3QbvBKs.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/tool-manifest.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\n/**\n * Notification channels for fine-grained reactivity.\n * Components subscribe only to the channels they care about,\n * avoiding unnecessary re-renders.\n *\n * - `design` — row/column/content mutations, body value changes, undo/redo, load\n * - `selection` — selected element changed\n * - `hover` — hovered element changed\n * - `viewMode` — desktop/mobile toggle\n * - `activeTab` — sidebar tab switch\n */\nexport type StoreChannel = 'design' | 'selection' | 'hover' | 'viewMode' | 'activeTab';\n\nexport class EditorStore {\n private design: EmailDesign;\n private history = new HistoryManager();\n private counterManager: CounterManager = createCounterManager();\n\n /** Legacy: subscribers that listen to ALL changes */\n private subscribers = new Set<StoreSubscriber>();\n /** Channel-based subscribers: only notified on specific changes */\n private channelSubscribers = new Map<StoreChannel, 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 (legacy). Returns an unsubscribe function. */\n subscribe(fn: StoreSubscriber): () => void {\n this.subscribers.add(fn);\n return () => this.subscribers.delete(fn);\n }\n\n /**\n * Subscribe to specific channels only. The callback is invoked only\n * when one of the listed channels fires. Returns an unsubscribe function.\n *\n * @example\n * ```ts\n * // Only re-render when the design changes, not on hover/selection\n * store.subscribeChannels(['design'], () => this.requestUpdate());\n * ```\n */\n subscribeChannels(channels: StoreChannel[], fn: StoreSubscriber): () => void {\n for (const ch of channels) {\n if (!this.channelSubscribers.has(ch)) {\n this.channelSubscribers.set(ch, new Set());\n }\n this.channelSubscribers.get(ch)!.add(fn);\n }\n return () => {\n for (const ch of channels) {\n this.channelSubscribers.get(ch)?.delete(fn);\n }\n };\n }\n\n /** Notify legacy (all) subscribers */\n private notify(): void {\n this.subscribers.forEach((fn) => fn());\n }\n\n /** Notify only subscribers of specific channels + legacy subscribers */\n private notifyChannels(...channels: StoreChannel[]): void {\n // Collect unique subscribers to avoid calling the same fn twice\n const toNotify = new Set<StoreSubscriber>();\n for (const fn of this.subscribers) toNotify.add(fn);\n for (const ch of channels) {\n const subs = this.channelSubscribers.get(ch);\n if (subs) for (const fn of subs) toNotify.add(fn);\n }\n toNotify.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.notifyChannels('design', 'selection');\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.notifyChannels('design');\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.notifyChannels('design');\n this.emitUpdate('content_updated');\n }\n\n // ── Selection / UI State ───────────────────────────────────\n\n select(id: string | null): void { this._selectedId = id; this.notifyChannels('selection'); }\n hover(id: string | null): void { this._hoveredId = id; this.notifyChannels('hover'); }\n setViewMode(mode: 'desktop' | 'mobile'): void { this._viewMode = mode; this.notifyChannels('viewMode'); }\n setActiveTab(tab: string): void { this._activeTab = tab; this.notifyChannels('activeTab'); }\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.notifyChannels('design');\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.notifyChannels('design');\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.notifyChannels('design');\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.notifyChannels('design');\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.notifyChannels('design');\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.notifyChannels('design');\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.notifyChannels('design');\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.notifyChannels('design');\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.notifyChannels('design');\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.notifyChannels('design');\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.notifyChannels('design');\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.notifyChannels('design');\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","/**\n * @module ToolRegistry\n *\n * Registry for built-in and custom tools. Supports both eager and lazy\n * registration. Lazy tools are loaded on first use (drag/render) to\n * reduce the initial bundle size.\n */\n\nimport type { TemplateResult } from 'lit';\nimport type { ToolDefinition, ToolPropertyGroup, ContentValues, EditorRenderContext, ExportRenderContext } from '@emabuild/types';\n\n/** Lit-specific tool definition (narrows TEditorResult to TemplateResult) */\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/** Lazy loader function that returns the tool definition */\nexport type LazyToolLoader = () => Promise<LitToolDefinition>;\n\n/** Minimal metadata for displaying a lazy tool in the sidebar before it's loaded */\nexport interface LazyToolMeta {\n name: string;\n label: string;\n icon: string;\n position?: number;\n}\n\nexport class ToolRegistry {\n private tools = new Map<string, LitToolDefinition>();\n private lazyLoaders = new Map<string, LazyToolLoader>();\n private lazyMeta = new Map<string, LazyToolMeta>();\n private loadingPromises = new Map<string, Promise<LitToolDefinition>>();\n\n /** Register a tool eagerly (available immediately) */\n register(tool: LitToolDefinition): void {\n this.tools.set(tool.name, tool);\n this.lazyLoaders.delete(tool.name);\n this.lazyMeta.delete(tool.name);\n }\n\n /**\n * Register a tool lazily. The tool's code is only loaded when first needed.\n * Provide metadata (name, label, icon) so the tool can appear in the sidebar.\n *\n * @param meta - Display metadata for the sidebar palette\n * @param loader - Async function that imports and returns the tool definition\n *\n * @example\n * ```ts\n * registry.registerLazy(\n * { name: 'timer', label: 'Timer', icon: '<svg>...</svg>', position: 11 },\n * () => import('./built-in/timer-tool.js').then(m => m.timerTool),\n * );\n * ```\n */\n registerLazy(meta: LazyToolMeta, loader: LazyToolLoader): void {\n if (this.tools.has(meta.name)) return; // already eagerly registered\n this.lazyMeta.set(meta.name, meta);\n this.lazyLoaders.set(meta.name, loader);\n }\n\n /** Get a tool by name. Returns undefined if not loaded yet (use ensureLoaded for lazy tools). */\n get(name: string): LitToolDefinition | undefined {\n return this.tools.get(name);\n }\n\n /** Check if a tool is registered (eager or lazy) */\n has(name: string): boolean {\n return this.tools.has(name) || this.lazyLoaders.has(name);\n }\n\n /** Check if a tool is fully loaded and ready to render */\n isLoaded(name: string): boolean {\n return this.tools.has(name);\n }\n\n /**\n * Ensure a lazy tool is loaded. Returns the tool definition.\n * If the tool is already loaded, returns it immediately.\n * If it's being loaded, returns the in-flight promise.\n */\n async ensureLoaded(name: string): Promise<LitToolDefinition | undefined> {\n if (this.tools.has(name)) return this.tools.get(name);\n\n if (this.loadingPromises.has(name)) return this.loadingPromises.get(name);\n\n const loader = this.lazyLoaders.get(name);\n if (!loader) return undefined;\n\n const promise = loader().then((tool) => {\n this.tools.set(name, tool);\n this.lazyLoaders.delete(name);\n this.lazyMeta.delete(name);\n this.loadingPromises.delete(name);\n return tool;\n });\n\n this.loadingPromises.set(name, promise);\n return promise;\n }\n\n /**\n * Get all tools for display in the sidebar palette.\n * Returns both loaded tools and lazy tool metadata, sorted by position.\n */\n getAll(): LitToolDefinition[] {\n return Array.from(this.tools.values()).sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n }\n\n /**\n * Get all tool names and display metadata (including lazy tools not yet loaded).\n * Used by the sidebar to show all available tools.\n */\n getAllMeta(): LazyToolMeta[] {\n const metas: LazyToolMeta[] = [];\n\n for (const tool of this.tools.values()) {\n metas.push({ name: tool.name, label: tool.label, icon: tool.icon, position: tool.position });\n }\n for (const meta of this.lazyMeta.values()) {\n metas.push(meta);\n }\n\n return metas.sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n }\n\n /** Get default values for a tool. Loads lazily if needed (sync — returns empty if not loaded). */\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 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 return defaults;\n }\n\n /** Get property groups for a tool */\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 // Capture drop target before reset clears it\n const drop = this.currentDrop;\n\n const layoutData = e.dataTransfer?.getData('application/maileditor-layout');\n if (layoutData) {\n this.handleLayoutDrop(JSON.parse(layoutData), drop);\n this.reset();\n return;\n }\n\n const toolName = e.dataTransfer?.getData('application/maileditor-tool');\n if (toolName) {\n this.handleToolDrop(toolName, drop);\n this.reset();\n return;\n }\n\n const contentId = e.dataTransfer?.getData('application/maileditor-content') || dragState.draggingContentId;\n if (contentId) {\n this.handleContentDrop(contentId, drop);\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[], drop: DropTarget | null = this.currentDrop): void {\n const row = this.store.createRow(cells);\n const rowIndex = drop?.type === 'row' ? drop.rowIndex : undefined;\n this.store.addRow(row, rowIndex);\n }\n\n private async handleToolDrop(toolName: string, drop: DropTarget | null): Promise<void> {\n // Ensure lazy tool is loaded before creating content\n await this.toolRegistry.ensureLoaded(toolName);\n\n if (drop?.type === 'content' && drop.columnId) {\n const defaults = this.toolRegistry.getDefaultValues(toolName);\n const content = this.store.createContent(toolName, defaults);\n this.store.addContent(drop.columnId, content, drop.contentIndex);\n this.store.select(content.id);\n } else {\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, drop: DropTarget | null): void {\n if (drop?.type === 'content' && drop.columnId) {\n this.store.moveContent(contentId, drop.columnId, drop.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 tool-manifest\n *\n * Defines which tools are loaded eagerly (in the initial bundle)\n * and which are loaded lazily (on first use).\n *\n * Eager tools: text, heading, paragraph, image, button, divider\n * — these are the most commonly used and should be available instantly.\n *\n * Lazy tools: html, social, menu, video, timer, table, form\n * — these are loaded on-demand when first dragged into the canvas.\n */\n\nimport type { LitToolDefinition, LazyToolMeta, LazyToolLoader } from '../tool-registry.js';\n\n// ── Eager imports (included in initial bundle) ───────────────\nimport { textTool } from './text-tool.js';\nimport { headingTool } from './heading-tool.js';\nimport { paragraphTool } from './paragraph-tool.js';\nimport { imageTool } from './image-tool.js';\nimport { buttonTool } from './button-tool.js';\nimport { dividerTool } from './divider-tool.js';\n\n/** Tools loaded eagerly in the initial bundle */\nexport const eagerTools: LitToolDefinition[] = [\n textTool,\n headingTool,\n paragraphTool,\n imageTool,\n buttonTool,\n dividerTool,\n];\n\n/** Tools loaded lazily on first use — metadata for sidebar display + loader */\nexport const lazyTools: Array<{ meta: LazyToolMeta; loader: LazyToolLoader }> = [\n {\n meta: { name: 'html', label: 'HTML', 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>', position: 6 },\n loader: () => import('./html-tool.js').then((m) => m.htmlTool),\n },\n {\n meta: { name: 'social', label: 'Social', 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>', position: 8 },\n loader: () => import('./social-tool.js').then((m) => m.socialTool),\n },\n {\n meta: { name: 'menu', label: 'Menu', 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>', position: 9 },\n loader: () => import('./menu-tool.js').then((m) => m.menuTool),\n },\n {\n meta: { name: 'video', label: 'Video', 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>', position: 10 },\n loader: () => import('./video-tool.js').then((m) => m.videoTool),\n },\n {\n meta: { name: 'timer', label: 'Timer', 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>', position: 11 },\n loader: () => import('./timer-tool.js').then((m) => m.timerTool),\n },\n {\n meta: { name: 'table', label: 'Table', 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>', position: 12 },\n loader: () => import('./table-tool.js').then((m) => m.tableTool),\n },\n {\n meta: { name: 'form', label: 'Form', 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>', position: 13 },\n loader: () => import('./form-tool.js').then((m) => m.formTool),\n },\n];\n","function k(t, a, n) {\n const e = n.backgroundColor || \"#e7e7e7\", d = n.contentWidth || \"600px\", i = n.fontFamily?.value || \"arial,helvetica,sans-serif\", s = n.textColor || \"#000000\", o = n.preheaderText || \"\", c = o ? `<div style=\"display:none;font-size:1px;color:${e};line-height:1px;max-height:0px;max-width:0px;opacity:0;overflow:hidden;\">${o}${\"‌ \".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: ${i} !important; }\n </style>\n <![endif]-->\n <!--[if !mso]><!-->\n <style type=\"text/css\">\n ${a}\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:${e};color:${s};\">\n ${c}\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:${e};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(d)}\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr><td><![endif]-->\n ${t}\n <!--[if (mso)|(IE)]></td></tr></table><![endif]-->\n </td>\n </tr>\n </tbody>\n </table>\n</body>\n</html>`;\n}\nfunction w(t, a, n) {\n const e = parseInt(a.contentWidth || \"600\"), d = t.values.backgroundColor || \"\", i = t.values.columnsBackgroundColor || \"\", s = t.values.padding || \"0px\", o = t.cells.reduce((u, h) => u + h, 0), c = d ? `background-color:${d};` : \"\", m = t.values.backgroundImage?.url ? `background-image:url('${t.values.backgroundImage.url}');background-repeat:${t.values.backgroundImage.repeat ? \"repeat\" : \"no-repeat\"};background-position:center top;background-size:${t.values.backgroundImage.cover ? \"cover\" : \"auto\"};` : \"\", r = t.columns.map((u, h) => {\n const b = Math.round(t.cells[h] / o * e);\n return y(u, b, i, a, n);\n }), l = t.columns.length > 1;\n let p;\n if (l) {\n const u = t.columns.map((h, b) => {\n const g = Math.round(t.cells[b] / o * e), v = y(h, g, i, a, n);\n return `<!--[if (mso)|(IE)]><td align=\"center\" width=\"${g}\" style=\"width:${g}px;padding:0px;border:none;\" valign=\"top\"><![endif]-->\n${v}\n<!--[if (mso)|(IE)]></td><![endif]-->`;\n });\n p = `<!--[if (mso)|(IE)]><table role=\"presentation\" width=\"${e}\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr>${u.join(`\n`)}</tr></table><![endif]-->\n\n<!--[if !mso]><!-->\n<div style=\"max-width:${e}px;margin:0 auto;\">\n${r.join(`\n`)}\n</div>\n<!--<![endif]-->`;\n } else\n p = r.join(`\n`);\n const x = t.values.hideDesktop ? \" u_hide_desktop\" : \"\", f = t.values.hideMobile ? \" u_hide_mobile\" : \"\";\n return `<div class=\"u_row${x}${f}\" style=\"padding:${s};${c}${m}\">\n <div style=\"margin:0 auto;min-width:320px;max-width:${e}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 ${p}\n </div>\n </div>\n</div>`;\n}\nfunction y(t, a, n, e, d) {\n const i = t.values.backgroundColor || n || \"\", s = t.values.padding || \"0px\", o = t.values.borderRadius || \"0px\", c = i ? `background-color:${i};` : \"\", m = t.contents.map((r) => {\n const l = d.get(r.type);\n if (!l) return `<!-- unknown tool: ${r.type} -->`;\n const p = {\n columnWidth: a,\n displayMode: \"email\",\n contentWidth: parseInt(e.contentWidth || \"600\"),\n bodyValues: e\n };\n return l(r.values, p);\n }).join(`\n`);\n return `<div class=\"u_column\" style=\"max-width:${a}px;min-width:${Math.min(a, 320)}px;display:table-cell;vertical-align:top;\">\n <div style=\"height:100%;width:100% !important;border-radius:${o};-webkit-border-radius:${o};${c}\">\n <div style=\"box-sizing:border-box;height:100%;padding:${s};border:none;border-radius:${o};-webkit-border-radius:${o};\">\n ${m || '<!--[if (!mso)&(!IE)]><!--><div style=\"height:0;min-height:1px;font-size:0;\"> </div><!--<![endif]-->'}\n </div>\n </div>\n</div>`;\n}\nfunction $(t) {\n return `\n@media only screen and (min-width: ${t + 20}px) {\n .u_row .u_column { display: table-cell; }\n}\n\n@media only screen and (max-width: ${t + 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: ${t + 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: ${t + 21}px) {\n .u_hide_desktop { display: none !important; }\n .u_hide_mobile { display: block !important; }\n}`;\n}\nfunction _(t, a, n) {\n const e = t.body.values, d = parseInt(e.contentWidth || \"600\"), i = t.body.rows.map((l) => w(l, e, a)).join(`\n`), s = $(d);\n let o = k(i, s, e);\n if (n?.mergeTags)\n for (const [l, p] of Object.entries(n.mergeTags))\n o = o.replaceAll(`{{${l}}}`, p);\n const c = o.match(/<body[^>]*>([\\s\\S]*)<\\/body>/i), m = o.match(/<style[^>]*>([\\s\\S]*?)<\\/style>/gi), r = [];\n return e.fontFamily?.url && r.push(e.fontFamily.url), {\n design: structuredClone(t),\n html: o,\n chunks: {\n body: c?.[1] ?? i,\n css: m?.map((l) => l.replace(/<\\/?style[^>]*>/gi, \"\")).join(`\n`) ?? s,\n fonts: r,\n js: \"\"\n }\n };\n}\nexport {\n $ as getResponsiveCss,\n _ as renderDesignToHtml,\n w as renderRow,\n k as 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 { eagerTools, lazyTools } from './tools/built-in/tool-manifest.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 flex: 1;\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 // 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 // Preload lazy tools during browser idle time\n this.preloadLazyTools();\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/select.\n // Use composedPath() to see through shadow DOM boundaries —\n // e.target may point to a shadow host, not the actual <input>.\n const path = e.composedPath();\n const isEditing = path.some((el) => {\n const tag = (el as HTMLElement)?.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n });\n if (isEditing && !mod) 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 && !isEditing) {\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 // Ensure all lazy tools used in the design are loaded before export\n const design = this.store.getDesign();\n const usedTypes = new Set<string>();\n for (const row of design.body.rows) {\n for (const col of row.columns) {\n for (const content of col.contents) {\n usedTypes.add(content.type);\n }\n }\n }\n\n const loadPromises = Array.from(usedTypes)\n .filter((type) => !this.toolRegistry.isLoaded(type))\n .map((type) => this.toolRegistry.ensureLoaded(type));\n\n if (loadPromises.length > 0) {\n Promise.all(loadPromises).then(() => this.doExport(design, callback, options));\n } else {\n this.doExport(design, callback, options);\n }\n }\n\n private doExport(design: EmailDesign, callback: (result: ExportResult) => void, options?: ExportOptions): void {\n const toolRenderers = new Map<string, (values: Record<string, unknown>, ctx: any) => string>();\n for (const tool of this.toolRegistry.getAll()) {\n toolRenderers.set(tool.name, (values, ctx) => tool.renderer.renderHtml(values as any, ctx));\n }\n callback(renderDesignToHtml(design, toolRenderers, options));\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 /**\n * Preload lazy tools during browser idle time.\n * Uses requestIdleCallback to avoid blocking the main thread.\n * Falls back to setTimeout(1000) for browsers without idle callback support.\n */\n private preloadLazyTools() {\n const idle = window.requestIdleCallback ?? ((cb: () => void) => setTimeout(cb, 1000));\n for (const { meta } of lazyTools) {\n idle(() => {\n this.toolRegistry.ensureLoaded(meta.name);\n });\n }\n }\n\n private registerBuiltInTools() {\n // Eager tools — loaded immediately (most commonly used)\n for (const tool of eagerTools) {\n this.toolRegistry.register(tool);\n }\n // Lazy tools — loaded on first use to reduce initial bundle\n for (const { meta, loader } of lazyTools) {\n this.toolRegistry.registerLazy(meta, loader);\n }\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":["createCounterManager","counters","c","key","prefix","current","EventEmitter","event","listener","payload","fn","e","HistoryManager","maxHistory","design","currentDesign","prev","next","createEmptyDesign","createRow","cm","cellProportions","rowNum","columns","colNum","createContent","type","values","counter","id","findRow","rowId","r","findColumn","columnId","row","col","findContent","contentId","content","findParentColumn","findParentRow","getRowIndex","EditorStore","channels","ch","toNotify","subs","mode","tab","index","rows","cloned","idx","lookup.getRowIndex","fromIndex","toIndex","lookup.findRow","cNum","patch","lookup.findColumn","lookup.findContent","targetColumnId","targetIndex","targetCol","lookup.findParentColumn","lookup.findParentRow","item","ToolRegistry","tool","meta","loader","name","promise","a","b","metas","defaults","group","prop","dragState","createDropIndicator","color","el","positionIndicator","indicator","container","items","insetX","containerRect","indicatorY","hideIndicator","walkShadowDom","root","callback","children","child","queryShadowAll","selector","results","DragManager","store","toolRegistry","types","isToolDrag","isLayoutDrag","isContentDrag","drop","layoutData","toolName","related","cells","rowIndex","clientY","canvas","bestDist","bestTarget","i","y","dist","clientX","colEl","colRect","contentEls","firstY","rect","nextRect","canvasBody","str","fallback","v","jsonParse","value","emailTableCell","options","padding","align","extraTdStyle","vmlRoundrectButton","text","href","bgColor","textColor","fontSize","fontWeight","borderRadius","radiusPx","arcsize","textTool","lineHeight","textContent","html","unsafeHTML","textAlign","bgStyle","inner","headingTool","letterSpacing","tag","paragraphTool","imageTool","src","alt","width","ctx","target","widthPx","brStyle","imgTag","buttonTool","bg","radius","btnPad","btnWidth","bw","bc","borderStyle","widthStyle","vml","vmlOpen","dividerTool","border","eagerTools","lazyTools","m","k","t","n","d","s","o","w","u","h","l","p","g","x","f","$","_","MailEditorElement","LitElement","mod","isEditing","detail","usedTypes","loadPromises","toolRenderers","renderDesignToHtml","resolve","definition","_name","_editor","_tab","_tags","idle","cb","css","__decorateClass","property","customElement"],"mappings":"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"}
|
package/dist/mail-editor.js
DELETED
package/dist/mail-editor.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mail-editor.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|