@emabuild/core 0.0.8 → 0.0.9

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.
Files changed (25) hide show
  1. package/dist/{form-tool-C9ccGMTE.js → form-tool-CxJstLJz.js} +2 -2
  2. package/dist/{form-tool-C9ccGMTE.js.map → form-tool-CxJstLJz.js.map} +1 -1
  3. package/dist/{html-tool-Dx0bJnRa.js → html-tool-Cqvglh05.js} +2 -2
  4. package/dist/{html-tool-Dx0bJnRa.js.map → html-tool-Cqvglh05.js.map} +1 -1
  5. package/dist/{mail-editor-D3QbvBKs.js → index-DV_tofKb.js} +1281 -221
  6. package/dist/index-DV_tofKb.js.map +1 -0
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +5 -4
  10. package/dist/{menu-tool-D34uGd81.js → menu-tool-ACBHeTTN.js} +2 -2
  11. package/dist/{menu-tool-D34uGd81.js.map → menu-tool-ACBHeTTN.js.map} +1 -1
  12. package/dist/register-elements.d.ts +6 -0
  13. package/dist/register-elements.d.ts.map +1 -0
  14. package/dist/{social-tool-_2fRc5-k.js → social-tool-MqaqWdRm.js} +2 -2
  15. package/dist/{social-tool-_2fRc5-k.js.map → social-tool-MqaqWdRm.js.map} +1 -1
  16. package/dist/{table-tool-B_MVWfF5.js → table-tool-AnVvJ0rV.js} +2 -2
  17. package/dist/{table-tool-B_MVWfF5.js.map → table-tool-AnVvJ0rV.js.map} +1 -1
  18. package/dist/{timer-tool-BUl5TiH0.js → timer-tool-BxrGmF-W.js} +2 -2
  19. package/dist/{timer-tool-BUl5TiH0.js.map → timer-tool-BxrGmF-W.js.map} +1 -1
  20. package/dist/{video-tool-HOA8TCla.js → video-tool-8g1_UVbn.js} +2 -2
  21. package/dist/{video-tool-HOA8TCla.js.map → video-tool-8g1_UVbn.js.map} +1 -1
  22. package/package.json +3 -7
  23. package/dist/mail-editor-D3QbvBKs.js.map +0 -1
  24. package/dist/mail-editor.js +0 -7
  25. package/dist/mail-editor.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DV_tofKb.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/utils/store-controller.ts","../src/canvas/content-renderer.ts","../src/canvas/column-renderer.ts","../src/canvas/row-renderer.ts","../src/canvas/editor-canvas.ts","../src/sidebar/body-settings.ts","../src/sidebar/editor-sidebar.ts","../src/properties/widgets/color-picker-widget.ts","../src/properties/widgets/dropdown-widget.ts","../src/properties/widgets/alignment-widget.ts","../src/properties/widgets/padding-widget.ts","../src/properties/widgets/toggle-widget.ts","../src/properties/widgets/text-input-widget.ts","../src/properties/widgets/textarea-widget.ts","../src/properties/property-panel.ts","../src/mail-editor.ts","../src/register-elements.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;\">&nbsp;</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}${\"&zwnj;&nbsp;\".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;\">&nbsp;</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","/**\n * @module StoreController\n *\n * Lit reactive controller that subscribes to specific store channels.\n * Replaces the blanket StoreSubscriber mixin which re-rendered on ALL changes.\n *\n * @example\n * ```ts\n * class MyComponent extends LitElement {\n * private storeCtrl = new StoreController(this, ['design']);\n *\n * set store(s: EditorStore) { this.storeCtrl.setStore(s); }\n * get store() { return this.storeCtrl.store!; }\n * }\n * ```\n */\n\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport type { EditorStore, StoreChannel } from '../state/editor-store.js';\n\nexport class StoreController implements ReactiveController {\n private host: ReactiveControllerHost;\n private channels: StoreChannel[];\n private unsub?: () => void;\n store: EditorStore | null = null;\n\n /**\n * @param host - The Lit component that owns this controller\n * @param channels - Which store channels to subscribe to\n */\n constructor(host: ReactiveControllerHost, channels: StoreChannel[]) {\n this.host = host;\n this.channels = channels;\n host.addController(this);\n }\n\n /** Set or change the store reference. Re-subscribes automatically. */\n setStore(store: EditorStore): void {\n if (this.store === store) return;\n this.unsub?.();\n this.store = store;\n this.subscribe();\n }\n\n hostConnected(): void {\n this.subscribe();\n }\n\n hostDisconnected(): void {\n this.unsub?.();\n this.unsub = undefined;\n }\n\n private subscribe(): void {\n if (!this.store) return;\n this.unsub = this.store.subscribeChannels(this.channels, () => {\n this.host.requestUpdate();\n });\n }\n}\n","/**\n * @module ContentRenderer\n * Renders a single content block with selection/hover UI and drag support.\n * Subscribes to: design, selection, hover\n *\n * Uses shouldUpdate() to skip re-renders when selection/hover changes\n * don't affect this specific content block.\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { DesignContent } from '@emabuild/types';\nimport type { EditorStore } from '../state/editor-store.js';\nimport type { ToolRegistry } from '../tools/tool-registry.js';\nimport { StoreController } from '../utils/store-controller.js';\nimport { dragState } from '../dnd/drag-state.js';\n\n@customElement('me-content-renderer')\nexport class ContentRenderer extends LitElement {\n static styles = css`\n :host {\n display: block; position: relative; cursor: pointer;\n transition: outline 0.15s ease, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease;\n }\n :host(.selected) { outline: 2px solid #3b82f6; outline-offset: -1px; }\n :host(.hovered:not(.selected)) { outline: 2px dashed #93c5fd; outline-offset: -1px; }\n :host(.just-dropped) {\n animation: dropIn 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n @keyframes dropIn {\n 0% { opacity: 0; transform: scale(0.92) translateY(-8px); }\n 100% { opacity: 1; transform: scale(1) translateY(0); }\n }\n .action-bar {\n display: none; position: absolute; top: -28px; right: 4px;\n background: #3b82f6; border-radius: 4px; padding: 2px; gap: 2px; z-index: 10;\n }\n :host(.selected) .action-bar { display: flex; }\n .action-btn {\n background: none; border: none; color: white; cursor: pointer;\n padding: 2px 6px; font-size: 12px; line-height: 1; border-radius: 2px;\n }\n .action-btn:hover { background: rgba(255,255,255,0.2); }\n .content-wrapper { position: relative; }\n `;\n\n private storeCtrl = new StoreController(this, ['design', 'selection', 'hover']);\n\n @property({ attribute: false }) content!: DesignContent;\n\n @property({ attribute: false })\n set store(s: EditorStore) { this.storeCtrl.setStore(s); }\n get store(): EditorStore { return this.storeCtrl.store!; }\n\n @property({ attribute: false }) toolRegistry!: ToolRegistry;\n\n private handleClick(e: Event) { e.stopPropagation(); this.store.select(this.content.id); }\n private handleMouseEnter() { this.store.hover(this.content.id); }\n private handleMouseLeave() { this.store.hover(null); }\n private handleDelete(e: Event) { e.stopPropagation(); this.store.removeContent(this.content.id); }\n private handleDuplicate(e: Event) { e.stopPropagation(); this.store.duplicateContent(this.content.id); }\n\n private _onDragStart = (e: DragEvent) => {\n e.dataTransfer!.setData('application/maileditor-content', this.content.id);\n e.dataTransfer!.effectAllowed = 'move';\n this.style.opacity = '0.4';\n dragState.startContentDrag(this.content.id);\n };\n\n private _onDragEnd = () => {\n this.style.opacity = '1';\n dragState.reset();\n };\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener('dragstart', this._onDragStart);\n this.addEventListener('dragend', this._onDragEnd);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('dragstart', this._onDragStart);\n this.removeEventListener('dragend', this._onDragEnd);\n }\n\n render() {\n if (!this.store) return html``;\n const isSelected = this.store.selectedId === this.content.id;\n const isHovered = this.store.hoveredId === this.content.id;\n\n this.classList.toggle('selected', isSelected);\n this.classList.toggle('hovered', isHovered);\n this.setAttribute('draggable', 'true');\n this.dataset.contentId = this.content.id;\n\n const tool = this.toolRegistry.get(this.content.type);\n\n // Lazy tool not loaded yet — trigger load and show placeholder\n if (!tool && this.toolRegistry.has(this.content.type)) {\n this.toolRegistry.ensureLoaded(this.content.type).then(() => this.requestUpdate());\n return html`<div style=\"padding:16px;text-align:center;color:#9ca3af;font-size:13px;font-family:sans-serif;\">Loading ${this.content.type}...</div>`;\n }\n\n const rendered = tool?.renderer.renderEditor(this.content.values, {\n isSelected, isHovered, columnWidth: 600, displayMode: 'email',\n });\n\n return html`\n <div class=\"action-bar\">\n <button class=\"action-btn\" @click=${this.handleDuplicate} title=\"Duplicate\">&#9851;</button>\n <button class=\"action-btn\" @click=${this.handleDelete} title=\"Delete\">&#10005;</button>\n </div>\n <div class=\"content-wrapper\" @click=${this.handleClick}\n @mouseenter=${this.handleMouseEnter} @mouseleave=${this.handleMouseLeave}>\n ${rendered ?? html`<div style=\"padding:10px;color:#999;font-style:italic;\">Unknown tool: ${this.content.type}</div>`}\n </div>\n `;\n }\n}\n","/** @module ColumnRenderer — Subscribes to: design */\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { DesignColumn } from '@emabuild/types';\nimport type { EditorStore } from '../state/editor-store.js';\nimport type { ToolRegistry } from '../tools/tool-registry.js';\nimport { StoreController } from '../utils/store-controller.js';\nimport './content-renderer.js';\n\n@customElement('me-column-renderer')\nexport class ColumnRenderer extends LitElement {\n static styles = css`\n :host {\n display: block;\n min-height: 40px;\n position: relative;\n }\n .empty-column {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 60px;\n border: 2px dashed #d1d5db;\n border-radius: 4px;\n color: #9ca3af;\n font-size: 13px;\n font-family: sans-serif;\n margin: 4px;\n }\n .drop-indicator {\n height: 3px;\n background: #3b82f6;\n border-radius: 2px;\n margin: 0 4px;\n opacity: 0;\n transition: opacity 0.15s ease;\n }\n .drop-indicator.active {\n opacity: 1;\n }\n `;\n\n private storeCtrl = new StoreController(this, ['design']);\n\n @property({ attribute: false }) column!: DesignColumn;\n\n @property({ attribute: false })\n set store(s: EditorStore) { this.storeCtrl.setStore(s); }\n get store(): EditorStore { return this.storeCtrl.store!; }\n\n @property({ attribute: false }) toolRegistry!: ToolRegistry;\n @property({ type: Number }) widthPercent = 100;\n\n render() {\n const padding = this.column.values.padding || '0px';\n const bgColor = this.column.values.backgroundColor || 'transparent';\n const contents = this.column.contents;\n\n this.dataset.columnId = this.column.id;\n this.style.width = `${this.widthPercent}%`;\n this.style.padding = padding;\n this.style.backgroundColor = bgColor;\n this.style.verticalAlign = 'top';\n this.style.boxSizing = 'border-box';\n\n if (contents.length === 0) {\n return html`\n <div class=\"empty-column\" data-column-id=${this.column.id}>\n Drag content here\n </div>\n `;\n }\n\n return html`\n ${contents.map(\n (content) => html`\n <me-content-renderer\n .content=${content}\n .store=${this.store}\n .toolRegistry=${this.toolRegistry}\n ></me-content-renderer>\n `,\n )}\n `;\n }\n}\n","/** @module RowRenderer — Subscribes to: design */\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { DesignRow } from '@emabuild/types';\nimport type { EditorStore } from '../state/editor-store.js';\nimport type { ToolRegistry } from '../tools/tool-registry.js';\nimport { StoreController } from '../utils/store-controller.js';\nimport './column-renderer.js';\n\n@customElement('me-row-renderer')\nexport class RowRenderer extends LitElement {\n static styles = css`\n :host {\n display: block;\n position: relative;\n }\n .row-wrapper {\n display: flex;\n flex-wrap: nowrap;\n position: relative;\n min-height: 30px;\n transition: box-shadow 0.15s ease;\n }\n :host(:hover) .row-wrapper {\n box-shadow: inset 0 0 0 1px #93c5fd;\n }\n .row-actions {\n display: none;\n position: absolute;\n right: -36px;\n top: 50%;\n transform: translateY(-50%);\n flex-direction: column;\n gap: 2px;\n z-index: 10;\n }\n :host(:hover) .row-actions {\n display: flex;\n }\n .row-action-btn {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #6b7280;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 12px;\n line-height: 1;\n transition: background 0.15s ease;\n padding: 0;\n }\n .row-action-btn:hover { background: #3b82f6; }\n .row-action-btn.danger:hover { background: #ef4444; }\n .row-action-btn svg {\n width: 14px;\n height: 14px;\n stroke: currentColor;\n fill: none;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `;\n\n private storeCtrl = new StoreController(this, ['design']);\n\n @property({ attribute: false }) row!: DesignRow;\n\n @property({ attribute: false })\n set store(s: EditorStore) { this.storeCtrl.setStore(s); }\n get store(): EditorStore { return this.storeCtrl.store!; }\n\n @property({ attribute: false }) toolRegistry!: ToolRegistry;\n\n private handleMoveUp(e: Event) {\n e.stopPropagation();\n const idx = this.store.getRowIndex(this.row.id);\n if (idx > 0) this.store.moveRow(idx, idx - 1);\n }\n\n private handleMoveDown(e: Event) {\n e.stopPropagation();\n const idx = this.store.getRowIndex(this.row.id);\n const total = this.store.getRows().length;\n if (idx < total - 1) this.store.moveRow(idx, idx + 1);\n }\n\n private handleDuplicate(e: Event) {\n e.stopPropagation();\n this.store.duplicateRow(this.row.id);\n }\n\n private handleDelete(e: Event) {\n e.stopPropagation();\n this.store.removeRow(this.row.id);\n }\n\n render() {\n const { row, store, toolRegistry } = this;\n const bgColor = row.values.backgroundColor || 'transparent';\n const colsBgColor = row.values.columnsBackgroundColor || 'transparent';\n const padding = row.values.padding || '0px';\n const totalCells = row.cells.reduce((a, b) => a + b, 0);\n\n this.setAttribute('draggable', 'true');\n this.dataset.rowId = row.id;\n\n return html`\n <div class=\"row-actions\">\n <button class=\"row-action-btn\" @click=${this.handleMoveUp} title=\"Move Up\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M12 19V5\"/><path d=\"m5 12 7-7 7 7\"/></svg>\n </button>\n <button class=\"row-action-btn\" @click=${this.handleMoveDown} title=\"Move Down\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M12 5v14\"/><path d=\"m19 12-7 7-7-7\"/></svg>\n </button>\n <button class=\"row-action-btn\" @click=${this.handleDuplicate} title=\"Duplicate Row\">\n <svg viewBox=\"0 0 24 24\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>\n </button>\n <button class=\"row-action-btn danger\" @click=${this.handleDelete} title=\"Delete Row\">\n <svg viewBox=\"0 0 24 24\"><path d=\"M3 6h18\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\"/><path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/></svg>\n </button>\n </div>\n <div\n class=\"row-wrapper\"\n style=\"background-color:${bgColor};padding:${padding};\"\n >\n ${row.columns.map((col, i) => {\n const widthPercent = (row.cells[i] / totalCells) * 100;\n return html`\n <me-column-renderer\n .column=${col}\n .store=${store}\n .toolRegistry=${toolRegistry}\n .widthPercent=${widthPercent}\n style=\"background-color:${colsBgColor};\"\n ></me-column-renderer>\n `;\n })}\n </div>\n `;\n }\n}\n","/**\n * @module EditorCanvas\n * Central canvas area that renders the email design rows.\n * Subscribes to: design, viewMode\n */\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { EditorStore } from '../state/editor-store.js';\nimport type { ToolRegistry } from '../tools/tool-registry.js';\nimport { StoreController } from '../utils/store-controller.js';\nimport './row-renderer.js';\n\n@customElement('me-editor-canvas')\nexport class EditorCanvas extends LitElement {\n static styles = css`\n :host {\n display: block;\n flex: 1;\n overflow-y: auto;\n background: #f3f4f6;\n padding: 20px;\n }\n .canvas-body {\n margin: 0 auto;\n background: #ffffff;\n box-shadow: 0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.06);\n min-height: 200px;\n position: relative;\n }\n .empty-canvas {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 300px;\n color: #9ca3af;\n font-family: sans-serif;\n font-size: 14px;\n gap: 8px;\n }\n .empty-icon {\n font-size: 40px;\n opacity: 0.4;\n }\n .view-toggle {\n display: flex;\n justify-content: center;\n margin-bottom: 12px;\n gap: 4px;\n }\n .view-btn {\n padding: 6px 16px;\n border: 1px solid #d1d5db;\n background: white;\n cursor: pointer;\n font-size: 13px;\n font-family: sans-serif;\n color: #374151;\n transition: all 0.15s ease;\n }\n .view-btn:first-child { border-radius: 6px 0 0 6px; }\n .view-btn:last-child { border-radius: 0 6px 6px 0; }\n .view-btn.active {\n background: #3b82f6;\n border-color: #3b82f6;\n color: white;\n }\n `;\n\n private storeCtrl = new StoreController(this, ['design', 'viewMode']);\n\n @property({ attribute: false })\n set store(s: EditorStore) { this.storeCtrl.setStore(s); }\n get store(): EditorStore { return this.storeCtrl.store!; }\n\n @property({ attribute: false }) toolRegistry!: ToolRegistry;\n\n private handleCanvasClick() {\n this.store.select(null);\n }\n\n private setViewMode(mode: 'desktop' | 'mobile') {\n this.store.setViewMode(mode);\n }\n\n render() {\n const rows = this.store.getRows();\n const bodyValues = this.store.getBodyValues();\n const contentWidth = bodyValues.contentWidth || '600px';\n const bgColor = bodyValues.backgroundColor || '#e7e7e7';\n const viewMode = this.store.viewMode;\n const canvasWidth = viewMode === 'mobile' ? '375px' : contentWidth;\n\n return html`\n <div class=\"view-toggle\">\n <button\n class=\"view-btn ${viewMode === 'desktop' ? 'active' : ''}\"\n @click=${() => this.setViewMode('desktop')}\n >Desktop</button>\n <button\n class=\"view-btn ${viewMode === 'mobile' ? 'active' : ''}\"\n @click=${() => this.setViewMode('mobile')}\n >Mobile</button>\n </div>\n\n <div\n class=\"canvas-body\"\n style=\"max-width:${canvasWidth};background-color:${bgColor};\"\n @click=${this.handleCanvasClick}\n >\n ${rows.length === 0\n ? html`\n <div class=\"empty-canvas\">\n <div class=\"empty-icon\">&#9776;</div>\n <div>Drag a content block here</div>\n </div>\n `\n : rows.map(\n (row) => html`\n <me-row-renderer\n .row=${row}\n .store=${this.store}\n .toolRegistry=${this.toolRegistry}\n ></me-row-renderer>\n `,\n )}\n </div>\n `;\n }\n}\n","/**\n * @module BodySettings\n *\n * Component for editing global body-level settings:\n * background color, content width, font family, text/link colors,\n * and preheader text. Rendered inside the sidebar \"Body\" tab.\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { EditorStore } from '../state/editor-store.js';\nimport { StoreController } from '../utils/store-controller.js';\n\n/** Email-safe font options matching common email client support */\nconst EMAIL_SAFE_FONTS = [\n { label: 'Arial', value: 'arial,helvetica,sans-serif' },\n { label: 'Helvetica', value: 'helvetica,sans-serif' },\n { label: 'Georgia', value: 'georgia,serif' },\n { label: 'Times New Roman', value: \"'times new roman',times,serif\" },\n { label: 'Trebuchet MS', value: 'trebuchet ms,helvetica,sans-serif' },\n { label: 'Verdana', value: 'verdana,geneva,sans-serif' },\n { label: 'Courier New', value: \"'courier new',courier,monospace\" },\n] as const;\n\n@customElement('me-body-settings')\nexport class BodySettings extends LitElement {\n static styles = css`\n :host { display: block; }\n .section-title {\n font-size: 11px; font-weight: 600; text-transform: uppercase;\n color: #9ca3af; letter-spacing: 0.05em; margin: 0 0 8px 0;\n }\n .field { margin-bottom: 12px; }\n .field-label { display: block; font-size: 12px; color: #6b7280; margin-bottom: 4px; }\n .input {\n width: 100%; padding: 5px 8px; border: 1px solid #d1d5db; border-radius: 4px;\n font-size: 12px; box-sizing: border-box;\n }\n .input:focus { outline: none; border-color: #3b82f6; }\n .color-row { display: flex; gap: 6px; align-items: center; }\n .color-swatch {\n width: 32px; height: 32px; border: 1px solid #d1d5db; border-radius: 4px;\n padding: 0; cursor: pointer;\n }\n .align-group { display: flex; gap: 2px; }\n .align-btn {\n flex: 1; padding: 5px; border: 1px solid #d1d5db; background: white;\n border-radius: 4px; cursor: pointer; font-size: 11px; color: #6b7280;\n }\n .align-btn.active { border-color: #3b82f6; background: #eff6ff; color: #3b82f6; }\n `;\n\n private storeCtrl = new StoreController(this, ['design']);\n\n @property({ attribute: false })\n set store(s: EditorStore) { this.storeCtrl.setStore(s); }\n get store(): EditorStore { return this.storeCtrl.store!; }\n\n private update_(key: string, value: unknown) {\n this.store.updateBodyValues({ [key]: value } as any);\n }\n\n private updateLinkStyle(key: string, value: unknown) {\n const current = this.store.getBodyValues().linkStyle;\n this.store.updateBodyValues({ linkStyle: { ...current, [key]: value } } as any);\n }\n\n private updateFontFamily(value: string) {\n const font = EMAIL_SAFE_FONTS.find((f) => f.value === value);\n this.store.updateBodyValues({ fontFamily: { label: font?.label || value, value } } as any);\n }\n\n render() {\n const v = this.store.getBodyValues();\n\n return html`\n ${this.renderColorField('Background Color', v.backgroundColor || '#e7e7e7', (c) => this.update_('backgroundColor', c))}\n\n <p class=\"section-title\" style=\"margin-top:16px;\">Content</p>\n <div class=\"field\">\n <label class=\"field-label\">Content Width (px)</label>\n <input class=\"input\" type=\"number\" .value=${parseInt(v.contentWidth || '600')} min=\"320\" max=\"960\" step=\"10\"\n @change=${(e: Event) => this.update_('contentWidth', (e.target as HTMLInputElement).value + 'px')} />\n </div>\n <div class=\"field\">\n <label class=\"field-label\">Content Align</label>\n <div class=\"align-group\">\n ${['left', 'center', 'right'].map((a) => html`\n <button class=\"align-btn ${v.contentAlign === a ? 'active' : ''}\"\n @click=${() => this.update_('contentAlign', a)}>${a}</button>\n `)}\n </div>\n </div>\n\n <p class=\"section-title\" style=\"margin-top:16px;\">Typography</p>\n <div class=\"field\">\n <label class=\"field-label\">Font Family</label>\n <select class=\"input\" @change=${(e: Event) => this.updateFontFamily((e.target as HTMLSelectElement).value)}>\n ${EMAIL_SAFE_FONTS.map((f) => html`<option value=${f.value} ?selected=${v.fontFamily?.value === f.value}>${f.label}</option>`)}\n </select>\n </div>\n ${this.renderColorField('Text Color', v.textColor || '#000000', (c) => this.update_('textColor', c))}\n\n <p class=\"section-title\" style=\"margin-top:16px;\">Links</p>\n ${this.renderColorField('Link Color', v.linkStyle?.linkColor || '#0000ee', (c) => this.updateLinkStyle('linkColor', c))}\n <div class=\"field\">\n <label style=\"display:flex;align-items:center;gap:8px;font-size:12px;color:#6b7280;cursor:pointer;\">\n <input type=\"checkbox\" .checked=${v.linkStyle?.linkUnderline ?? true}\n @change=${(e: Event) => this.updateLinkStyle('linkUnderline', (e.target as HTMLInputElement).checked)} />\n Underline Links\n </label>\n </div>\n\n <p class=\"section-title\" style=\"margin-top:16px;\">Email</p>\n <div class=\"field\">\n <label class=\"field-label\">Preheader Text</label>\n <textarea class=\"input\" .value=${v.preheaderText || ''} placeholder=\"Preview text shown in inbox...\"\n style=\"min-height:60px;resize:vertical;font-family:inherit;\"\n @change=${(e: Event) => this.update_('preheaderText', (e.target as HTMLTextAreaElement).value)}></textarea>\n </div>\n `;\n }\n\n /** Reusable color field (swatch + hex input) */\n private renderColorField(label: string, value: string, onChange: (v: string) => void) {\n return html`\n <div class=\"field\">\n <label class=\"field-label\">${label}</label>\n <div class=\"color-row\">\n <input class=\"color-swatch\" type=\"color\" .value=${value} @input=${(e: Event) => onChange((e.target as HTMLInputElement).value)} />\n <input class=\"input\" type=\"text\" .value=${value} style=\"flex:1;\" @change=${(e: Event) => onChange((e.target as HTMLInputElement).value)} />\n </div>\n </div>\n `;\n }\n}\n","/**\n * @module EditorSidebar\n *\n * Left-side panel with tabs for Content (tool palette + layouts),\n * Blocks (saved row blocks), and Body (global settings).\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport type { EditorStore } from '../state/editor-store.js';\nimport type { ToolRegistry, LitToolDefinition, LazyToolMeta } from '../tools/tool-registry.js';\nimport { StoreController } from '../utils/store-controller.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport './body-settings.js';\n\n@customElement('me-editor-sidebar')\nexport class EditorSidebar extends LitElement {\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n width: 280px;\n min-width: 280px;\n background: #ffffff;\n border-right: 1px solid #e5e7eb;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n overflow-y: auto;\n }\n .tabs {\n display: flex;\n border-bottom: 1px solid #e5e7eb;\n background: #f9fafb;\n }\n .tab {\n flex: 1;\n padding: 10px 8px;\n border: none;\n background: none;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: #6b7280;\n text-align: center;\n transition: all 0.15s ease;\n border-bottom: 2px solid transparent;\n }\n .tab:hover {\n color: #374151;\n background: #f3f4f6;\n }\n .tab.active {\n color: #3b82f6;\n border-bottom-color: #3b82f6;\n }\n .tab-content {\n padding: 12px;\n flex: 1;\n }\n .section-title {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n color: #9ca3af;\n letter-spacing: 0.05em;\n margin: 0 0 8px 0;\n }\n .tool-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n }\n .tool-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 12px 8px;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n cursor: grab;\n background: white;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n font-size: 12px;\n color: #374151;\n }\n .tool-item:hover {\n border-color: #3b82f6;\n background: #eff6ff;\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.15);\n }\n .tool-item:hover .tool-icon {\n transform: scale(1.15);\n }\n .tool-item:active {\n transform: translateY(0px);\n box-shadow: 0 1px 4px rgba(59, 130, 246, 0.1);\n }\n .tool-item:active {\n cursor: grabbing;\n }\n .tool-icon {\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n justify-content: center;\n color: #6b7280;\n }\n .tool-icon svg {\n width: 20px;\n height: 20px;\n }\n .layout-grid {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 8px;\n margin-top: 16px;\n }\n .layout-item {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 2px;\n padding: 10px 4px;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n cursor: pointer;\n background: white;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .layout-item:hover {\n border-color: #3b82f6;\n background: #eff6ff;\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.15);\n }\n .layout-item:hover .layout-col {\n background: #93c5fd;\n }\n .layout-item:active {\n transform: translateY(0px);\n }\n .layout-col {\n height: 20px;\n background: #d1d5db;\n border-radius: 2px;\n transition: background 0.2s ease;\n }\n `;\n\n private storeCtrl = new StoreController(this, ['activeTab']);\n\n @property({ attribute: false })\n set store(s: EditorStore) { this.storeCtrl.setStore(s); }\n get store(): EditorStore { return this.storeCtrl.store!; }\n\n @property({ attribute: false }) toolRegistry!: ToolRegistry;\n\n private handleDragStart(e: DragEvent, toolName: string) {\n e.dataTransfer!.setData('application/maileditor-tool', toolName);\n e.dataTransfer!.effectAllowed = 'copy';\n }\n\n private handleLayoutDragStart(e: DragEvent, cells: number[]) {\n e.dataTransfer!.setData('application/maileditor-layout', JSON.stringify(cells));\n e.dataTransfer!.effectAllowed = 'copy';\n }\n\n private addRowWithLayout(cells: number[]) {\n const row = this.store.createRow(cells);\n this.store.addRow(row);\n }\n\n render() {\n const activeTab = this.store.activeTab;\n const tools = this.toolRegistry.getAllMeta();\n\n return html`\n <div class=\"tabs\">\n <button class=\"tab ${activeTab === 'content' ? 'active' : ''}\" @click=${() => this.store.setActiveTab('content')}>Content</button>\n <button class=\"tab ${activeTab === 'blocks' ? 'active' : ''}\" @click=${() => this.store.setActiveTab('blocks')}>Blocks</button>\n <button class=\"tab ${activeTab === 'body' ? 'active' : ''}\" @click=${() => this.store.setActiveTab('body')}>Body</button>\n </div>\n\n <div class=\"tab-content\">\n ${activeTab === 'content' ? this.renderContentTab(tools) : ''}\n ${activeTab === 'blocks' ? this.renderBlocksTab() : ''}\n ${activeTab === 'body' ? this.renderBodyTab() : ''}\n </div>\n `;\n }\n\n private renderContentTab(tools: LazyToolMeta[]) {\n return html`\n <p class=\"section-title\">Content</p>\n <div class=\"tool-grid\">\n ${tools.map(\n (tool) => html`\n <div\n class=\"tool-item\"\n draggable=\"true\"\n @dragstart=${(e: DragEvent) => this.handleDragStart(e, tool.name)}\n >\n <div class=\"tool-icon\">${unsafeHTML(tool.icon)}</div>\n <span>${tool.label}</span>\n </div>\n `,\n )}\n </div>\n\n <p class=\"section-title\" style=\"margin-top:20px;\">Layout</p>\n <div class=\"layout-grid\">\n ${this.renderLayoutOption([1], '100%')}\n ${this.renderLayoutOption([1, 1], '50/50')}\n ${this.renderLayoutOption([1, 1, 1], '33/33/33')}\n ${this.renderLayoutOption([2, 1], '66/33')}\n ${this.renderLayoutOption([1, 2], '33/66')}\n ${this.renderLayoutOption([1, 1, 1, 1], '25x4')}\n </div>\n `;\n }\n\n private renderLayoutOption(cells: number[], _label: string) {\n const total = cells.reduce((a, b) => a + b, 0);\n return html`\n <div\n class=\"layout-item\"\n draggable=\"true\"\n @click=${() => this.addRowWithLayout(cells)}\n @dragstart=${(e: DragEvent) => this.handleLayoutDragStart(e, cells)}\n title=${_label}\n >\n ${cells.map(\n (c) => html`<div class=\"layout-col\" style=\"width:${(c / total) * 100}%;\"></div>`,\n )}\n </div>\n `;\n }\n\n private renderBlocksTab() {\n return html`\n <p style=\"color:#9ca3af;font-size:13px;text-align:center;margin-top:40px;\">\n No saved blocks yet.<br/>Select a row in the editor and save it as a block.\n </p>\n `;\n }\n\n private renderBodyTab() {\n return html`<me-body-settings .store=${this.store}></me-body-settings>`;\n }\n}\n","/**\n * @module color-picker-widget\n * Color swatch + hex text input widget for property editing.\n */\nimport { html, TemplateResult } from 'lit';\n\n/** Render a color picker with swatch and hex input */\nexport function renderColorPicker(value: string, onChange: (v: string) => void, label: string): TemplateResult {\n const safeValue = value && /^#[0-9a-fA-F]{3,8}$/.test(value) ? value : '#000000';\n return html`\n <div class=\"prop-row\">\n <label class=\"prop-label\">${label}</label>\n <div class=\"prop-color\">\n <input class=\"color-swatch\" type=\"color\" .value=${safeValue}\n @input=${(e: Event) => onChange((e.target as HTMLInputElement).value)} />\n <input class=\"prop-input\" type=\"text\" .value=${value ?? ''} style=\"flex:1;\"\n @change=${(e: Event) => onChange((e.target as HTMLInputElement).value)} />\n </div>\n </div>\n `;\n}\n","/**\n * @module dropdown-widget\n * Native `<select>` dropdown for predefined option lists.\n */\nimport { html, TemplateResult } from 'lit';\n\ninterface DropdownOption { label: string; value: string; }\n\n/** Render a dropdown select widget */\nexport function renderDropdown(value: string, onChange: (v: string) => void, label: string, params?: Record<string, unknown>): TemplateResult {\n const options = (params?.options as DropdownOption[]) || [];\n return html`\n <div class=\"prop-row\">\n <label class=\"prop-label\">${label}</label>\n <select class=\"prop-input\" @change=${(e: Event) => onChange((e.target as HTMLSelectElement).value)}>\n ${options.map((opt) => html`<option value=${opt.value} ?selected=${value === opt.value}>${opt.label}</option>`)}\n </select>\n </div>\n `;\n}\n","/**\n * @module alignment-widget\n * Visual left/center/right alignment picker.\n */\nimport { html, TemplateResult } from 'lit';\n\n/** Render an alignment picker with 3 buttons */\nexport function renderAlignment(value: string, onChange: (v: string) => void, label: string): TemplateResult {\n return html`\n <div class=\"prop-row\">\n <label class=\"prop-label\">${label}</label>\n <div style=\"display:flex;gap:2px;\">\n ${['left', 'center', 'right'].map((opt) => html`\n <button\n style=\"flex:1;padding:6px;border:1px solid ${value === opt ? '#3b82f6' : '#d1d5db'};background:${value === opt ? '#eff6ff' : 'white'};border-radius:4px;cursor:pointer;font-size:11px;text-transform:capitalize;color:${value === opt ? '#3b82f6' : '#6b7280'};\"\n @click=${() => onChange(opt)}\n >${opt}</button>\n `)}\n </div>\n </div>\n `;\n}\n","/**\n * @module padding-widget\n * 4-side padding editor (top/right/bottom/left) with CSS shorthand support.\n *\n * Parses CSS shorthand formats:\n * - \"10px\" → all sides 10\n * - \"10px 20px\" → top/bottom 10, left/right 20\n * - \"10px 20px 30px 40px\" → top 10, right 20, bottom 30, left 40\n */\nimport { html, TemplateResult } from 'lit';\n\n/** Parse CSS padding shorthand into [top, right, bottom, left] */\nfunction parsePadding(value: string): [number, number, number, number] {\n const parts = (value || '0px').split(/\\s+/).map((p) => parseInt(p) || 0);\n const top = parts[0];\n const right = parts[1] ?? top;\n const bottom = parts[2] ?? top;\n const left = parts[3] ?? right;\n return [top, right, bottom, left];\n}\n\n/** Convert 4 values back to shortest CSS shorthand */\nfunction toPaddingShorthand(t: number, r: number, b: number, l: number): string {\n if (t === r && r === b && b === l) return `${t}px`;\n if (t === b && r === l) return `${t}px ${r}px`;\n return `${t}px ${r}px ${b}px ${l}px`;\n}\n\n/** Render a 4-side padding editor (T/R/B/L grid) */\nexport function renderPadding(value: string, onChange: (v: string) => void, label: string): TemplateResult {\n const [top, right, bottom, left] = parsePadding(value);\n\n const update = (t: number, r: number, b: number, l: number) => onChange(toPaddingShorthand(t, r, b, l));\n\n const sides = [\n { label: 'T', val: top, change: (v: number) => update(v, right, bottom, left) },\n { label: 'R', val: right, change: (v: number) => update(top, v, bottom, left) },\n { label: 'B', val: bottom, change: (v: number) => update(top, right, v, left) },\n { label: 'L', val: left, change: (v: number) => update(top, right, bottom, v) },\n ];\n\n return html`\n <div class=\"prop-row\">\n <label class=\"prop-label\">${label}</label>\n <div style=\"display:grid;grid-template-columns:1fr 1fr;gap:4px;\">\n ${sides.map((s) => html`\n <div style=\"display:flex;align-items:center;gap:4px;\">\n <span style=\"font-size:10px;color:#9ca3af;width:12px;\">${s.label}</span>\n <input type=\"number\" .value=${s.val} min=\"0\"\n @change=${(e: Event) => s.change(parseInt((e.target as HTMLInputElement).value) || 0)}\n style=\"flex:1;padding:4px 6px;border:1px solid #d1d5db;border-radius:3px;font-size:12px;width:50px;\" />\n </div>\n `)}\n </div>\n </div>\n `;\n}\n","/**\n * @module toggle-widget\n * Boolean toggle (checkbox with label).\n */\nimport { html, TemplateResult } from 'lit';\n\n/** Render a toggle checkbox */\nexport function renderToggle(value: boolean, onChange: (v: boolean) => void, label: string): TemplateResult {\n return html`\n <div class=\"prop-row\">\n <div class=\"prop-toggle\">\n <input type=\"checkbox\" .checked=${!!value}\n @change=${(e: Event) => onChange((e.target as HTMLInputElement).checked)} />\n <label class=\"prop-label\" style=\"margin:0;\">${label}</label>\n </div>\n </div>\n `;\n}\n","/**\n * @module text-input-widget\n * Single-line text input for string values.\n */\nimport { html, TemplateResult } from 'lit';\n\n/** Render a text input */\nexport function renderTextInput(value: string, onChange: (v: string) => void, label: string): TemplateResult {\n return html`\n <div class=\"prop-row\">\n <label class=\"prop-label\">${label}</label>\n <input class=\"prop-input\" type=\"text\" .value=${value ?? ''}\n @change=${(e: Event) => onChange((e.target as HTMLInputElement).value)} />\n </div>\n `;\n}\n","/**\n * @module textarea-widget\n * Multi-line text area for HTML/rich text content editing.\n */\nimport { html, TemplateResult } from 'lit';\n\n/** Render a textarea with monospace font for HTML editing */\nexport function renderTextArea(value: string, onChange: (v: string) => void, label: string): TemplateResult {\n return html`\n <div class=\"prop-row\">\n <label class=\"prop-label\">${label}</label>\n <textarea class=\"prop-input\"\n style=\"min-height:100px;font-family:'SF Mono',Menlo,monospace;font-size:12px;\"\n .value=${value ?? ''}\n @change=${(e: Event) => onChange((e.target as HTMLTextAreaElement).value)}\n ></textarea>\n </div>\n `;\n}\n","/**\n * @module PropertyPanel\n *\n * Right-side panel that renders editable properties for the selected\n * content block. Dynamically generates widgets based on the tool's\n * property definitions (options → groups → properties → widgets).\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { DesignContent, ToolPropertyGroup, ToolProperty } from '@emabuild/types';\nimport type { EditorStore } from '../state/editor-store.js';\nimport type { ToolRegistry } from '../tools/tool-registry.js';\nimport { StoreController } from '../utils/store-controller.js';\nimport {\n renderColorPicker, renderDropdown, renderAlignment,\n renderPadding, renderToggle, renderTextInput, renderTextArea,\n} from './widgets/index.js';\n\n@customElement('me-property-panel')\nexport class PropertyPanel extends LitElement {\n static styles = css`\n :host {\n display: flex; flex-direction: column; width: 300px; min-width: 300px;\n background: #fff; border-left: 1px solid #e5e7eb;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n overflow-y: auto;\n }\n .header { padding: 12px 16px; border-bottom: 1px solid #e5e7eb; background: #f9fafb; }\n .header-title { font-size: 14px; font-weight: 600; color: #111827; margin: 0; }\n .header-type { font-size: 11px; color: #9ca3af; text-transform: uppercase; margin: 2px 0 0 0; }\n .no-selection {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n flex: 1; color: #9ca3af; font-size: 13px; gap: 8px; padding: 40px 20px; text-align: center;\n }\n .group { border-bottom: 1px solid #f3f4f6; }\n .group-title {\n padding: 10px 16px; font-size: 12px; font-weight: 600; color: #6b7280;\n background: #f9fafb; cursor: pointer; user-select: none;\n display: flex; align-items: center; justify-content: space-between;\n }\n .group-title:hover { background: #f3f4f6; }\n .group-body { padding: 12px 16px; }\n .prop-row { margin-bottom: 12px; }\n .prop-label { display: block; font-size: 12px; color: #6b7280; margin-bottom: 4px; }\n .prop-input {\n width: 100%; padding: 6px 8px; border: 1px solid #d1d5db; border-radius: 4px;\n font-size: 13px; color: #111827; background: white; box-sizing: border-box;\n }\n .prop-input:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.15); }\n .prop-toggle { display: flex; align-items: center; gap: 8px; }\n .prop-color { display: flex; align-items: center; gap: 8px; }\n .color-swatch { width: 28px; height: 28px; border-radius: 4px; border: 1px solid #d1d5db; cursor: pointer; padding: 0; }\n textarea.prop-input { min-height: 80px; resize: vertical; font-family: monospace; }\n `;\n\n private storeCtrl = new StoreController(this, ['design', 'selection']);\n\n @property({ attribute: false })\n set store(s: EditorStore) { this.storeCtrl.setStore(s); }\n get store(): EditorStore { return this.storeCtrl.store!; }\n\n @property({ attribute: false }) toolRegistry!: ToolRegistry;\n\n /** Create a change handler bound to a specific content ID and property key */\n private onChange(contentId: string, key: string) {\n return (value: unknown) => {\n this.store.updateContentValues(contentId, { [key]: value } as any);\n };\n }\n\n render() {\n const selectedId = this.store.selectedId;\n if (!selectedId) {\n return html`<div class=\"no-selection\">Select an element to edit its properties</div>`;\n }\n\n const content = this.store.findContent(selectedId);\n if (!content) {\n return html`<div class=\"no-selection\">Select an element to edit its properties</div>`;\n }\n\n const tool = this.toolRegistry.get(content.type);\n if (!tool) {\n return html`<div class=\"no-selection\">Unknown tool: ${content.type}</div>`;\n }\n\n return html`\n <div class=\"header\">\n <p class=\"header-title\">${tool.label}</p>\n <p class=\"header-type\">${content.type}</p>\n </div>\n ${Object.entries(tool.options).map(([, group]) => this.renderGroup(content, group))}\n `;\n }\n\n private renderGroup(content: DesignContent, group: ToolPropertyGroup) {\n return html`\n <div class=\"group\">\n <div class=\"group-title\">${group.title}</div>\n <div class=\"group-body\">\n ${Object.entries(group.options).map(([key, prop]) =>\n this.renderWidget(content, key, prop),\n )}\n </div>\n </div>\n `;\n }\n\n /** Delegate to the correct widget function based on the property's widget type */\n private renderWidget(content: DesignContent, key: string, prop: ToolProperty) {\n const value = content.values[key] ?? prop.defaultValue;\n const change = this.onChange(content.id, key);\n\n switch (prop.widget) {\n case 'color_picker': return renderColorPicker(value as string, change as (v: string) => void, prop.label);\n case 'toggle': return renderToggle(value as boolean, change as (v: boolean) => void, prop.label);\n case 'rich_text': return renderTextArea(value as string, change as (v: string) => void, prop.label);\n case 'dropdown': return renderDropdown(value as string, change as (v: string) => void, prop.label, prop.widgetParams);\n case 'alignment': return renderAlignment(value as string, change as (v: string) => void, prop.label);\n case 'padding': return renderPadding(value as string, change as (v: string) => void, prop.label);\n case 'text':\n default: return renderTextInput(value as string, change as (v: string) => void, prop.label);\n }\n }\n}\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","/**\n * Explicitly registers all custom elements.\n * Uses a self-invoking pattern that bundlers cannot tree-shake.\n */\n\nimport { MailEditorElement } from './mail-editor.js';\nimport { EditorCanvas } from './canvas/editor-canvas.js';\nimport { RowRenderer } from './canvas/row-renderer.js';\nimport { ColumnRenderer } from './canvas/column-renderer.js';\nimport { ContentRenderer } from './canvas/content-renderer.js';\nimport { EditorSidebar } from './sidebar/editor-sidebar.js';\nimport { BodySettings } from './sidebar/body-settings.js';\nimport { PropertyPanel } from './properties/property-panel.js';\n\nfunction register(name: string, ctor: CustomElementConstructor): void {\n if (!customElements.get(name)) {\n customElements.define(name, ctor);\n }\n}\n\nregister('mail-editor', MailEditorElement);\nregister('me-editor-canvas', EditorCanvas);\nregister('me-row-renderer', RowRenderer);\nregister('me-column-renderer', ColumnRenderer);\nregister('me-content-renderer', ContentRenderer);\nregister('me-editor-sidebar', EditorSidebar);\nregister('me-body-settings', BodySettings);\nregister('me-property-panel', PropertyPanel);\n\n// Force bundlers to keep this module as a side-effect\n// by exporting a value that depends on the registrations\nexport const EMABUILD_REGISTERED = customElements.get('mail-editor') !== undefined;\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","o","w","u","h","l","p","g","x","f","$","_","StoreController","host","ContentRenderer","LitElement","s","isSelected","isHovered","rendered","css","__decorateClass","property","customElement","ColumnRenderer","contents","RowRenderer","total","colsBgColor","totalCells","widthPercent","EditorCanvas","bodyValues","contentWidth","viewMode","EMAIL_SAFE_FONTS","BodySettings","font","label","onChange","EditorSidebar","activeTab","tools","_label","renderColorPicker","safeValue","renderDropdown","params","opt","renderAlignment","parsePadding","parts","top","right","bottom","left","toPaddingShorthand","renderPadding","update","renderToggle","renderTextInput","renderTextArea","PropertyPanel","selectedId","change","MailEditorElement","mod","isEditing","detail","usedTypes","loadPromises","toolRenderers","renderDesignToHtml","resolve","definition","_name","_editor","_tab","_tags","idle","cb","register","ctor","EMABUILD_REGISTERED"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export { EMABUILD_REGISTERED } from './register-elements.js';
1
2
  export { MailEditorElement } from './mail-editor.js';
2
3
  export { EditorStore } from './state/editor-store.js';
3
4
  export { ToolRegistry } from './tools/tool-registry.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,YAAY,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,YAAY,GACb,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,YAAY,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,YAAY,GACb,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
- import { E as t, M as e, T as a } from "./mail-editor-D3QbvBKs.js";
1
+ import { E as a, a as r, M as t, T as e } from "./index-DV_tofKb.js";
2
2
  export {
3
- t as EditorStore,
4
- e as MailEditorElement,
5
- a as ToolRegistry
3
+ a as EMABUILD_REGISTERED,
4
+ r as EditorStore,
5
+ t as MailEditorElement,
6
+ e as ToolRegistry
6
7
  };
7
8
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  import { html as d } from "lit";
2
- import { s as e, j as x, e as m } from "./mail-editor-D3QbvBKs.js";
2
+ import { s as e, j as x, e as m } from "./index-DV_tofKb.js";
3
3
  const i = [
4
4
  { text: "Home", href: "#" },
5
5
  { text: "About", href: "#" },
@@ -58,4 +58,4 @@ const i = [
58
58
  export {
59
59
  h as menuTool
60
60
  };
61
- //# sourceMappingURL=menu-tool-D34uGd81.js.map
61
+ //# sourceMappingURL=menu-tool-ACBHeTTN.js.map