better-react-email-editor 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","Fragment$1","Popover","__defProp","__exportAll","target","name","all","no_symbols","cx","classes","BLOCK_CONTAINERS","COLUMN_PARENTS","DND_MIME","domRect","dom","view","pos","childrenOf","result","node","childPos","offset","rect","child","isEmptyParagraph","findRootContainer","found","doc","findDropTarget","root","isExcluded","exclude","resolveIn","children","containerRect","edge","insideY","y","insideX","x","type","nested","columns","column","c","only","fragment","index","i","insertIndex","pmIndex","p","insertPos","top","payloadFragment","payload","Fragment","schema","json","error","selectInserted","tr","NodeSelection","TextSelection","releaseNodeSelection","selection","Selection","beforeTrailingFiller","$pos","parent","last","applyDrop","editor","rawTarget","from","to","mappedFrom","mappedTo","removeNode","unitAt","candidates","self","includeSelf","depth","candidate","isFixedUnit","unit","parentUnit","selectedUnit","selectUnit","duplicateUnit","insertAt","deleteUnit","appendBlocks","end","content","EmailButton","Button","el","alignment","cls","handleCanvasPaste","html","event","internal","state","$insert","paragraph","EDITOR_CLASS_PATTERN","FORBIDDEN_TAGS","URL_ATTRIBUTES","PRESERVED_ATTRIBUTES","isSafeUrl","trimmed","value","allowDataImage","sanitizeElement","allowed","attr","sanitizeNode","sanitizePastedHtml","tag","createPasteHandler","slice","generateJSON","extensions","SCOPES","SelectAllFix","Extension","$from","container","Plugin","PluginKey","old","oldState","transactions","step","ReplaceStep","newState","createDragSession","active","createHoverStore","hoverPos","listeners","listener","en","message","label","fr","locales","resolveLabel","i18n","isPlainObject","merge","patch","base","key","resolveMessages","locale","overrides","icons_exports","CopyIcon","DesktopIcon","GripIcon","LayersIcon","MobileIcon","OneColumnIcon","ParentIcon","PipetteIcon","RedoIcon","SocialIcon","SpacerIcon","SpacerTileIcon","TrashIcon","UndoIcon","stroke","size","Group","open","setOpen","useState","defaultOpen","className","title","Field","stacked","useDraft","draft","setDraft","synced","setSynced","TextInput","onChange","TextArea","toNumber","n","NumberInput","t","useMessages","commit","raw","min","max","placeholder","next","RangeInput","DEFAULT_SWATCHES","toHex","color","rgb","ColorInput","emptyLabel","hex","onChangeRef","useRef","pending","timer","flush","live","EyeDropper","documentColors","presets","EditorFocusScope","popoverClassName","HexColorPicker","HexColorInput","swatch","swatches","Select","options","v","Segmented","ariaLabel","option","AlignInput","AlignLeftIcon","AlignCenterIcon","AlignRightIcon","PaddingInput","sides","values","get","side","uniform","expanded","setExpanded","labels","set","css","prop","TypographyGroup","ctx","setAlignment","SpacingGroup","changes","BoxGroup","ButtonInspector","ColumnsInspector","useEmailEditor","count","applyWidths","row","rest","col","d","widths","w","HeadingInspector","ImageInspector","width","file","e","uploadImage","SpacerInspector","HtmlInspector","DividerInspector","ContainerInspector","inlineStyleToObject","style","declaration","styleAttribute","attrs","Spacer","EmailNode","mergeAttributes","HTMLAttributes","height","Section","SOCIAL_NETWORKS","ICON_OVERRIDES","iconUrl","network","meta","parseLinks","SocialLinks","gap","links","link","align","Row","Column","Link","Img","HtmlBlock","updated","SocialLinksInspector","save","j","l","id","XIcon","truncate","clean","text","textPreview","noPreview","defaultNodes","TypeIcon","Heading1Icon","ImageIcon","src","url","MousePointerClickIcon","MinusIcon","LinkIcon","SquareCodeIcon","LayoutIcon","PanelLeftIcon","Columns2Icon","Columns3Icon","Columns4Icon","ListIcon","ListOrderedIcon","TextQuoteIcon","CodeIcon","TableIcon","content_exports","button","heading","image","padding","placeholderImage","section","sized","marks","cols","h","menuParagraph","defaultPaletteGroups","defaultPalette","PanelTopIcon","item","TemplateThumbnail","variant","defaultTemplates","template","createStarterDocument","spacer","EmailEditorContext","createContext","useContext","useOptionalEmailEditor","useI18n","useMemo","defaultTheme","extendTheme","readFileAsDataUrl","reader","resolve","reject","EMPTY_DOC","isEmailValue","normalize","useControllable","inner","setInner","defaultValue","useCallback","EditorRoot","forwardRef","extraExtensions","deviceProp","layersOpenProp","messages","initial","settings","setSettings","settingsRef","tRef","onReadyRef","onReady","uploadRef","device","setDevice","defaultDevice","onDeviceChange","layersOpen","setLayersOpen","defaultLayersOpen","onLayersOpenChange","stores","upload","imageExtension","useEditorImage","StarterKit","Placeholder","EmailTheming","nodes","useEditor","editable","getValue","updateSettings","handle","exportEmail","composeReactEmail","useImperativeHandle","ref","useEffect","onUpdate","nodeMap","palette","paletteGroups","templates","starterDocument","tiptapContext","rootStyle","EditorContext","toLocal","hostRect","host","unitBox","unitAtPoint","coords","isStructuralUnit","CanvasOverlay","labelRef","nodeLabel","useSyncExternalStore","hoverStore","hoverNode","hover","drop","setDrop","dragging","setDragging","setLayoutTick","relayout","tick","selected","useEditorState","ed","onDocChange","observer","frame","onMove","dragSession","onLeave","onDown","onPaste","lastFragmentKey","compute","onDragOver","onDrop","onDragLeave","onDragEnd","onDragStart","onKeyDown","current","startMove","isDragging","hoverBox","selectedBox","sourceBox","DropIndicator","zone","PlusIcon","line","Canvas","setHost","slashItems","slashCommands","defaultSlashCommands","EditorContent","bubbleMenu","BubbleMenu","SlashCommand","overlay","isTrailingFiller","itemsOf","items","parentPos","path","accepts","empty","buildLayers","zoneFor","ratio","layerDropTarget","replaceTo","LayersPanel","itemLabel","itemPreview","a","b","selectedPos","layers","collapsed","setCollapsed","listRef","toggle","prev","select","resolveDrop","moving","finishDrag","renderItems","Icon","hasChildren","isCollapsed","preview","dropZone","rows","expandCollapseButtons","keys","walk","onClose","DefaultInspector","useDeselect","PropertiesPanel","deselect","breadcrumb","Inspector","segments","segment","BlockProperties","useDraggableBlock","TemplateCard","drag","BlocksTab","BodyTab","findStyleValue","setGlobalStyle","PaletteTile","ContentTab","known","groups","allGroups","g","groupItems","group","hint","ContentPanel","builtIn","resolved","tabs","tab","setCurrent","defaultTab","TextProperties","BoldIcon","ItalicIcon","UnderlineIcon","StrikethroughIcon","mark","Sidebar","renderDocument","renderNode","renderText","download","filename","PreviewDialog","setView","defaultView","setResult","setError","copied","setCopied","cancelled","r","onKey","copy","createPortal","views","LayersToggle","UndoRedo","history","DeviceToggle","TemplateButton","ImportButton","input","importJson","ExportJsonButton","PreviewButton","ExportHtmlButton","props","TopBar","brand","actions","DefaultLayout","Top","Layers","Main","Side","components","withLayers","showLayers","showTopBar","showSidebar","slotProps","BetterEmailEditor","rootProps"],"sources":["../src/core/cx.ts","../src/core/dnd.ts","../src/core/paste.ts","../src/core/paste-handler.ts","../src/core/select-all.ts","../src/core/stores.ts","../src/i18n/en.ts","../src/i18n/fr.ts","../src/i18n/index.ts","../src/components/icons.tsx","../src/components/fields.tsx","../src/components/inspectors/groups.tsx","../src/components/inspectors/ButtonInspector.tsx","../src/components/inspectors/ColumnsInspector.tsx","../src/components/inspectors/HeadingInspector.tsx","../src/components/inspectors/ImageInspector.tsx","../src/components/inspectors/SimpleInspectors.tsx","../src/core/style-utils.ts","../src/nodes/custom-nodes.tsx","../src/components/inspectors/SocialLinksInspector.tsx","../src/registry/default-nodes.tsx","../src/core/content.ts","../src/registry/default-palette.tsx","../src/registry/default-templates.tsx","../src/context.tsx","../src/components/CanvasOverlay.tsx","../src/components/Canvas.tsx","../src/core/layers.ts","../src/components/LayersPanel.tsx","../src/components/inspectors/DefaultInspector.tsx","../src/components/PropertiesPanel.tsx","../src/components/BlockProperties.tsx","../src/components/useDraggableBlock.ts","../src/components/BlocksTab.tsx","../src/components/BodyTab.tsx","../src/components/ContentTab.tsx","../src/components/ContentPanel.tsx","../src/components/TextProperties.tsx","../src/components/Sidebar.tsx","../src/components/PreviewDialog.tsx","../src/components/TopBar.tsx","../src/components/BetterEmailEditor.tsx"],"sourcesContent":["import type { CSSProperties } from 'react';\n\n/** Joins class names, skipping falsy values. */\nexport function cx(...classes: Array<string | false | null | undefined>) {\n return classes.filter(Boolean).join(' ');\n}\n\n/** Props accepted by every visual component of the library. */\nexport interface StyleProps {\n className?: string;\n style?: CSSProperties;\n}\n","import type { Editor, JSONContent } from '@tiptap/core';\r\nimport { Fragment, type Node as PMNode } from '@tiptap/pm/model';\r\nimport { NodeSelection, Selection, TextSelection, type Transaction } from '@tiptap/pm/state';\r\nimport type { EditorView } from '@tiptap/pm/view';\r\n\r\n/** Nodes whose children are free-flowing blocks (the \"drop zones\"). */\r\nexport const BLOCK_CONTAINERS = new Set(['container', 'section', 'columnsColumn']);\r\n/** Row-like nodes whose children are columns laid out horizontally. */\r\nexport const COLUMN_PARENTS = new Set(['twoColumns', 'threeColumns', 'fourColumns']);\r\n\r\nexport const DND_MIME = 'application/x-email-block';\r\n\r\nexport type DragPayload =\r\n | { kind: 'new'; label: string; content: () => JSONContent[] }\r\n | { kind: 'move'; pos: number; label: string };\r\n\r\nexport interface DropTarget {\r\n /** Document position where the content will be inserted. */\r\n pos: number;\r\n /** When set, the range [pos, replaceTo) is replaced (empty placeholder paragraph). */\r\n replaceTo?: number;\r\n /** Indicator geometry in client coordinates (canvas drops only). */\r\n line?: { top: number; left: number; width: number };\r\n /** Whether the target is an empty drop zone (shows a filled zone instead of a line). */\r\n emptyZone?: { top: number; left: number; width: number; height: number };\r\n}\r\n\r\ninterface Child {\r\n node: PMNode;\r\n pos: number;\r\n rect: DOMRect;\r\n}\r\n\r\nfunction domRect(view: EditorView, pos: number): DOMRect | null {\r\n const dom = view.nodeDOM(pos);\r\n return dom instanceof HTMLElement ? dom.getBoundingClientRect() : null;\r\n}\r\n\r\nfunction childrenOf(view: EditorView, node: PMNode, pos: number): Child[] {\r\n const result: Child[] = [];\r\n node.forEach((child, offset) => {\r\n const childPos = pos + 1 + offset;\r\n const rect = domRect(view, childPos);\r\n if (rect) result.push({ node: child, pos: childPos, rect });\r\n });\r\n return result;\r\n}\r\n\r\nexport function isEmptyParagraph(node: PMNode) {\r\n return node.type.name === 'paragraph' && node.childCount === 0;\r\n}\r\n\r\nexport function findRootContainer(doc: PMNode): { node: PMNode; pos: number } | null {\r\n let found: { node: PMNode; pos: number } | null = null;\r\n doc.forEach((child, offset) => {\r\n if (!found && child.type.name === 'container') found = { node: child, pos: offset };\r\n });\r\n return found;\r\n}\r\n\r\n/**\r\n * Finds where content dragged at (x, y) should land. Walks down from the email\r\n * container into sections and columns, then picks the gap between children\r\n * closest to the pointer — the same mental model as Unlayer's rows/contents.\r\n */\r\nexport function findDropTarget(\r\n view: EditorView,\r\n x: number,\r\n y: number,\r\n fragment: Fragment,\r\n exclude?: { from: number; to: number },\r\n): DropTarget | null {\r\n const root = findRootContainer(view.state.doc);\r\n if (!root) return null;\r\n\r\n const isExcluded = (pos: number) => !!exclude && pos >= exclude.from && pos < exclude.to;\r\n\r\n const resolveIn = (node: PMNode, pos: number): DropTarget | null => {\r\n const children = childrenOf(view, node, pos);\r\n const containerRect = domRect(view, pos);\r\n if (!containerRect) return null;\r\n\r\n // 1. Descend into nested drop zones when the pointer is well inside them.\r\n for (const child of children) {\r\n const { rect } = child;\r\n const edge = Math.min(12, rect.height / 4);\r\n const insideY = y > rect.top + edge && y < rect.bottom - edge;\r\n const insideX = x >= rect.left && x <= rect.right;\r\n if (!insideY || !insideX || isExcluded(child.pos)) continue;\r\n\r\n const type = child.node.type.name;\r\n if (BLOCK_CONTAINERS.has(type)) {\r\n const nested = resolveIn(child.node, child.pos);\r\n if (nested) return nested;\r\n } else if (COLUMN_PARENTS.has(type)) {\r\n const columns = childrenOf(view, child.node, child.pos);\r\n const column =\r\n columns.find((c) => x >= c.rect.left && x <= c.rect.right) ??\r\n (x < columns[0]?.rect.left ? columns[0] : columns[columns.length - 1]);\r\n if (column && !isExcluded(column.pos)) {\r\n const nested = resolveIn(column.node, column.pos);\r\n if (nested) return nested;\r\n }\r\n }\r\n }\r\n\r\n // 2. Empty zone (a column/section holding a single empty paragraph): replace it.\r\n if (children.length === 1 && isEmptyParagraph(children[0].node) && !isExcluded(children[0].pos)) {\r\n const only = children[0];\r\n if (!node.type.validContent(fragment)) return null;\r\n return {\r\n pos: only.pos,\r\n replaceTo: only.pos + only.node.nodeSize,\r\n line: { top: only.rect.top, left: containerRect.left, width: containerRect.width },\r\n emptyZone: {\r\n top: containerRect.top,\r\n left: containerRect.left,\r\n width: containerRect.width,\r\n height: Math.max(containerRect.height, 40),\r\n },\r\n };\r\n }\r\n\r\n // 3. Pick the gap between children.\r\n let index = children.length;\r\n for (let i = 0; i < children.length; i++) {\r\n const { rect } = children[i];\r\n if (y < rect.top + rect.height / 2) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n\r\n // Use ProseMirror's content expression to validate the drop.\r\n const insertIndex = index;\r\n const childIndex = (p: number) => {\r\n let i = 0;\r\n let found = -1;\r\n node.forEach((_c, offset) => {\r\n if (pos + 1 + offset === p) found = i;\r\n i++;\r\n });\r\n return found;\r\n };\r\n const pmIndex = index < children.length ? childIndex(children[index].pos) : node.childCount;\r\n if (!node.canReplace(pmIndex, pmIndex, fragment)) return null;\r\n\r\n const insertPos =\r\n insertIndex < children.length ? children[insertIndex].pos : pos + node.nodeSize - 1;\r\n\r\n let top: number;\r\n if (children.length === 0) top = containerRect.top + 4;\r\n else if (insertIndex === 0) top = children[0].rect.top;\r\n else if (insertIndex === children.length) top = children[children.length - 1].rect.bottom;\r\n else top = (children[insertIndex - 1].rect.bottom + children[insertIndex].rect.top) / 2;\r\n\r\n return {\r\n pos: insertPos,\r\n line: { top, left: containerRect.left, width: containerRect.width },\r\n };\r\n };\r\n\r\n return resolveIn(root.node, root.pos);\r\n}\r\n\r\n/** Builds the PM fragment for a drag payload. */\r\nexport function payloadFragment(view: EditorView, payload: DragPayload): Fragment | null {\r\n const { schema, doc } = view.state;\r\n if (payload.kind === 'new') {\r\n try {\r\n return Fragment.fromArray(payload.content().map((json) => schema.nodeFromJSON(json)));\r\n } catch (error) {\r\n console.error('Invalid block content', error);\r\n return null;\r\n }\r\n }\r\n const node = doc.nodeAt(payload.pos);\r\n return node ? Fragment.from(node) : null;\r\n}\r\n\r\nfunction selectInserted(tr: Transaction, pos: number) {\r\n const node = tr.doc.nodeAt(pos);\r\n if (!node) return;\r\n if (node.isAtom || node.type.name === 'horizontalRule') {\r\n tr.setSelection(NodeSelection.create(tr.doc, pos));\r\n } else {\r\n tr.setSelection(TextSelection.near(tr.doc.resolve(pos + 1)));\r\n }\r\n}\r\n\r\n/**\r\n * The Divider extension filters out any transaction inserting content while a\r\n * divider is node-selected (to stop typing over it). Collapse such selections\r\n * first so structural edits (drop, duplicate) go through.\r\n */\r\nfunction releaseNodeSelection(view: EditorView) {\r\n const { selection, doc } = view.state;\r\n if (selection instanceof NodeSelection) {\r\n view.dispatch(view.state.tr.setSelection(Selection.near(doc.resolve(selection.from))));\r\n }\r\n}\r\n\r\n/**\r\n * Inserting at the very end of a zone would land after TrailingNode's empty\r\n * filler paragraph, which then stops being \"trailing\" and shows up as a stray\r\n * empty line. Insert before it instead.\r\n */\r\nfunction beforeTrailingFiller(doc: PMNode, target: DropTarget): DropTarget {\r\n if (target.replaceTo !== undefined) return target;\r\n const $pos = doc.resolve(target.pos);\r\n const parent = $pos.parent;\r\n const last = parent.lastChild;\r\n const atEnd = $pos.index() === parent.childCount;\r\n if (!atEnd || !last || parent.childCount < 2 || !isEmptyParagraph(last)) return target;\r\n return { ...target, pos: target.pos - last.nodeSize };\r\n}\r\n\r\n/** Applies a drop. Returns true when the document changed. */\r\nexport function applyDrop(editor: Editor, payload: DragPayload, rawTarget: DropTarget): boolean {\r\n const { view } = editor;\r\n releaseNodeSelection(view);\r\n const fragment = payloadFragment(view, payload);\r\n if (!fragment) return false;\r\n const target = beforeTrailingFiller(view.state.doc, rawTarget);\r\n const tr = view.state.tr;\r\n\r\n if (payload.kind === 'new') {\r\n if (target.replaceTo !== undefined) tr.replaceWith(target.pos, target.replaceTo, fragment);\r\n else tr.insert(target.pos, fragment);\r\n selectInserted(tr, target.pos);\r\n } else {\r\n const node = view.state.doc.nodeAt(payload.pos);\r\n if (!node) return false;\r\n const from = payload.pos;\r\n const to = from + node.nodeSize;\r\n // Dropping right before or after itself is a no-op.\r\n if (target.replaceTo === undefined && (target.pos === from || target.pos === to)) return false;\r\n\r\n removeNode(tr, from, to);\r\n const mappedFrom = tr.mapping.map(target.pos, -1);\r\n if (target.replaceTo !== undefined) {\r\n const mappedTo = tr.mapping.map(target.replaceTo, 1);\r\n tr.replaceWith(mappedFrom, mappedTo, node);\r\n } else {\r\n tr.insert(mappedFrom, node);\r\n }\r\n selectInserted(tr, mappedFrom);\r\n }\r\n\r\n view.dispatch(tr.scrollIntoView());\r\n view.focus();\r\n return true;\r\n}\r\n\r\n/** Deletes a node; keeps its parent valid by leaving an empty paragraph if needed. */\r\nexport function removeNode(tr: Transaction, from: number, to: number) {\r\n const $from = tr.doc.resolve(from);\r\n const parent = $from.parent;\r\n if (parent.childCount === 1 && BLOCK_CONTAINERS.has(parent.type.name)) {\r\n tr.replaceWith(from, to, tr.doc.type.schema.nodes.paragraph.create());\r\n } else {\r\n tr.delete(from, to);\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Block \"units\": what gets outlined, labelled and moved in the canvas.\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface BlockUnit {\r\n pos: number;\r\n node: PMNode;\r\n}\r\n\r\n/** The innermost node at `pos` (or one of its ancestors) that sits directly in a drop zone. */\r\nexport function unitAt(doc: PMNode, pos: number, includeSelf = true): BlockUnit | null {\r\n if (pos < 0 || pos > doc.content.size) return null;\r\n const candidates: BlockUnit[] = [];\r\n const self = doc.nodeAt(pos);\r\n if (includeSelf && self) candidates.push({ pos, node: self });\r\n const $pos = doc.resolve(pos);\r\n for (let depth = $pos.depth; depth > 0; depth--) {\r\n candidates.push({ pos: $pos.before(depth), node: $pos.node(depth) });\r\n }\r\n for (const candidate of candidates) {\r\n const parent = doc.resolve(candidate.pos).parent.type.name;\r\n // Columns are units too (selectable, styleable), but they can't be moved out of their row.\r\n if (BLOCK_CONTAINERS.has(parent) || COLUMN_PARENTS.has(parent)) return candidate;\r\n }\r\n return null;\r\n}\r\n\r\n/** Columns live in fixed-size rows: they can be selected but not moved, duplicated or deleted. */\r\nexport function isFixedUnit(unit: BlockUnit) {\r\n return unit.node.type.name === 'columnsColumn';\r\n}\r\n\r\n/** The unit enclosing `unit` (e.g. paragraph -> its columns row). */\r\nexport function parentUnit(doc: PMNode, unit: BlockUnit): BlockUnit | null {\r\n const $pos = doc.resolve(unit.pos);\r\n for (let depth = $pos.depth; depth > 0; depth--) {\r\n const candidatePos = $pos.before(depth);\r\n const found = unitAt(doc, candidatePos);\r\n if (found && found.pos !== unit.pos) return found;\r\n }\r\n return null;\r\n}\r\n\r\nexport function selectedUnit(editor: Editor): BlockUnit | null {\r\n const { selection, doc } = editor.state;\r\n if (selection instanceof NodeSelection) {\r\n return unitAt(doc, selection.from) ?? { pos: selection.from, node: selection.node };\r\n }\r\n return unitAt(doc, selection.from, false);\r\n}\r\n\r\nexport function selectUnit(editor: Editor, unit: BlockUnit) {\r\n const { view } = editor;\r\n const tr = view.state.tr.setSelection(NodeSelection.create(view.state.doc, unit.pos));\r\n view.dispatch(tr);\r\n view.focus();\r\n}\r\n\r\nexport function duplicateUnit(editor: Editor, unit: BlockUnit) {\r\n const { view } = editor;\r\n releaseNodeSelection(view);\r\n const node = view.state.doc.nodeAt(unit.pos);\r\n if (!node) return;\r\n const insertAt = unit.pos + node.nodeSize;\r\n const tr = view.state.tr.insert(insertAt, node.copy(node.content));\r\n tr.setSelection(NodeSelection.create(tr.doc, insertAt));\r\n view.dispatch(tr.scrollIntoView());\r\n view.focus();\r\n}\r\n\r\nexport function deleteUnit(editor: Editor, unit: BlockUnit) {\r\n const { view } = editor;\r\n const node = view.state.doc.nodeAt(unit.pos);\r\n if (!node) return;\r\n const tr = view.state.tr;\r\n removeNode(tr, unit.pos, unit.pos + node.nodeSize);\r\n view.dispatch(tr);\r\n}\r\n\r\n/** Appends blocks at the end of the email (click-to-insert from the palette). */\r\nexport function appendBlocks(editor: Editor, content: JSONContent[]) {\r\n const root = findRootContainer(editor.state.doc);\r\n if (!root) return;\r\n const last = root.node.lastChild;\r\n const end = root.pos + root.node.nodeSize - 1;\r\n const target: DropTarget =\r\n last && isEmptyParagraph(last) && root.node.childCount > 1\r\n ? { pos: end - last.nodeSize, replaceTo: end, line: { top: 0, left: 0, width: 0 } }\r\n : { pos: end, line: { top: 0, left: 0, width: 0 } };\r\n applyDrop(editor, { kind: 'new', label: '', content: () => content }, target);\r\n}\r\n","import type { Editor } from '@tiptap/core';\nimport { Button } from '@react-email/editor/extensions';\nimport { NodeSelection, TextSelection } from '@tiptap/pm/state';\nimport { COLUMN_PARENTS } from './dnd';\n\n/**\n * The package's Button renders `data-href` and wraps the link in\n * `div.align-*`, but its parseHTML reads neither: a copied button came back\n * with href \"#\" and left-aligned. Read them back so copy/paste round-trips.\n */\nexport const EmailButton = Button.extend({\n parseHTML() {\n return [\n {\n tag: 'a[data-id=\"react-email-button\"]',\n getAttrs: (node) => {\n if (typeof node === 'string') return false;\n const el = node as HTMLElement;\n const alignment = el.parentElement?.className.match(/align-(left|center|right)/)?.[1];\n const cls = el.className.replace(/\\bnode-button\\b/g, '').trim();\n return {\n href: el.getAttribute('href') ?? el.dataset.href ?? '#',\n alignment: alignment ?? 'left',\n class: cls || 'button',\n style: el.getAttribute('style'),\n };\n },\n },\n ];\n },\n});\n\n/**\n * Block-friendly paste, wired as a capture-phase `paste` listener on the canvas:\n *\n * 1. With a block selected (NodeSelection), ProseMirror would *replace* it.\n * Builders (Unlayer, Elementor) paste *after* it instead, so copy + paste on\n * the same block duplicates it. We open an empty paragraph after the block\n * and paste there.\n * 2. Content copied from this editor (`data-pm-slice`) is replayed through\n * `view.pasteHTML` without clipboard data, which makes the package's paste\n * handler step aside and lets ProseMirror restore the exact slice.\n * External HTML still goes through the package's sanitizer.\n *\n * Returns true when the event was handled.\n */\nexport function handleCanvasPaste(editor: Editor, event: ClipboardEvent): boolean {\n const html = event.clipboardData?.getData('text/html') ?? '';\n const internal = html.includes('data-pm-slice');\n const hasFiles = (event.clipboardData?.files?.length ?? 0) > 0;\n if (hasFiles) return false; // image files: the image extension uploads them\n\n const { view } = editor;\n const { state } = view;\n const { selection } = state;\n\n if (selection instanceof NodeSelection && selection.node.isBlock) {\n const node = selection.node;\n // A column can't get siblings: paste at the end of its content instead.\n const isColumn = node.type.name === 'columnsColumn';\n const insertAt = isColumn ? selection.from + node.nodeSize - 1 : selection.from + node.nodeSize;\n const $insert = state.doc.resolve(insertAt);\n const paragraph = state.schema.nodes.paragraph;\n if (COLUMN_PARENTS.has($insert.parent.type.name)) return false;\n if (!$insert.parent.canReplaceWith($insert.index(), $insert.index(), paragraph)) return false;\n // Divider's filterTransaction rejects inserts while a divider is node-selected:\n // collapse the selection in a first transaction.\n view.dispatch(state.tr.setSelection(TextSelection.near($insert)));\n const tr = view.state.tr.insert(insertAt, paragraph.create());\n tr.setSelection(TextSelection.create(tr.doc, insertAt + 1));\n view.dispatch(tr);\n }\n\n if (!internal) return false; // let the browser event continue (package handler / ProseMirror)\n\n event.preventDefault();\n event.stopPropagation();\n view.pasteHTML(html);\n return true;\n}\n","import type { Extensions } from '@tiptap/core';\nimport { generateJSON } from '@tiptap/html';\nimport type { Slice } from '@tiptap/pm/model';\nimport type { EditorView } from '@tiptap/pm/view';\n\n/*\n * Same paste handling as `EmailEditor` from @react-email/editor (MIT), which\n * this library replaces with its own provider so the canvas can be placed\n * anywhere in the layout. Neither helper is exported by the package.\n */\n\nconst EDITOR_CLASS_PATTERN = /class=\"[^\"]*node-/;\nconst FORBIDDEN_TAGS = ['script', 'iframe', 'object', 'embed', 'meta', 'base'];\nconst URL_ATTRIBUTES = ['href', 'src'];\n/** Attributes kept on external content: functional ones only, no style or class. */\nconst PRESERVED_ATTRIBUTES: Record<string, string[]> = {\n a: ['href', 'target', 'rel'],\n img: ['src', 'alt', 'width', 'height'],\n td: ['colspan', 'rowspan'],\n th: ['colspan', 'rowspan', 'scope'],\n table: ['border', 'cellpadding', 'cellspacing'],\n '*': ['id'],\n};\n\nfunction isSafeUrl(value: string, allowDataImage: boolean) {\n const trimmed = value.trim().toLowerCase();\n if (trimmed.startsWith('javascript:') || trimmed.startsWith('vbscript:')) return false;\n if (trimmed.startsWith('data:')) return allowDataImage && trimmed.startsWith('data:image/');\n return true;\n}\n\nfunction sanitizeElement(el: Element) {\n const allowed = new Set([...(PRESERVED_ATTRIBUTES[el.tagName.toLowerCase()] ?? []), ...PRESERVED_ATTRIBUTES['*']]);\n for (const attr of Array.from(el.attributes)) {\n if (attr.name.startsWith('data-') || !allowed.has(attr.name)) el.removeAttribute(attr.name);\n }\n}\n\nfunction sanitizeNode(node: Node) {\n if (node.nodeType === Node.ELEMENT_NODE) sanitizeElement(node as Element);\n for (const child of Array.from(node.childNodes)) sanitizeNode(child);\n}\n\n/**\n * Drops dangerous elements and URL schemes. Content copied from the editor\n * (node-* classes) keeps its attributes; external content keeps semantic HTML only.\n */\nexport function sanitizePastedHtml(html: string) {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n for (const tag of FORBIDDEN_TAGS) for (const el of Array.from(doc.body.getElementsByTagName(tag))) el.remove();\n for (const el of Array.from(doc.body.querySelectorAll('[href], [src]'))) {\n const allowDataImage = el.tagName.toLowerCase() === 'img';\n for (const attr of URL_ATTRIBUTES) {\n const value = el.getAttribute(attr);\n if (value !== null && !isSafeUrl(value, allowDataImage)) el.removeAttribute(attr);\n }\n }\n if (!EDITOR_CLASS_PATTERN.test(html)) sanitizeNode(doc.body);\n return doc.body.innerHTML;\n}\n\nexport function createPasteHandler(extensions: Extensions) {\n return (view: EditorView, event: ClipboardEvent, slice: Slice) => {\n if (slice.content.childCount === 1) return false;\n const html = event.clipboardData?.getData?.('text/html');\n if (!html) return false;\n event.preventDefault();\n const json = generateJSON(sanitizePastedHtml(html), extensions);\n const node = view.state.schema.nodeFromJSON(json);\n view.dispatch(view.state.tr.replaceSelectionWith(node, false));\n return true;\n };\n}\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey, Selection, TextSelection } from '@tiptap/pm/state';\nimport { ReplaceStep } from '@tiptap/pm/transform';\n\nconst SCOPES = new Set(['columnsColumn', 'codeBlock']);\n\n/**\n * Select-all that keeps the email's structure.\n *\n * The package's Mod-a inside a column selects the whole column with a\n * TextSelection whose ends sit on the column itself, not in text. Deleting it\n * (Delete, Backspace, cut) empties the column, but the mapped selection then\n * lands outside it: on the next block as a NodeSelection (the next key\n * replaces that block) or in the next column. Put the caret back in the\n * emptied column instead.\n */\nexport const SelectAllFix = Extension.create({\n name: 'selectAllFix',\n // Above Tiptap's core keymap, whose Mod-a selects the whole document.\n priority: 101,\n\n addKeyboardShortcuts() {\n return {\n // The default select-all also takes the hidden globalContent node (email\n // body styles) and the container: deleting it wiped the theme and layout.\n // Select the container's content instead.\n 'Mod-a': ({ editor }) => {\n const { state } = editor;\n // A column or code block not yet fully selected: its own Mod-a selects it.\n const { $from } = state.selection;\n for (let depth = $from.depth; depth > 0; depth--) {\n if (!SCOPES.has($from.node(depth).type.name)) continue;\n if (state.selection.from !== $from.start(depth) || state.selection.to !== $from.end(depth)) return false;\n }\n let pos = -1;\n state.doc.forEach((node, offset) => {\n if (pos < 0 && node.type.name === 'container') pos = offset;\n });\n const container = pos < 0 ? null : state.doc.nodeAt(pos);\n if (!container) return false;\n const from = pos + 1;\n const to = pos + container.nodeSize - 1;\n if (state.selection.from !== from || state.selection.to !== to) {\n editor.view.dispatch(state.tr.setSelection(TextSelection.create(state.doc, from, to)));\n }\n return true;\n },\n };\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('selectAllFix'),\n appendTransaction(transactions, oldState, newState) {\n const old = oldState.selection;\n if (!(old instanceof TextSelection) || (old.$from.parent.inlineContent && old.$to.parent.inlineContent)) return null;\n const replacesSelection = transactions.some((tr) =>\n tr.steps.some((step) => step instanceof ReplaceStep && step.from === old.from && step.to === old.to),\n );\n if (!replacesSelection) return null;\n\n let from = old.from;\n let to = old.to;\n for (const tr of transactions) {\n from = tr.mapping.map(from, -1);\n to = tr.mapping.map(to, 1);\n }\n // Typing or pasting over the selection leaves the caret in what was inserted.\n const { selection } = newState;\n if (selection instanceof TextSelection && selection.from >= from && selection.to <= to) return null;\n\n const $pos = newState.doc.resolve(from);\n return newState.tr.setSelection(Selection.findFrom($pos, 1, true) ?? Selection.near($pos));\n },\n }),\n ];\n },\n});\n","import type { DragPayload } from './dnd';\n\n/**\n * Per-editor state shared by the canvas, the palette and the layers panel.\n * One instance lives in each `EditorRoot`, so several editors can coexist on a page.\n */\n\n/** Only one drag happens at a time; `dragover` can't read dataTransfer payloads, so the active payload lives here. */\nexport interface DragSession {\n get: () => DragPayload | null;\n start: (payload: DragPayload) => void;\n end: () => void;\n}\n\nexport function createDragSession(): DragSession {\n let active: DragPayload | null = null;\n return {\n get: () => active,\n start: (payload) => {\n active = payload;\n },\n end: () => {\n active = null;\n },\n };\n}\n\n/** Hovered block position: the canvas and the layers panel highlight the same block. */\nexport interface HoverStore {\n get: () => number | null;\n set: (pos: number | null) => void;\n subscribe: (listener: () => void) => () => void;\n}\n\nexport function createHoverStore(): HoverStore {\n let hoverPos: number | null = null;\n const listeners = new Set<() => void>();\n return {\n get: () => hoverPos,\n set: (pos) => {\n if (pos === hoverPos) return;\n hoverPos = pos;\n for (const listener of listeners) listener();\n },\n subscribe: (listener) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n","/** English UI strings (default locale). Every other locale implements the same shape. */\r\nexport const en = {\r\n topBar: {\r\n layers: 'Layers',\r\n toggleLayers: 'Show / hide layers',\r\n undo: 'Undo (Ctrl+Z)',\r\n redo: 'Redo (Ctrl+Y)',\r\n canvasWidth: 'Canvas width',\r\n desktop: 'Desktop',\r\n mobile: 'Mobile',\r\n template: 'Template',\r\n confirmTemplate: 'Replace the content with the starter template?',\r\n import: 'Import',\r\n exportJson: 'Save JSON',\r\n preview: 'Preview',\r\n exportHtml: 'Export HTML',\r\n invalidFile: (message: string) => `Invalid file: ${message}`,\r\n },\r\n preview: {\r\n dialogLabel: 'Preview and export',\r\n desktop: 'Desktop',\r\n mobile: 'Mobile',\r\n html: 'HTML',\r\n text: 'Plain text',\r\n copy: 'Copy',\r\n copied: 'Copied ✓',\r\n download: 'Download .html',\r\n close: 'Close',\r\n rendering: 'Rendering the email…',\r\n renderError: (message: string) => `Render error: ${message}`,\r\n iframeTitle: 'Email preview',\r\n },\r\n sidebar: {\r\n label: 'Side panel',\r\n tabContent: 'Content',\r\n tabBlocks: 'Blocks',\r\n tabBody: 'Body',\r\n layoutTitle: 'Layout',\r\n contentTitle: 'Content',\r\n dragHint: 'Drag an item into the email. A click adds it at the end.',\r\n tileTitle: (label: string) => `Drag “${label}” into the email (or click to add it at the end)`,\r\n propertiesEyebrow: 'Properties',\r\n closeProperties: 'Close (back to content)',\r\n breadcrumb: 'Hierarchy',\r\n selectedText: 'Selected text',\r\n },\r\n body: {\r\n general: 'General',\r\n previewText: 'Preview text',\r\n previewTextPlaceholder: 'Shown after the subject line in the inbox',\r\n background: 'Background',\r\n backgroundColor: 'Background color',\r\n outerPadding: 'Outer padding',\r\n content: 'Content',\r\n width: 'Width',\r\n contentColor: 'Content color',\r\n innerPadding: 'Inner padding',\r\n radius: 'Corner radius',\r\n defaultStyles: 'Default styles',\r\n text: 'Text',\r\n headings: 'Headings',\r\n links: 'Links',\r\n buttonBackground: 'Button background',\r\n buttonText: 'Button text',\r\n },\r\n inspector: {\r\n typography: 'Typography',\r\n color: 'Color',\r\n size: 'Size',\r\n weight: 'Weight',\r\n weightLight: 'Light',\r\n weightNormal: 'Normal',\r\n weightSemibold: 'Semibold',\r\n weightBold: 'Bold',\r\n weightExtrabold: 'Extra bold',\r\n lineHeight: 'Line height',\r\n alignment: 'Alignment',\r\n spacing: 'Spacing',\r\n padding: 'Padding',\r\n box: 'Background & border',\r\n backgroundColor: 'Background color',\r\n radius: 'Corner radius',\r\n border: 'Border',\r\n borderColor: 'Border color',\r\n // Image\r\n image: 'Image',\r\n uploadImage: 'Upload an image…',\r\n imageUrl: 'Image URL',\r\n altText: 'Alt text',\r\n altPlaceholder: 'Describe the image',\r\n layout: 'Layout',\r\n autoWidth: 'Auto width',\r\n width: 'Width',\r\n action: 'Action',\r\n clickLink: 'Link on click',\r\n // Button\r\n linkUrl: 'Link URL',\r\n button: 'Button',\r\n textColor: 'Text color',\r\n textSize: 'Text size',\r\n buttonPadding: 'Button padding',\r\n // Social\r\n networks: 'Networks',\r\n removeNetwork: 'Remove',\r\n addNetwork: '+ Add a network',\r\n appearance: 'Appearance',\r\n iconSize: 'Icon size',\r\n gap: 'Spacing',\r\n // Columns\r\n columns: 'Columns',\r\n distribution: 'Distribution',\r\n equal: 'Equal',\r\n columnGap: 'Gap between columns',\r\n columnsHint: 'Click inside a column to set its background and padding.',\r\n // Spacer\r\n spacer: 'Spacer',\r\n height: 'Height',\r\n // HTML\r\n htmlCode: 'HTML code',\r\n htmlHint: 'The HTML is inserted as is in the exported email.',\r\n // Divider\r\n line: 'Line',\r\n thickness: 'Thickness',\r\n lineStyle: 'Style',\r\n // Heading\r\n heading: 'Heading',\r\n level: 'Level',\r\n // Text selection\r\n formatting: 'Formatting',\r\n bold: 'Bold',\r\n italic: 'Italic',\r\n underline: 'Underline',\r\n strike: 'Strikethrough',\r\n link: 'Link',\r\n url: 'URL',\r\n linkColor: 'Link color',\r\n },\r\n fields: {\r\n colorDefault: 'Default',\r\n chooseColor: (value: string) => `Pick a color (${value})`,\r\n hexCode: 'Hex code',\r\n eyedropper: 'Eyedropper: pick a color on screen',\r\n documentColors: 'Document colors',\r\n palette: 'Palette',\r\n resetColor: 'Reset to default',\r\n alignLeft: 'Left',\r\n alignCenter: 'Center',\r\n alignRight: 'Right',\r\n top: 'Top',\r\n right: 'Right',\r\n bottom: 'Bottom',\r\n left: 'Left',\r\n moreOptions: 'More options',\r\n auto: 'auto',\r\n },\r\n layers: {\r\n title: 'Layers',\r\n expandAll: 'Expand all',\r\n collapseAll: 'Collapse all',\r\n close: 'Close layers',\r\n tree: 'Email structure',\r\n emptyEmail: 'The email is empty.',\r\n emptyZone: 'Empty — drop content here',\r\n column: (index: number) => `Column ${index}`,\r\n fixedHint: 'Columns stay in their row',\r\n itemHint: 'Click to select, drag to move',\r\n expand: 'Expand',\r\n collapse: 'Collapse',\r\n uploadedImage: 'uploaded image',\r\n empty: 'empty',\r\n },\r\n canvas: {\r\n dropHere: 'Drop here',\r\n dropLabel: (label: string) => (label ? `Drop “${label}” here` : 'Drop here'),\r\n emptyZone: 'Drag content here',\r\n move: 'Drag to move',\r\n moveLabel: (label: string) => `Move: ${label}`,\r\n selectParent: (label: string) => `Select: ${label}`,\r\n duplicate: 'Duplicate',\r\n delete: 'Delete',\r\n },\r\n placeholder: {\r\n heading: 'Heading',\r\n paragraph: 'Write, or type “/” for commands',\r\n },\r\n nodes: {\r\n body: 'Body',\r\n paragraph: 'Text',\r\n heading: 'Heading',\r\n image: 'Image',\r\n button: 'Button',\r\n horizontalRule: 'Divider',\r\n spacer: 'Spacer',\r\n socialLinks: 'Social links',\r\n htmlBlock: 'HTML',\r\n section: 'Section',\r\n twoColumns: 'Row · 2 columns',\r\n threeColumns: 'Row · 3 columns',\r\n fourColumns: 'Row · 4 columns',\r\n columnsColumn: 'Column',\r\n bulletList: 'List',\r\n orderedList: 'Numbered list',\r\n listItem: 'List item',\r\n blockquote: 'Quote',\r\n codeBlock: 'Code',\r\n table: 'Table',\r\n container: 'Email',\r\n } as Record<string, string>,\r\n palette: {\r\n oneColumn: '1 column',\r\n twoColumns: '2 columns',\r\n threeColumns: '3 columns',\r\n fourColumns: '4 columns',\r\n heading: 'Heading',\r\n text: 'Text',\r\n button: 'Button',\r\n image: 'Image',\r\n divider: 'Divider',\r\n spacer: 'Spacer',\r\n social: 'Social',\r\n menu: 'Menu',\r\n list: 'List',\r\n quote: 'Quote',\r\n html: 'HTML',\r\n card: 'Card',\r\n },\r\n templates: {\r\n header: 'Header',\r\n headerDescription: 'Logo on the left, menu on the right',\r\n hero: 'Hero',\r\n heroDescription: 'Big heading, tagline and button',\r\n products: 'Products',\r\n productsDescription: 'Two product cards side by side',\r\n features: 'Features',\r\n featuresDescription: 'Three columns with heading + text',\r\n testimonial: 'Testimonial',\r\n testimonialDescription: 'Highlighted customer quote',\r\n footer: 'Footer',\r\n footerDescription: 'Social links, address and unsubscribe',\r\n },\r\n /** Default text inserted by the palette, the templates and the starter email. */\r\n content: {\r\n heading: 'Your heading here',\r\n text: 'This is a new text block. Click it to edit the content, select text to format it.',\r\n button: 'Click here',\r\n image: 'Image',\r\n menuHome: 'Home',\r\n menuShop: 'Shop',\r\n menuBlog: 'Blog',\r\n menuContact: 'Contact',\r\n listItems: ['First item', 'Second item', 'Third item'],\r\n quote: '“A quote that highlights your message.”',\r\n html: '<p style=\"margin:0;text-align:center;font-family:sans-serif\">Your custom <strong>HTML</strong></p>',\r\n cardTitle: 'Did you know?',\r\n cardText: 'A card draws attention to an important piece of information.',\r\n logo: 'LOGO',\r\n heroTitle: 'What’s new this season',\r\n heroText: 'Discover our selection made for you, available today.',\r\n heroButton: 'Discover',\r\n productA: 'Product A',\r\n productB: 'Product B',\r\n productText: 'A short description of the product.',\r\n productButton: 'Buy',\r\n features: ['Free shipping', 'Free returns', '24/7 support'],\r\n featureText: 'A clear and concise argument.',\r\n testimonialQuote: '“Flawless service, I recommend it with my eyes closed.”',\r\n testimonialAuthor: '— Camille, customer since 2021',\r\n footerAddress: 'Acme Inc. · 10 Main Street, Springfield',\r\n unsubscribe: 'Unsubscribe',\r\n starterTitle: 'Our favourites',\r\n },\r\n /** Translations of the package's “/” commands, keyed by their English title. */\r\n slashCommands: {} as Record<string, { title: string; description: string }>,\r\n};\r\n\r\nexport type Messages = typeof en;\r\n","import type { Messages } from './en';\r\n\r\n/** Textes de l'interface en français. */\r\nexport const fr: Messages = {\r\n topBar: {\r\n layers: 'Calques',\r\n toggleLayers: 'Afficher / masquer les calques',\r\n undo: 'Annuler (Ctrl+Z)',\r\n redo: 'Rétablir (Ctrl+Y)',\r\n canvasWidth: 'Largeur du canvas',\r\n desktop: 'Bureau',\r\n mobile: 'Mobile',\r\n template: 'Modèle',\r\n confirmTemplate: 'Remplacer le contenu par le modèle de départ ?',\r\n import: 'Importer',\r\n exportJson: 'Enregistrer JSON',\r\n preview: 'Aperçu',\r\n exportHtml: 'Exporter HTML',\r\n invalidFile: (message) => `Fichier invalide : ${message}`,\r\n },\r\n preview: {\r\n dialogLabel: 'Aperçu et export',\r\n desktop: 'Bureau',\r\n mobile: 'Mobile',\r\n html: 'HTML',\r\n text: 'Texte brut',\r\n copy: 'Copier',\r\n copied: 'Copié ✓',\r\n download: 'Télécharger .html',\r\n close: 'Fermer',\r\n rendering: 'Rendu de l’email…',\r\n renderError: (message) => `Erreur de rendu : ${message}`,\r\n iframeTitle: 'Aperçu de l’email',\r\n },\r\n sidebar: {\r\n label: 'Panneau latéral',\r\n tabContent: 'Contenu',\r\n tabBlocks: 'Blocs',\r\n tabBody: 'Corps',\r\n layoutTitle: 'Mise en page',\r\n contentTitle: 'Contenus',\r\n dragHint: 'Glissez un élément dans l’email. Un clic l’ajoute à la fin.',\r\n tileTitle: (label) => `Glissez « ${label} » dans l’email (ou cliquez pour l’ajouter à la fin)`,\r\n propertiesEyebrow: 'Propriétés',\r\n closeProperties: 'Fermer (retour aux contenus)',\r\n breadcrumb: 'Hiérarchie',\r\n selectedText: 'Texte sélectionné',\r\n },\r\n body: {\r\n general: 'Général',\r\n previewText: 'Texte d’aperçu',\r\n previewTextPlaceholder: 'Affiché après l’objet dans la boîte de réception',\r\n background: 'Arrière-plan',\r\n backgroundColor: 'Couleur de fond',\r\n outerPadding: 'Marge extérieure',\r\n content: 'Contenu',\r\n width: 'Largeur',\r\n contentColor: 'Couleur du contenu',\r\n innerPadding: 'Marge intérieure',\r\n radius: 'Arrondi',\r\n defaultStyles: 'Styles par défaut',\r\n text: 'Texte',\r\n headings: 'Titres',\r\n links: 'Liens',\r\n buttonBackground: 'Fond des boutons',\r\n buttonText: 'Texte des boutons',\r\n },\r\n inspector: {\r\n typography: 'Typographie',\r\n color: 'Couleur',\r\n size: 'Taille',\r\n weight: 'Graisse',\r\n weightLight: 'Fin',\r\n weightNormal: 'Normal',\r\n weightSemibold: 'Semi-gras',\r\n weightBold: 'Gras',\r\n weightExtrabold: 'Extra-gras',\r\n lineHeight: 'Interligne',\r\n alignment: 'Alignement',\r\n spacing: 'Espacement',\r\n padding: 'Marge intérieure',\r\n box: 'Fond et bordure',\r\n backgroundColor: 'Couleur de fond',\r\n radius: 'Arrondi',\r\n border: 'Bordure',\r\n borderColor: 'Couleur de bordure',\r\n image: 'Image',\r\n uploadImage: 'Importer une image…',\r\n imageUrl: 'URL de l’image',\r\n altText: 'Texte alternatif',\r\n altPlaceholder: 'Décrivez l’image',\r\n layout: 'Disposition',\r\n autoWidth: 'Largeur auto',\r\n width: 'Largeur',\r\n action: 'Action',\r\n clickLink: 'Lien au clic',\r\n linkUrl: 'URL du lien',\r\n button: 'Bouton',\r\n textColor: 'Couleur du texte',\r\n textSize: 'Taille du texte',\r\n buttonPadding: 'Marges du bouton',\r\n networks: 'Réseaux',\r\n removeNetwork: 'Retirer',\r\n addNetwork: '+ Ajouter un réseau',\r\n appearance: 'Apparence',\r\n iconSize: 'Taille des icônes',\r\n gap: 'Espacement',\r\n columns: 'Colonnes',\r\n distribution: 'Répartition',\r\n equal: 'Égales',\r\n columnGap: 'Espace entre colonnes',\r\n columnsHint: 'Cliquez dans une colonne pour régler son fond et ses marges.',\r\n spacer: 'Espacement',\r\n height: 'Hauteur',\r\n htmlCode: 'Code HTML',\r\n htmlHint: 'Le HTML est inséré tel quel dans l’email exporté.',\r\n line: 'Ligne',\r\n thickness: 'Épaisseur',\r\n lineStyle: 'Style',\r\n heading: 'Titre',\r\n level: 'Niveau',\r\n formatting: 'Mise en forme',\r\n bold: 'Gras',\r\n italic: 'Italique',\r\n underline: 'Souligné',\r\n strike: 'Barré',\r\n link: 'Lien',\r\n url: 'URL',\r\n linkColor: 'Couleur du lien',\r\n },\r\n fields: {\r\n colorDefault: 'Par défaut',\r\n chooseColor: (value) => `Choisir une couleur (${value})`,\r\n hexCode: 'Code hexadécimal',\r\n eyedropper: 'Pipette : prendre une couleur à l’écran',\r\n documentColors: 'Couleurs du document',\r\n palette: 'Palette',\r\n resetColor: 'Revenir à la valeur par défaut',\r\n alignLeft: 'Gauche',\r\n alignCenter: 'Centre',\r\n alignRight: 'Droite',\r\n top: 'Haut',\r\n right: 'Droite',\r\n bottom: 'Bas',\r\n left: 'Gauche',\r\n moreOptions: 'Plus d’options',\r\n auto: 'auto',\r\n },\r\n layers: {\r\n title: 'Calques',\r\n expandAll: 'Tout déplier',\r\n collapseAll: 'Tout replier',\r\n close: 'Fermer les calques',\r\n tree: 'Structure de l’email',\r\n emptyEmail: 'L’email est vide.',\r\n emptyZone: 'Vide — déposez du contenu ici',\r\n column: (index) => `Colonne ${index}`,\r\n fixedHint: 'Les colonnes restent dans leur ligne',\r\n itemHint: 'Cliquer pour sélectionner, glisser pour déplacer',\r\n expand: 'Déplier',\r\n collapse: 'Replier',\r\n uploadedImage: 'image importée',\r\n empty: 'vide',\r\n },\r\n canvas: {\r\n dropHere: 'Déposer ici',\r\n dropLabel: (label) => (label ? `Déposer « ${label} » ici` : 'Déposer ici'),\r\n emptyZone: 'Glissez du contenu ici',\r\n move: 'Glisser pour déplacer',\r\n moveLabel: (label) => `Déplacer : ${label}`,\r\n selectParent: (label) => `Sélectionner : ${label}`,\r\n duplicate: 'Dupliquer',\r\n delete: 'Supprimer',\r\n },\r\n placeholder: {\r\n heading: 'Titre',\r\n paragraph: 'Écrivez, ou tapez « / » pour les commandes',\r\n },\r\n nodes: {\r\n body: 'Corps',\r\n paragraph: 'Texte',\r\n heading: 'Titre',\r\n image: 'Image',\r\n button: 'Bouton',\r\n horizontalRule: 'Séparateur',\r\n spacer: 'Espacement',\r\n socialLinks: 'Réseaux sociaux',\r\n htmlBlock: 'HTML',\r\n section: 'Section',\r\n twoColumns: 'Ligne · 2 colonnes',\r\n threeColumns: 'Ligne · 3 colonnes',\r\n fourColumns: 'Ligne · 4 colonnes',\r\n columnsColumn: 'Colonne',\r\n bulletList: 'Liste',\r\n orderedList: 'Liste numérotée',\r\n listItem: 'Élément de liste',\r\n blockquote: 'Citation',\r\n codeBlock: 'Code',\r\n table: 'Tableau',\r\n container: 'Email',\r\n },\r\n palette: {\r\n oneColumn: '1 colonne',\r\n twoColumns: '2 colonnes',\r\n threeColumns: '3 colonnes',\r\n fourColumns: '4 colonnes',\r\n heading: 'Titre',\r\n text: 'Texte',\r\n button: 'Bouton',\r\n image: 'Image',\r\n divider: 'Séparateur',\r\n spacer: 'Espacement',\r\n social: 'Réseaux',\r\n menu: 'Menu',\r\n list: 'Liste',\r\n quote: 'Citation',\r\n html: 'HTML',\r\n card: 'Encadré',\r\n },\r\n templates: {\r\n header: 'En-tête',\r\n headerDescription: 'Logo à gauche, menu à droite',\r\n hero: 'Hero',\r\n heroDescription: 'Grand titre, accroche et bouton',\r\n products: 'Produits',\r\n productsDescription: 'Deux cartes produit côte à côte',\r\n features: 'Avantages',\r\n featuresDescription: 'Trois colonnes titre + texte',\r\n testimonial: 'Témoignage',\r\n testimonialDescription: 'Citation client mise en avant',\r\n footer: 'Pied de page',\r\n footerDescription: 'Réseaux sociaux, adresse et désinscription',\r\n },\r\n content: {\r\n heading: 'Votre titre ici',\r\n text: 'Ceci est un nouveau bloc de texte. Cliquez dessus pour modifier le contenu, sélectionnez du texte pour le mettre en forme.',\r\n button: 'Cliquez ici',\r\n image: 'Image',\r\n menuHome: 'Accueil',\r\n menuShop: 'Boutique',\r\n menuBlog: 'Blog',\r\n menuContact: 'Contact',\r\n listItems: ['Premier point', 'Deuxième point', 'Troisième point'],\r\n quote: '« Une citation qui met en valeur votre message. »',\r\n html: '<p style=\"margin:0;text-align:center;font-family:sans-serif\">Votre <strong>HTML</strong> personnalisé</p>',\r\n cardTitle: 'Le saviez-vous ?',\r\n cardText: 'Un encadré attire l’œil sur une information importante.',\r\n logo: 'LOGO',\r\n heroTitle: 'Les nouveautés de la saison',\r\n heroText: 'Découvrez notre sélection pensée pour vous, disponible dès aujourd’hui.',\r\n heroButton: 'Découvrir',\r\n productA: 'Produit A',\r\n productB: 'Produit B',\r\n productText: 'Une courte description du produit.',\r\n productButton: 'Acheter',\r\n features: ['Livraison offerte', 'Retours gratuits', 'Support 7j/7'],\r\n featureText: 'Un argument clair et concis.',\r\n testimonialQuote: '« Service impeccable, je recommande les yeux fermés. »',\r\n testimonialAuthor: '— Camille, cliente depuis 2021',\r\n footerAddress: 'Acme SAS · 10 rue de la Paix, 75002 Paris',\r\n unsubscribe: 'Se désinscrire',\r\n starterTitle: 'Nos coups de cœur',\r\n },\r\n slashCommands: {\r\n Text: { title: 'Texte', description: 'Paragraphe simple' },\r\n Title: { title: 'Titre', description: 'Grand titre' },\r\n Subtitle: { title: 'Sous-titre', description: 'Titre moyen' },\r\n Heading: { title: 'Intertitre', description: 'Petit titre' },\r\n 'Bullet list': { title: 'Liste à puces', description: 'Liste non ordonnée' },\r\n 'Numbered list': { title: 'Liste numérotée', description: 'Liste ordonnée' },\r\n Quote: { title: 'Citation', description: 'Bloc de citation' },\r\n 'Code block': { title: 'Bloc de code', description: 'Extrait de code' },\r\n Button: { title: 'Bouton', description: 'Bouton cliquable' },\r\n Divider: { title: 'Séparateur', description: 'Ligne horizontale' },\r\n Section: { title: 'Section', description: 'Section de contenu' },\r\n '2 columns': { title: '2 colonnes', description: 'Mise en page sur deux colonnes' },\r\n '3 columns': { title: '3 colonnes', description: 'Mise en page sur trois colonnes' },\r\n '4 columns': { title: '4 colonnes', description: 'Mise en page sur quatre colonnes' },\r\n },\r\n};\r\n","import { en, type Messages } from './en';\nimport { fr } from './fr';\n\nexport { en, fr, type Messages };\n\n/** Built-in locales. Pass your own `messages` to support any other language. */\nexport const locales = { en, fr } as const;\n\nexport type BuiltInLocale = keyof typeof locales;\n\nexport interface I18n {\n locale: string;\n t: Messages;\n}\n\n/**\n * A user-facing string: plain text, or a function of the current locale.\n * Lets custom palette items and templates follow the editor's language.\n */\nexport type Label = string | ((i18n: I18n) => string);\n\nexport function resolveLabel(label: Label, i18n: I18n): string {\n return typeof label === 'function' ? label(i18n) : label;\n}\n\ntype DeepPartial<T> = {\n [K in keyof T]?: T[K] extends (...args: never[]) => unknown\n ? T[K]\n : T[K] extends readonly unknown[]\n ? T[K]\n : T[K] extends object\n ? DeepPartial<T[K]>\n : T[K];\n};\n\nexport type PartialMessages = DeepPartial<Messages>;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction merge<T>(base: T, patch: unknown): T {\n if (!isPlainObject(patch) || !isPlainObject(base)) return (patch ?? base) as T;\n const result: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n result[key] = isPlainObject(value) && isPlainObject(result[key]) ? merge(result[key], value) : value;\n }\n return result as T;\n}\n\n/** Built-in locale (falls back to English) with optional overrides on top. */\nexport function resolveMessages(locale: string, overrides?: PartialMessages): Messages {\n const base = (locales as Record<string, Messages>)[locale] ?? en;\n return overrides ? merge(base, overrides) : base;\n}\n","/** Icons missing from @react-email/editor/ui. All accept a `size` like the package's icons. */\n\ninterface IconProps {\n size?: number;\n}\n\nconst stroke = (size: number, strokeWidth = 2) => ({\n viewBox: '0 0 24 24',\n width: size,\n height: size,\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n 'aria-hidden': true,\n});\n\nexport const GripIcon = ({ size = 14 }: IconProps) => (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"currentColor\" aria-hidden>\n {[6, 12, 18].map((y) => (\n <g key={y}>\n <circle cx=\"9\" cy={y} r=\"1.6\" />\n <circle cx=\"15\" cy={y} r=\"1.6\" />\n </g>\n ))}\n </svg>\n);\n\nexport const CopyIcon = ({ size = 14 }: IconProps) => (\n <svg {...stroke(size)}>\n <rect x=\"8\" y=\"8\" width=\"12\" height=\"12\" rx=\"2\" />\n <path d=\"M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2\" />\n </svg>\n);\n\nexport const TrashIcon = ({ size = 14 }: IconProps) => (\n <svg {...stroke(size)}>\n <path d=\"M4 7h16M10 11v6M14 11v6M6 7l1 12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l1-12M9 7V4h6v3\" />\n </svg>\n);\n\nexport const ParentIcon = ({ size = 14 }: IconProps) => (\n <svg {...stroke(size)}>\n <path d=\"M12 19V5M6 11l6-6 6 6\" />\n </svg>\n);\n\nexport const UndoIcon = ({ size = 16 }: IconProps) => (\n <svg {...stroke(size)}>\n <path d=\"M9 14 4 9l5-5\" />\n <path d=\"M4 9h10.5a5.5 5.5 0 0 1 0 11H11\" />\n </svg>\n);\n\nexport const RedoIcon = ({ size = 16 }: IconProps) => (\n <svg {...stroke(size)}>\n <path d=\"m15 14 5-5-5-5\" />\n <path d=\"M20 9H9.5a5.5 5.5 0 0 0 0 11H13\" />\n </svg>\n);\n\nexport const DesktopIcon = ({ size = 16 }: IconProps) => (\n <svg {...stroke(size)}>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"12\" rx=\"2\" />\n <path d=\"M8 20h8M12 16v4\" />\n </svg>\n);\n\nexport const MobileIcon = ({ size = 16 }: IconProps) => (\n <svg {...stroke(size)}>\n <rect x=\"7\" y=\"2\" width=\"10\" height=\"20\" rx=\"2\" />\n <path d=\"M11 18h2\" />\n </svg>\n);\n\nexport const LayersIcon = ({ size = 16 }: IconProps) => (\n <svg {...stroke(size)}>\n <path d=\"m12 3 9 5-9 5-9-5 9-5Z\" />\n <path d=\"m3 13 9 5 9-5\" />\n </svg>\n);\n\nexport const PipetteIcon = ({ size = 15 }: IconProps) => (\n <svg {...stroke(size)}>\n <path d=\"m2 22 1-1h3l9-9\" />\n <path d=\"M3 21v-3l9-9\" />\n <path d=\"m15 6 3.4-3.4a2.1 2.1 0 1 1 3 3L18 9l.4.4a2.1 2.1 0 1 1-3 3l-3.8-3.8a2.1 2.1 0 1 1 3-3l.4.4Z\" />\n </svg>\n);\n\n/** Layers-panel spacer icon (small). */\nexport const SpacerIcon = ({ size = 14 }: IconProps) => (\n <svg {...stroke(size)}>\n <path d=\"M4 4h16M4 20h16M12 8v8\" />\n </svg>\n);\n\n/** Palette spacer icon (with arrows). */\nexport const SpacerTileIcon = ({ size = 22 }: IconProps) => (\n <svg {...stroke(size, 1.8)}>\n <path d=\"M4 4h16M4 20h16M12 7v10M9 9.5 12 7l3 2.5M9 14.5l3 2.5 3-2.5\" />\n </svg>\n);\n\nexport const SocialIcon = ({ size = 22 }: IconProps) => (\n <svg {...stroke(size, 1.8)}>\n <circle cx=\"6\" cy=\"12\" r=\"2.5\" />\n <circle cx=\"18\" cy=\"6\" r=\"2.5\" />\n <circle cx=\"18\" cy=\"18\" r=\"2.5\" />\n <path d=\"m8.2 10.8 7.6-3.6M8.2 13.2l7.6 3.6\" />\n </svg>\n);\n\nexport const OneColumnIcon = ({ size = 22 }: IconProps) => (\n <svg {...stroke(size, 1.8)}>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n </svg>\n);\n","import * as Popover from '@radix-ui/react-popover';\nimport { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { HexColorInput, HexColorPicker } from 'react-colorful';\nimport { AlignCenterIcon, AlignLeftIcon, AlignRightIcon, EditorFocusScope } from '@react-email/editor/ui';\nimport { useMessages } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { PipetteIcon } from './icons';\n\n/**\n * Form controls of the properties panel. Exported so custom inspectors look\n * like the built-in ones. Text-like inputs commit on blur / Enter to avoid\n * spamming editor transactions.\n */\n\nexport interface GroupProps extends StyleProps {\n title: string;\n children: ReactNode;\n defaultOpen?: boolean;\n}\n\n/** Collapsible section of the properties panel. */\nexport function Group({ title, children, defaultOpen = true, className, style }: GroupProps) {\n const [open, setOpen] = useState(defaultOpen);\n return (\n <section className={cx('bree-group', className)} style={style}>\n <button type=\"button\" className=\"bree-group-header\" onClick={() => setOpen(!open)} aria-expanded={open}>\n <span>{title}</span>\n <span className={cx('bree-chevron', open && 'bree-open')} aria-hidden>\n ›\n </span>\n </button>\n {open && <div className=\"bree-group-body\">{children}</div>}\n </section>\n );\n}\n\nexport interface FieldProps extends StyleProps {\n label: string;\n children: ReactNode;\n /** Label above the control instead of beside it. */\n stacked?: boolean;\n}\n\nexport function Field({ label, children, stacked, className, style }: FieldProps) {\n return (\n <label className={cx('bree-field', stacked && 'bree-stacked', className)} style={style}>\n <span className=\"bree-field-label\">{label}</span>\n <span className=\"bree-field-control\">{children}</span>\n </label>\n );\n}\n\n/** Local draft that resets whenever the external value changes. */\nfunction useDraft<T>(value: T) {\n const [draft, setDraft] = useState(value);\n const [synced, setSynced] = useState(value);\n if (!Object.is(value, synced)) {\n setSynced(value);\n setDraft(value);\n }\n return [draft, setDraft] as const;\n}\n\nexport interface TextInputProps extends StyleProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n type?: string;\n}\n\nexport function TextInput({ value, onChange, placeholder, type = 'text', className, style }: TextInputProps) {\n const [draft, setDraft] = useDraft(value);\n return (\n <input\n className={cx('bree-input', className)}\n style={style}\n type={type}\n value={draft}\n placeholder={placeholder}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => draft !== value && onChange(draft)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onChange(draft);\n }}\n />\n );\n}\n\nexport interface TextAreaProps extends StyleProps {\n value: string;\n onChange: (value: string) => void;\n rows?: number;\n}\n\nexport function TextArea({ value, onChange, rows = 8, className, style }: TextAreaProps) {\n const [draft, setDraft] = useDraft(value);\n return (\n <textarea\n className={cx('bree-input bree-textarea', className)}\n style={style}\n rows={rows}\n value={draft}\n spellCheck={false}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => draft !== value && onChange(draft)}\n />\n );\n}\n\nfunction toNumber(value: unknown): number | '' {\n if (value === undefined || value === null || value === '' || value === 'auto') return '';\n const n = Number.parseFloat(String(value));\n return Number.isFinite(n) ? n : '';\n}\n\nexport interface NumberInputProps extends StyleProps {\n value: unknown;\n onChange: (value: number | '') => void;\n unit?: string;\n min?: number;\n max?: number;\n step?: number;\n placeholder?: string;\n}\n\n/** Number with a unit suffix. Arrow keys step (Shift = ×10). Empty means \"auto\". */\nexport function NumberInput({ value, onChange, unit = 'px', min = 0, max, step = 1, placeholder, className, style }: NumberInputProps) {\n const t = useMessages();\n const [draft, setDraft] = useDraft<string>(String(toNumber(value)));\n const commit = (raw: string) => {\n if (raw.trim() === '') return onChange('');\n const n = Number.parseFloat(raw);\n if (Number.isFinite(n)) onChange(Math.max(min, max !== undefined ? Math.min(max, n) : n));\n };\n return (\n <span className={cx('bree-number', className)} style={style}>\n <input\n className=\"bree-input\"\n inputMode=\"decimal\"\n value={draft}\n placeholder={placeholder ?? t.fields.auto}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => commit(draft)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commit(draft);\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const current = toNumber(draft) || 0;\n const next = current + (e.key === 'ArrowUp' ? step : -step) * (e.shiftKey ? 10 : 1);\n setDraft(String(next));\n commit(String(next));\n }\n }}\n />\n {unit && <span className=\"bree-unit\">{unit}</span>}\n </span>\n );\n}\n\nexport interface RangeInputProps extends StyleProps {\n value: unknown;\n onChange: (value: number) => void;\n min: number;\n max: number;\n unit?: string;\n}\n\nexport function RangeInput({ value, onChange, min, max, unit = 'px', className, style }: RangeInputProps) {\n const n = toNumber(value) || min;\n return (\n <span className={cx('bree-range', className)} style={style}>\n <input type=\"range\" min={min} max={max} value={n} onChange={(e) => onChange(Number(e.target.value))} />\n <span className=\"bree-range-value\">\n {n}\n {unit}\n </span>\n </span>\n );\n}\n\nexport const DEFAULT_SWATCHES = [\n '#111827', '#374151', '#6b7280', '#d1d5db', '#f3f4f6', '#ffffff',\n '#ef4444', '#f97316', '#f59e0b', '#10b981', '#0ea5e9', '#2563eb',\n '#4f46e5', '#7c3aed', '#db2777', '#eef2ff', '#ecfdf5', '#fef3c7',\n];\n\n/** \"#abc\" / \"#aabbcc\" / \"rgb(1, 2, 3)\" -> \"#aabbcc\" (null when not a plain color). */\nexport function toHex(color: string): string | null {\n const c = color.trim().toLowerCase();\n if (/^#[0-9a-f]{6}$/.test(c)) return c;\n if (/^#[0-9a-f]{3}$/.test(c)) return `#${[...c.slice(1)].map((x) => x + x).join('')}`;\n const rgb = c.match(/^rgba?\\(\\s*(\\d+)[\\s,]+(\\d+)[\\s,]+(\\d+)/);\n if (rgb) return `#${rgb.slice(1, 4).map((n) => Number(n).toString(16).padStart(2, '0')).join('')}`;\n return null;\n}\n\ntype EyeDropperCtor = new () => { open: () => Promise<{ sRGBHex: string }> };\n\nexport interface ColorInputProps extends StyleProps {\n value: unknown;\n onChange: (value: string) => void;\n /** Colors already used in the document, offered first. */\n presets?: string[];\n /** Palette of the picker. */\n swatches?: string[];\n placeholder?: string;\n /** Class name of the (portaled) picker popover. */\n popoverClassName?: string;\n}\n\n/**\n * Color field: swatch + hex text, opening a react-colorful picker in a Radix\n * popover. The popover is portaled out of the sidebar, so it is wrapped in an\n * EditorFocusScope: interacting with it keeps the block selected.\n */\nexport function ColorInput({\n value,\n onChange,\n presets = [],\n swatches = DEFAULT_SWATCHES,\n placeholder,\n className,\n style,\n popoverClassName,\n}: ColorInputProps) {\n const t = useMessages();\n const emptyLabel = placeholder ?? t.fields.colorDefault;\n const raw = typeof value === 'string' ? value : '';\n const hex = toHex(raw);\n const [open, setOpen] = useState(false);\n const [draft, setDraft] = useState(hex ?? '#ffffff');\n const onChangeRef = useRef(onChange);\n useEffect(() => {\n onChangeRef.current = onChange;\n });\n const pending = useRef<string | null>(null);\n const timer = useRef(0);\n\n const flush = () => {\n window.clearTimeout(timer.current);\n timer.current = 0;\n if (pending.current) onChangeRef.current(pending.current);\n pending.current = null;\n };\n // Dragging in the picker fires continuously: commit at most every 60ms.\n const live = (color: string) => {\n setDraft(color);\n pending.current = color;\n if (!timer.current) timer.current = window.setTimeout(flush, 60);\n };\n const commit = (color: string) => {\n pending.current = null;\n window.clearTimeout(timer.current);\n timer.current = 0;\n setDraft(toHex(color) ?? draft);\n onChangeRef.current(color);\n };\n\n const EyeDropper = typeof window !== 'undefined' ? (window as unknown as { EyeDropper?: EyeDropperCtor }).EyeDropper : undefined;\n const documentColors = [...new Set(presets.map((c) => toHex(c)).filter((c): c is string => !!c))].slice(0, 9);\n\n return (\n <Popover.Root\n open={open}\n onOpenChange={(next) => {\n if (next) setDraft(hex ?? '#ffffff');\n else flush();\n setOpen(next);\n }}\n >\n <span className={cx('bree-color-field', className)} style={style}>\n <Popover.Trigger asChild>\n <button\n type=\"button\"\n className={cx('bree-color-trigger', !hex && 'bree-empty')}\n style={hex ? { background: hex } : undefined}\n aria-label={t.fields.chooseColor(raw || emptyLabel)}\n />\n </Popover.Trigger>\n <TextInput value={raw} onChange={onChange} placeholder={emptyLabel} />\n </span>\n <Popover.Portal>\n <EditorFocusScope>\n <Popover.Content\n // Portaled outside the editor root: `bree` brings the theme variables along.\n className={cx('bree bree-color-popover', popoverClassName)}\n side=\"left\"\n align=\"start\"\n sideOffset={10}\n collisionPadding={12}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <HexColorPicker color={draft} onChange={live} />\n <div className=\"bree-color-popover-row\">\n <span className=\"bree-color-preview\" style={{ background: draft }} />\n <label className=\"bree-hex-field\">\n <span>#</span>\n <HexColorInput color={draft} onChange={commit} aria-label={t.fields.hexCode} />\n </label>\n {EyeDropper && (\n <button\n type=\"button\"\n className=\"bree-icon-button\"\n title={t.fields.eyedropper}\n onClick={() =>\n new EyeDropper()\n .open()\n .then((result) => commit(result.sRGBHex))\n .catch(() => {})\n }\n >\n <PipetteIcon />\n </button>\n )}\n </div>\n {documentColors.length > 0 && (\n <>\n <span className=\"bree-color-popover-title\">{t.fields.documentColors}</span>\n <div className=\"bree-swatches\">\n {documentColors.map((swatch) => (\n <button key={swatch} type=\"button\" className=\"bree-swatch\" style={{ background: swatch }} title={swatch} onClick={() => commit(swatch)} />\n ))}\n </div>\n </>\n )}\n <span className=\"bree-color-popover-title\">{t.fields.palette}</span>\n <div className=\"bree-swatches\">\n {swatches.map((swatch) => (\n <button\n key={swatch}\n type=\"button\"\n className={cx('bree-swatch', swatch === draft && 'bree-active')}\n style={{ background: swatch }}\n title={swatch}\n onClick={() => commit(swatch)}\n />\n ))}\n </div>\n <button\n type=\"button\"\n className=\"bree-color-reset\"\n onClick={() => {\n pending.current = null;\n onChangeRef.current('');\n setOpen(false);\n }}\n >\n {t.fields.resetColor}\n </button>\n </Popover.Content>\n </EditorFocusScope>\n </Popover.Portal>\n </Popover.Root>\n );\n}\n\nexport interface SelectProps extends StyleProps {\n value: string;\n onChange: (value: string) => void;\n /** [value, label] pairs. */\n options: Array<[string, string]>;\n}\n\nexport function Select({ value, onChange, options, className, style }: SelectProps) {\n return (\n <select className={cx('bree-input bree-select', className)} style={style} value={value} onChange={(e) => onChange(e.target.value)}>\n {options.map(([v, label]) => (\n <option key={v} value={v}>\n {label}\n </option>\n ))}\n </select>\n );\n}\n\nexport interface SegmentedProps<T extends string> extends StyleProps {\n value: T;\n onChange: (value: T) => void;\n options: Array<{ value: T; label: ReactNode; title?: string }>;\n ariaLabel?: string;\n}\n\nexport function Segmented<T extends string>({ value, onChange, options, ariaLabel, className, style }: SegmentedProps<T>) {\n return (\n <span className={cx('bree-segmented', className)} style={style} role=\"radiogroup\" aria-label={ariaLabel}>\n {options.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={value === option.value}\n title={option.title}\n className={cx(value === option.value && 'bree-active')}\n onClick={() => onChange(option.value)}\n >\n {option.label}\n </button>\n ))}\n </span>\n );\n}\n\nexport interface AlignInputProps extends StyleProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nexport function AlignInput({ value, onChange, className, style }: AlignInputProps) {\n const t = useMessages();\n return (\n <Segmented\n className={className}\n style={style}\n value={value || 'left'}\n onChange={onChange}\n options={[\n { value: 'left', label: <AlignLeftIcon size={14} />, title: t.fields.alignLeft },\n { value: 'center', label: <AlignCenterIcon size={14} />, title: t.fields.alignCenter },\n { value: 'right', label: <AlignRightIcon size={14} />, title: t.fields.alignRight },\n ]}\n />\n );\n}\n\nexport type Side = 'Top' | 'Right' | 'Bottom' | 'Left';\n\nexport interface PaddingInputProps extends StyleProps {\n get: (side: Side) => unknown;\n set: (changes: Array<[side: Side, value: number | '']>) => void;\n}\n\n/** One value for the four sides, or four values with \"More options\". */\nexport function PaddingInput({ get, set, className, style }: PaddingInputProps) {\n const t = useMessages();\n const sides = ['Top', 'Right', 'Bottom', 'Left'] as const;\n const values = sides.map((side) => toNumber(get(side)));\n const uniform = values.every((v) => v === values[0]);\n const [expanded, setExpanded] = useState(!uniform);\n const labels = { Top: t.fields.top, Right: t.fields.right, Bottom: t.fields.bottom, Left: t.fields.left };\n return (\n <div className={cx('bree-padding', className)} style={style}>\n {expanded ? (\n <div className=\"bree-padding-grid\">\n {sides.map((side, i) => (\n <label key={side} className=\"bree-padding-side\">\n <span>{labels[side]}</span>\n <NumberInput value={values[i]} onChange={(v) => set([[side, v]])} />\n </label>\n ))}\n </div>\n ) : (\n <NumberInput value={values[0]} onChange={(v) => set(sides.map((side) => [side, v]))} />\n )}\n <label className=\"bree-checkbox\">\n <input type=\"checkbox\" checked={expanded} onChange={(e) => setExpanded(e.target.checked)} />\n {t.fields.moreOptions}\n </label>\n </div>\n );\n}\n","import type { InspectorNodeContext } from '@react-email/editor/ui';\nimport type { KnownCssProperties } from '@react-email/editor/plugins';\nimport { useMessages } from '../../context';\nimport type { StyleProps } from '../../core/cx';\nimport { AlignInput, ColorInput, Field, Group, NumberInput, PaddingInput, Select } from '../fields';\n\n/** Reusable groups of controls, shared by the built-in inspectors. */\n\nexport const css = (prop: string) => prop as KnownCssProperties;\n\nexport type StyleContext = Pick<InspectorNodeContext, 'getStyle' | 'setStyle' | 'presetColors'>;\n\nexport interface TypographyGroupProps extends StyleProps {\n ctx: StyleContext;\n alignment?: string;\n /** Shows the alignment control when set. */\n setAlignment?: (value: string) => void;\n}\n\nexport function TypographyGroup({ ctx, alignment, setAlignment, className, style }: TypographyGroupProps) {\n const t = useMessages();\n const i = t.inspector;\n return (\n <Group title={i.typography} className={className} style={style}>\n <Field label={i.color} stacked>\n <ColorInput value={ctx.getStyle(css('color'))} presets={ctx.presetColors} onChange={(v) => ctx.setStyle(css('color'), v)} />\n </Field>\n <Field label={i.size}>\n <NumberInput value={ctx.getStyle(css('fontSize'))} onChange={(v) => ctx.setStyle(css('fontSize'), v)} min={8} max={96} />\n </Field>\n <Field label={i.weight}>\n <Select\n value={String(ctx.getStyle(css('fontWeight')) ?? '400')}\n onChange={(v) => ctx.setStyle(css('fontWeight'), v)}\n options={[\n ['300', i.weightLight],\n ['400', i.weightNormal],\n ['600', i.weightSemibold],\n ['700', i.weightBold],\n ['800', i.weightExtrabold],\n ]}\n />\n </Field>\n <Field label={i.lineHeight}>\n <NumberInput value={ctx.getStyle(css('lineHeight'))} unit=\"%\" onChange={(v) => ctx.setStyle(css('lineHeight'), v)} min={80} max={300} step={5} />\n </Field>\n {setAlignment && (\n <Field label={i.alignment}>\n <AlignInput value={alignment ?? 'left'} onChange={setAlignment} />\n </Field>\n )}\n </Group>\n );\n}\n\nexport interface SpacingGroupProps extends StyleProps {\n ctx: InspectorNodeContext;\n title?: string;\n}\n\nexport function SpacingGroup({ ctx, title, className, style }: SpacingGroupProps) {\n const t = useMessages();\n return (\n <Group title={title ?? t.inspector.spacing} className={className} style={style}>\n <Field label={t.inspector.padding} stacked>\n <PaddingInput\n get={(side) => ctx.getStyle(css(`padding${side}`)) ?? ctx.getStyle(css('padding'))}\n set={(changes) =>\n ctx.batchSetStyle([\n // Drop any shorthand so the four longhands are the single source of truth.\n { prop: css('padding'), value: '' },\n ...changes.map(([side, value]) => ({ prop: css(`padding${side}`), value })),\n ])\n }\n />\n </Field>\n </Group>\n );\n}\n\nexport interface BoxGroupProps extends StyleProps {\n ctx: InspectorNodeContext;\n}\n\nexport function BoxGroup({ ctx, className, style }: BoxGroupProps) {\n const t = useMessages();\n const i = t.inspector;\n return (\n <Group title={i.box} className={className} style={style}>\n <Field label={i.backgroundColor} stacked>\n <ColorInput value={ctx.getStyle(css('backgroundColor'))} presets={ctx.presetColors} onChange={(v) => ctx.setStyle(css('backgroundColor'), v)} />\n </Field>\n <Field label={i.radius}>\n <NumberInput value={ctx.getStyle(css('borderRadius'))} onChange={(v) => ctx.setStyle(css('borderRadius'), v)} />\n </Field>\n <Field label={i.border}>\n <NumberInput\n value={ctx.getStyle(css('borderWidth'))}\n onChange={(v) =>\n ctx.batchSetStyle([\n { prop: css('borderWidth'), value: v },\n { prop: css('borderStyle'), value: v ? 'solid' : '' },\n ])\n }\n />\n </Field>\n <Field label={i.borderColor} stacked>\n <ColorInput value={ctx.getStyle(css('borderColor'))} presets={ctx.presetColors} onChange={(v) => ctx.setStyle(css('borderColor'), v)} />\n </Field>\n </Group>\n );\n}\n","import { useMessages } from '../../context';\nimport { cx } from '../../core/cx';\nimport type { InspectorProps } from '../../registry/types';\nimport { AlignInput, ColorInput, Field, Group, NumberInput, TextInput } from '../fields';\nimport { css, SpacingGroup } from './groups';\n\nexport function ButtonInspector({ ctx, className, style }: InspectorProps) {\n const t = useMessages();\n const i = t.inspector;\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={i.action}>\n <Field label={i.linkUrl} stacked>\n <TextInput value={String(ctx.getAttr('href') ?? '')} onChange={(v) => ctx.setAttr('href', v)} placeholder=\"https://\" />\n </Field>\n </Group>\n <Group title={i.button}>\n <Field label={i.alignment}>\n <AlignInput value={String(ctx.getAttr('alignment') ?? 'left')} onChange={(v) => ctx.setAttr('alignment', v)} />\n </Field>\n <Field label={i.backgroundColor} stacked>\n <ColorInput value={ctx.getStyle(css('backgroundColor'))} presets={ctx.presetColors} onChange={(v) => ctx.setStyle(css('backgroundColor'), v)} />\n </Field>\n <Field label={i.textColor} stacked>\n <ColorInput value={ctx.getStyle(css('color'))} presets={ctx.presetColors} onChange={(v) => ctx.setStyle(css('color'), v)} />\n </Field>\n <Field label={i.textSize}>\n <NumberInput value={ctx.getStyle(css('fontSize'))} onChange={(v) => ctx.setStyle(css('fontSize'), v)} min={8} max={48} />\n </Field>\n <Field label={i.radius}>\n <NumberInput value={ctx.getStyle(css('borderRadius'))} onChange={(v) => ctx.setStyle(css('borderRadius'), v)} />\n </Field>\n </Group>\n <SpacingGroup ctx={ctx} title={i.buttonPadding} />\n </div>\n );\n}\n","import { NodeSelection } from '@tiptap/pm/state';\nimport { useEmailEditor } from '../../context';\nimport { cx } from '../../core/cx';\nimport type { InspectorProps } from '../../registry/types';\nimport { Field, Group, NumberInput } from '../fields';\n\n/** Rows of 2, 3 or 4 columns: width presets and gap. */\nexport function ColumnsInspector({ ctx, className, style }: InspectorProps) {\n const { editor, t } = useEmailEditor();\n const i = t.inspector;\n const count = ({ twoColumns: 2, threeColumns: 3, fourColumns: 4 } as Record<string, number>)[ctx.nodeType] ?? 2;\n const presets: Array<[string, number[]]> =\n count === 2\n ? [\n ['50 / 50', [50, 50]],\n ['33 / 67', [33, 67]],\n ['67 / 33', [67, 33]],\n ['25 / 75', [25, 75]],\n ]\n : count === 3\n ? [\n [i.equal, [33.33, 33.33, 33.34]],\n ['25 / 50 / 25', [25, 50, 25]],\n ]\n : [[i.equal, [25, 25, 25, 25]]];\n\n const applyWidths = (widths: number[]) => {\n const { state } = editor;\n const row = state.doc.nodeAt(ctx.nodePos.pos);\n if (!row) return;\n const tr = state.tr;\n row.forEach((col, offset, index) => {\n const pos = ctx.nodePos.pos + 1 + offset;\n const rest = String(col.attrs.style ?? '')\n .split(';')\n .filter((d) => d.trim() && !d.trim().startsWith('width'))\n .join(';');\n tr.setNodeMarkup(pos, undefined, { ...col.attrs, style: `${rest ? `${rest};` : ''}width:${widths[index]}%` });\n });\n if (state.selection instanceof NodeSelection) tr.setSelection(NodeSelection.create(tr.doc, ctx.nodePos.pos));\n editor.view.dispatch(tr);\n };\n\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={i.columns}>\n <Field label={i.distribution} stacked>\n <div className=\"bree-ratio-grid\">\n {presets.map(([label, widths]) => (\n <button key={label} type=\"button\" className=\"bree-ratio\" onClick={() => applyWidths(widths)}>\n <span className=\"bree-ratio-bars\">\n {widths.map((w, index) => (\n <i key={index} style={{ flex: w }} />\n ))}\n </span>\n {label}\n </button>\n ))}\n </div>\n </Field>\n <Field label={i.columnGap}>\n <NumberInput value={ctx.getAttr('cellspacing') ?? 0} onChange={(v) => ctx.setAttr('cellspacing', v === '' ? null : v)} />\n </Field>\n <p className=\"bree-hint\">{i.columnsHint}</p>\n </Group>\n </div>\n );\n}\n","import { useMessages } from '../../context';\nimport { cx } from '../../core/cx';\nimport type { InspectorProps } from '../../registry/types';\nimport { Field, Group, Segmented } from '../fields';\nimport { BoxGroup, SpacingGroup, TypographyGroup } from './groups';\n\nexport function HeadingInspector({ ctx, className, style }: InspectorProps) {\n const t = useMessages();\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={t.inspector.heading}>\n <Field label={t.inspector.level}>\n <Segmented\n value={String(ctx.getAttr('level') ?? 1)}\n onChange={(v) => ctx.setAttr('level', Number(v))}\n options={[\n { value: '1', label: 'H1' },\n { value: '2', label: 'H2' },\n { value: '3', label: 'H3' },\n ]}\n />\n </Field>\n </Group>\n <TypographyGroup ctx={ctx} alignment={String(ctx.getAttr('alignment') ?? 'left')} setAlignment={(v) => ctx.setAttr('alignment', v)} />\n <SpacingGroup ctx={ctx} />\n <BoxGroup ctx={ctx} />\n </div>\n );\n}\n","import { useEmailEditor } from '../../context';\nimport { cx } from '../../core/cx';\nimport type { InspectorProps } from '../../registry/types';\nimport { AlignInput, Field, Group, NumberInput, RangeInput, TextInput } from '../fields';\nimport { css, SpacingGroup } from './groups';\n\nexport function ImageInspector({ ctx, className, style }: InspectorProps) {\n const { t, uploadImage } = useEmailEditor();\n const i = t.inspector;\n const width = String(ctx.getAttr('width') ?? 'auto');\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={i.image}>\n <div className=\"bree-image-preview\">{ctx.getAttr('src') ? <img src={String(ctx.getAttr('src'))} alt=\"\" /> : null}</div>\n <label className=\"bree-button-like\">\n {i.uploadImage}\n <input\n type=\"file\"\n accept=\"image/*\"\n hidden\n onChange={async (e) => {\n const file = e.target.files?.[0];\n if (file) ctx.setAttr('src', (await uploadImage(file)).url);\n e.target.value = '';\n }}\n />\n </label>\n <Field label={i.imageUrl} stacked>\n <TextInput value={String(ctx.getAttr('src') ?? '')} onChange={(v) => ctx.setAttr('src', v)} />\n </Field>\n <Field label={i.altText} stacked>\n <TextInput value={String(ctx.getAttr('alt') ?? '')} onChange={(v) => ctx.setAttr('alt', v)} placeholder={i.altPlaceholder} />\n </Field>\n </Group>\n <Group title={i.layout}>\n <Field label={i.autoWidth}>\n <input type=\"checkbox\" checked={width === 'auto'} onChange={(e) => ctx.setAttr('width', e.target.checked ? 'auto' : '300')} />\n </Field>\n {width !== 'auto' && (\n <Field label={i.width}>\n <RangeInput value={width} min={20} max={900} onChange={(v) => ctx.setAttr('width', String(v))} />\n </Field>\n )}\n <Field label={i.alignment}>\n <AlignInput value={String(ctx.getAttr('alignment') ?? 'center')} onChange={(v) => ctx.setAttr('alignment', v)} />\n </Field>\n <Field label={i.radius}>\n <NumberInput value={ctx.getStyle(css('borderRadius'))} onChange={(v) => ctx.setStyle(css('borderRadius'), v)} />\n </Field>\n </Group>\n <Group title={i.action}>\n <Field label={i.clickLink} stacked>\n <TextInput value={String(ctx.getAttr('href') ?? '')} onChange={(v) => ctx.setAttr('href', v || null)} placeholder=\"https://\" />\n </Field>\n </Group>\n <SpacingGroup ctx={ctx} />\n </div>\n );\n}\n","import { useMessages } from '../../context';\nimport { cx } from '../../core/cx';\nimport type { InspectorProps } from '../../registry/types';\nimport { ColorInput, Field, Group, NumberInput, RangeInput, Segmented, TextArea } from '../fields';\nimport { BoxGroup, css, SpacingGroup } from './groups';\n\nexport function SpacerInspector({ ctx, className, style }: InspectorProps) {\n const t = useMessages();\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={t.inspector.spacer}>\n <Field label={t.inspector.height}>\n <RangeInput value={ctx.getAttr('height')} min={4} max={160} onChange={(v) => ctx.setAttr('height', v)} />\n </Field>\n </Group>\n </div>\n );\n}\n\nexport function HtmlInspector({ ctx, className, style }: InspectorProps) {\n const t = useMessages();\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={t.inspector.htmlCode}>\n <TextArea value={String(ctx.getAttr('html') ?? '')} onChange={(v) => ctx.setAttr('html', v)} rows={14} />\n <p className=\"bree-hint\">{t.inspector.htmlHint}</p>\n </Group>\n </div>\n );\n}\n\nexport function DividerInspector({ ctx, className, style }: InspectorProps) {\n const t = useMessages();\n const i = t.inspector;\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={i.line}>\n <Field label={i.color} stacked>\n <ColorInput value={ctx.getStyle(css('borderTopColor'))} presets={ctx.presetColors} onChange={(v) => ctx.setStyle(css('borderTopColor'), v)} />\n </Field>\n <Field label={i.thickness}>\n <NumberInput\n value={ctx.getStyle(css('borderTopWidth')) ?? 1}\n onChange={(v) =>\n ctx.batchSetStyle([\n { prop: css('borderTopWidth'), value: v },\n { prop: css('borderTopStyle'), value: 'solid' },\n ])\n }\n min={1}\n max={12}\n />\n </Field>\n <Field label={i.lineStyle}>\n <Segmented\n value={String(ctx.getStyle(css('borderTopStyle')) ?? 'solid')}\n onChange={(v) => ctx.setStyle(css('borderTopStyle'), v)}\n options={[\n { value: 'solid', label: '———' },\n { value: 'dashed', label: '- - -' },\n { value: 'dotted', label: '· · ·' },\n ]}\n />\n </Field>\n </Group>\n </div>\n );\n}\n\n/** Sections and columns: background, border and padding. */\nexport function ContainerInspector({ ctx, className, style }: InspectorProps) {\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <BoxGroup ctx={ctx} />\n <SpacingGroup ctx={ctx} />\n </div>\n );\n}\n","import type { CSSProperties } from 'react';\n\n/** \"padding-top: 4px; color: red\" -> { paddingTop: '4px', color: 'red' } */\nexport function inlineStyleToObject(style: unknown): CSSProperties {\n if (typeof style !== 'string' || !style.trim()) return {};\n const result: Record<string, string> = {};\n for (const declaration of style.split(';')) {\n const index = declaration.indexOf(':');\n if (index === -1) continue;\n const prop = declaration.slice(0, index).trim();\n const value = declaration.slice(index + 1).trim();\n if (!prop || !value) continue;\n result[prop.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] =\n value;\n }\n return result as CSSProperties;\n}\n","import { mergeAttributes } from '@tiptap/core';\nimport { EmailNode } from '@react-email/editor/core';\nimport { Column, Img, Link, Row, Section } from 'react-email';\nimport { inlineStyleToObject } from '../core/style-utils';\n\n/**\n * Custom email blocks built on the public `EmailNode` API: each node defines\n * how it renders in the editor (renderHTML / node view) AND how it renders in\n * the final email (renderToReactEmail). That second half is what makes the\n * export work with zero extra glue.\n */\n\nconst styleAttribute = {\n style: {\n default: null as string | null,\n parseHTML: (el: HTMLElement) => el.getAttribute('style'),\n renderHTML: (attrs: Record<string, unknown>) =>\n attrs.style ? { style: attrs.style } : {},\n },\n};\n\n// ---------------------------------------------------------------------------\n// Spacer\n// ---------------------------------------------------------------------------\n\nexport const Spacer = EmailNode.create({\n name: 'spacer',\n group: 'block',\n atom: true,\n selectable: true,\n\n addAttributes() {\n return {\n ...styleAttribute,\n height: {\n default: 32,\n parseHTML: (el: HTMLElement) => Number(el.dataset.height) || 32,\n renderHTML: (attrs: Record<string, unknown>) => ({\n 'data-height': attrs.height,\n }),\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"spacer\"]' }];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'spacer',\n class: 'node-spacer',\n style: `height:${Number(node.attrs.height)}px`,\n }),\n ];\n },\n\n renderToReactEmail({ node }) {\n const height = Number(node.attrs?.height ?? 32);\n return (\n <Section\n style={{\n height,\n lineHeight: `${height}px`,\n fontSize: '1px',\n ...inlineStyleToObject(node.attrs?.style),\n }}\n >\n {' '}\n </Section>\n );\n },\n});\n\n// ---------------------------------------------------------------------------\n// Social links\n// ---------------------------------------------------------------------------\n\nexport interface SocialLink {\n network: string;\n url: string;\n}\n\n/**\n * Icons come from the Simple Icons CDN. For maximum client support (Gmail\n * does not render SVG) host PNG versions and swap `iconUrl`.\n */\nexport const SOCIAL_NETWORKS: Record<\n string,\n { label: string; slug: string; color: string }\n> = {\n facebook: { label: 'Facebook', slug: 'facebook', color: '1877F2' },\n instagram: { label: 'Instagram', slug: 'instagram', color: 'E4405F' },\n x: { label: 'X', slug: 'x', color: '000000' },\n linkedin: { label: 'LinkedIn', slug: 'linkedin', color: '0A66C2' },\n youtube: { label: 'YouTube', slug: 'youtube', color: 'FF0000' },\n tiktok: { label: 'TikTok', slug: 'tiktok', color: '000000' },\n github: { label: 'GitHub', slug: 'github', color: '181717' },\n};\n\n// LinkedIn was removed from recent Simple Icons releases; pin an older one.\nconst ICON_OVERRIDES: Record<string, string> = {\n linkedin: 'https://cdn.jsdelivr.net/npm/simple-icons@9.21.0/icons/linkedin.svg',\n};\n\nexport function iconUrl(network: string) {\n if (ICON_OVERRIDES[network]) return ICON_OVERRIDES[network];\n const meta = SOCIAL_NETWORKS[network] ?? SOCIAL_NETWORKS.facebook;\n return `https://cdn.simpleicons.org/${meta.slug}/${meta.color}`;\n}\n\nfunction parseLinks(value: unknown): SocialLink[] {\n if (Array.isArray(value)) return value as SocialLink[];\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as SocialLink[];\n } catch {\n return [];\n }\n }\n return [];\n}\n\nexport const SocialLinks = EmailNode.create({\n name: 'socialLinks',\n group: 'block',\n atom: true,\n selectable: true,\n\n addAttributes() {\n return {\n ...styleAttribute,\n links: {\n default: [\n { network: 'facebook', url: 'https://facebook.com/' },\n { network: 'instagram', url: 'https://instagram.com/' },\n { network: 'x', url: 'https://x.com/' },\n { network: 'linkedin', url: 'https://linkedin.com/' },\n ] as SocialLink[],\n parseHTML: (el: HTMLElement) => parseLinks(el.dataset.links),\n renderHTML: (attrs: Record<string, unknown>) => ({\n 'data-links': JSON.stringify(attrs.links ?? []),\n }),\n },\n size: { default: 28 },\n gap: { default: 12 },\n alignment: { default: 'center' },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"social-links\"]' }];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const size = Number(node.attrs.size);\n const gap = Number(node.attrs.gap);\n const links = parseLinks(node.attrs.links);\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'social-links',\n class: 'node-socialLinks',\n alignment: node.attrs.alignment,\n }),\n ...links.map((link, i) => [\n 'span',\n {\n class: 'node-socialLinks-item',\n style: `margin-left:${i === 0 ? 0 : gap}px`,\n },\n [\n 'img',\n {\n src: iconUrl(link.network),\n width: String(size),\n height: String(size),\n alt: SOCIAL_NETWORKS[link.network]?.label ?? link.network,\n },\n ],\n ]),\n ];\n },\n\n renderToReactEmail({ node }) {\n const size = Number(node.attrs?.size ?? 28);\n const gap = Number(node.attrs?.gap ?? 12);\n const links = parseLinks(node.attrs?.links);\n const align = (node.attrs?.alignment ?? 'center') as\n | 'left'\n | 'center'\n | 'right';\n return (\n <Section style={inlineStyleToObject(node.attrs?.style)}>\n <Row>\n <Column align={align}>\n {links.map((link, i) => (\n <Link\n key={`${link.network}-${i}`}\n href={link.url}\n style={{\n display: 'inline-block',\n marginLeft: i === 0 ? 0 : gap,\n }}\n >\n <Img\n src={iconUrl(link.network)}\n width={size}\n height={size}\n alt={SOCIAL_NETWORKS[link.network]?.label ?? link.network}\n />\n </Link>\n ))}\n </Column>\n </Row>\n </Section>\n );\n },\n});\n\n// ---------------------------------------------------------------------------\n// Raw HTML\n// ---------------------------------------------------------------------------\n\nexport const HtmlBlock = EmailNode.create({\n name: 'htmlBlock',\n group: 'block',\n atom: true,\n selectable: true,\n\n addAttributes() {\n return {\n html: {\n default:\n '<p style=\"margin:0;text-align:center;font-family:sans-serif\">Your custom <strong>HTML</strong></p>',\n parseHTML: (el: HTMLElement) => el.dataset.html ?? el.innerHTML,\n renderHTML: () => ({}),\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"html-block\"]' }];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'html-block',\n class: 'node-htmlBlock',\n 'data-html': node.attrs.html,\n }),\n ];\n },\n\n addNodeView() {\n return ({ node }) => {\n const dom = document.createElement('div');\n dom.className = 'node-htmlBlock';\n dom.dataset.type = 'html-block';\n dom.innerHTML = node.attrs.html;\n return {\n dom,\n update(updated) {\n if (updated.type !== node.type) return false;\n dom.innerHTML = updated.attrs.html;\n return true;\n },\n ignoreMutation: () => true,\n };\n };\n },\n\n renderToReactEmail({ node }) {\n return <div dangerouslySetInnerHTML={{ __html: node.attrs?.html ?? '' }} />;\n },\n});\n\nexport const customNodes = [Spacer, SocialLinks, HtmlBlock];\n","import { XIcon } from '@react-email/editor/ui';\nimport { useMessages } from '../../context';\nimport { cx } from '../../core/cx';\nimport { SOCIAL_NETWORKS, type SocialLink } from '../../nodes/custom-nodes';\nimport type { InspectorProps } from '../../registry/types';\nimport { AlignInput, Field, Group, RangeInput, Select, TextInput } from '../fields';\nimport { SpacingGroup } from './groups';\n\nexport function SocialLinksInspector({ ctx, className, style }: InspectorProps) {\n const t = useMessages();\n const i = t.inspector;\n const raw = ctx.getAttr('links');\n const links: SocialLink[] = Array.isArray(raw) ? (raw as SocialLink[]) : [];\n const save = (next: SocialLink[]) => ctx.setAttr('links', next);\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={i.networks}>\n <div className=\"bree-social-list\">\n {links.map((link, index) => (\n <div key={index} className=\"bree-social-row\">\n <Select\n value={link.network}\n onChange={(network) => save(links.map((l, j) => (j === index ? { ...l, network } : l)))}\n options={Object.entries(SOCIAL_NETWORKS).map(([id, meta]) => [id, meta.label])}\n />\n <TextInput value={link.url} onChange={(url) => save(links.map((l, j) => (j === index ? { ...l, url } : l)))} />\n <button type=\"button\" className=\"bree-icon-button\" title={i.removeNetwork} onClick={() => save(links.filter((_, j) => j !== index))}>\n <XIcon size={14} />\n </button>\n </div>\n ))}\n </div>\n <button type=\"button\" className=\"bree-button-like\" onClick={() => save([...links, { network: 'youtube', url: 'https://youtube.com/' }])}>\n {i.addNetwork}\n </button>\n </Group>\n <Group title={i.appearance}>\n <Field label={i.iconSize}>\n <RangeInput value={ctx.getAttr('size')} min={16} max={64} onChange={(v) => ctx.setAttr('size', v)} />\n </Field>\n <Field label={i.gap}>\n <RangeInput value={ctx.getAttr('gap')} min={0} max={40} onChange={(v) => ctx.setAttr('gap', v)} />\n </Field>\n <Field label={i.alignment}>\n <AlignInput value={String(ctx.getAttr('alignment') ?? 'center')} onChange={(v) => ctx.setAttr('alignment', v)} />\n </Field>\n </Group>\n <SpacingGroup ctx={ctx} />\n </div>\n );\n}\n","import {\n CodeIcon,\n Columns2Icon,\n Columns3Icon,\n Columns4Icon,\n Heading1Icon,\n ImageIcon,\n LayoutIcon,\n LinkIcon,\n ListIcon,\n ListOrderedIcon,\n MinusIcon,\n MousePointerClickIcon,\n PanelLeftIcon,\n SquareCodeIcon,\n TableIcon,\n TextQuoteIcon,\n TypeIcon,\n} from '@react-email/editor/ui';\nimport type { Node as PMNode } from '@tiptap/pm/model';\nimport { SpacerIcon } from '../components/icons';\nimport { ButtonInspector } from '../components/inspectors/ButtonInspector';\nimport { ColumnsInspector } from '../components/inspectors/ColumnsInspector';\nimport { HeadingInspector } from '../components/inspectors/HeadingInspector';\nimport { ImageInspector } from '../components/inspectors/ImageInspector';\nimport { ContainerInspector, DividerInspector, HtmlInspector, SpacerInspector } from '../components/inspectors/SimpleInspectors';\nimport { SocialLinksInspector } from '../components/inspectors/SocialLinksInspector';\nimport { HtmlBlock, SocialLinks, Spacer } from '../nodes/custom-nodes';\nimport type { I18n } from '../i18n';\nimport type { NodeDefinition } from './types';\n\nexport function truncate(text: string, max = 36) {\n const clean = text.replace(/\\s+/g, ' ').trim();\n return clean.length > max ? `${clean.slice(0, max)}…` : clean;\n}\n\n/** Text content, or \"empty\". The default preview of text-like nodes. */\nexport const textPreview = (node: PMNode, { t }: I18n) => truncate(node.textContent) || t.layers.empty;\n\nconst noPreview = () => '';\n\nconst imagePreview = (node: PMNode, { t }: I18n) => {\n const { attrs } = node;\n if (attrs.alt) return truncate(attrs.alt);\n const src = String(attrs.src ?? '');\n if (src.startsWith('data:')) return t.layers.uploadedImage;\n try {\n const url = new URL(src);\n // Placeholder services carry the label in ?text=\n return truncate(url.searchParams.get('text') ?? decodeURIComponent(url.pathname.split('/').pop() ?? ''));\n } catch {\n return '';\n }\n};\n\nexport const defaultNodes: NodeDefinition[] = [\n { type: 'paragraph', icon: TypeIcon },\n { type: 'heading', icon: Heading1Icon, inspector: HeadingInspector },\n { type: 'image', icon: ImageIcon, inspector: ImageInspector, preview: imagePreview },\n { type: 'button', icon: MousePointerClickIcon, inspector: ButtonInspector },\n { type: 'horizontalRule', icon: MinusIcon, inspector: DividerInspector, preview: noPreview },\n {\n type: 'spacer',\n icon: SpacerIcon,\n inspector: SpacerInspector,\n preview: (node) => `${node.attrs.height}px`,\n extensions: [Spacer],\n },\n {\n type: 'socialLinks',\n icon: LinkIcon,\n inspector: SocialLinksInspector,\n preview: (node) => (Array.isArray(node.attrs.links) ? node.attrs.links.map((l: { network: string }) => l.network).join(', ') : ''),\n extensions: [SocialLinks],\n },\n {\n type: 'htmlBlock',\n icon: SquareCodeIcon,\n inspector: HtmlInspector,\n preview: (node) => truncate(String(node.attrs.html ?? '').replace(/<[^>]+>/g, ' ')),\n extensions: [HtmlBlock],\n },\n { type: 'section', icon: LayoutIcon, inspector: ContainerInspector, preview: noPreview },\n { type: 'columnsColumn', icon: PanelLeftIcon, inspector: ContainerInspector, preview: noPreview },\n { type: 'twoColumns', icon: Columns2Icon, inspector: ColumnsInspector, preview: noPreview },\n { type: 'threeColumns', icon: Columns3Icon, inspector: ColumnsInspector, preview: noPreview },\n { type: 'fourColumns', icon: Columns4Icon, inspector: ColumnsInspector, preview: noPreview },\n { type: 'bulletList', icon: ListIcon },\n { type: 'orderedList', icon: ListOrderedIcon },\n { type: 'blockquote', icon: TextQuoteIcon },\n { type: 'codeBlock', icon: CodeIcon },\n { type: 'table', icon: TableIcon },\n];\n","import type { JSONContent } from '@tiptap/core';\n\n/**\n * Small helpers to build email JSON (the editor's document format).\n * Handy to write palette items, templates or starter documents.\n */\n\ntype Attrs = Record<string, unknown>;\n\nexport const text = (value: string, marks?: JSONContent['marks']): JSONContent => ({\n type: 'text',\n text: value,\n ...(marks ? { marks } : {}),\n});\n\nexport const paragraph = (value: string | JSONContent[] = '', attrs: Attrs = {}): JSONContent => ({\n type: 'paragraph',\n attrs,\n content: typeof value === 'string' ? (value ? [text(value)] : []) : value,\n});\n\nexport const heading = (level: 1 | 2 | 3, value: string, attrs: Attrs = {}): JSONContent => ({\n type: 'heading',\n attrs: { level, ...attrs },\n content: [text(value)],\n});\n\nexport const button = (label: string, attrs: Attrs = {}): JSONContent => ({\n type: 'button',\n attrs: { href: 'https://example.com', alignment: 'center', ...attrs },\n content: [text(label)],\n});\n\nexport const image = (src: string, attrs: Attrs = {}): JSONContent => ({\n type: 'image',\n attrs: { src, alt: '', alignment: 'center', ...attrs },\n});\n\nexport const column = (...content: JSONContent[]): JSONContent => ({\n type: 'columnsColumn',\n content: content.length ? content : [paragraph()],\n});\n\n/** Sets a column's width, in percent of its row. */\nexport const sized = (col: JSONContent, width: number): JSONContent => ({\n ...col,\n attrs: { ...col.attrs, style: `width:${width}%` },\n});\n\nexport const columns = (count: 2 | 3 | 4, cols?: JSONContent[], attrs?: Attrs): JSONContent => ({\n type: ({ 2: 'twoColumns', 3: 'threeColumns', 4: 'fourColumns' } as const)[count],\n ...(attrs ? { attrs } : {}),\n content: cols ?? Array.from({ length: count }, () => column()),\n});\n\nexport const section = (style: string, ...content: JSONContent[]): JSONContent => ({\n type: 'section',\n attrs: { style },\n content,\n});\n\n/** Longhand paddings keep the inspector's per-side controls accurate. */\nexport const padding = (y: number, x = y) =>\n `padding-top:${y}px;padding-right:${x}px;padding-bottom:${y}px;padding-left:${x}px`;\n\nexport const link = (href: string) => [{ type: 'link', attrs: { href } }];\n\nexport const placeholderImage = (w: number, h: number, label = 'Image') =>\n `https://placehold.co/${w}x${h}/e2e8f0/64748b/png?text=${encodeURIComponent(label)}`;\n\n/** Wraps blocks into a full document. */\nexport const doc = (...content: JSONContent[]): JSONContent => ({ type: 'doc', content });\n","import {\n Columns2Icon,\n Columns3Icon,\n Columns4Icon,\n Heading1Icon,\n ImageIcon,\n LayoutIcon,\n ListIcon,\n MinusIcon,\n MousePointerClickIcon,\n PanelTopIcon,\n SquareCodeIcon,\n TextQuoteIcon,\n TypeIcon,\n} from '@react-email/editor/ui';\nimport type { JSONContent } from '@tiptap/core';\nimport { OneColumnIcon, SocialIcon, SpacerTileIcon } from '../components/icons';\nimport { button, columns, heading, image, link, padding, paragraph, placeholderImage, section, text } from '../core/content';\nimport type { I18n } from '../i18n';\nimport type { PaletteGroup, PaletteItem } from './types';\n\n/** A text menu (Home · Shop · Blog · Contact), shared by the palette and the header template. */\nexport const menuParagraph = ({ t }: I18n, alignment = 'center'): JSONContent =>\n paragraph(\n [\n text(t.content.menuHome, link('https://example.com')),\n text(' · '),\n text(t.content.menuShop, link('https://example.com/shop')),\n text(' · '),\n text(t.content.menuBlog, link('https://example.com/blog')),\n text(' · '),\n text(t.content.menuContact, link('https://example.com/contact')),\n ],\n { alignment },\n );\n\nexport const defaultPaletteGroups: PaletteGroup[] = [\n { id: 'layout', title: ({ t }) => t.sidebar.layoutTitle },\n { id: 'content', title: ({ t }) => t.sidebar.contentTitle },\n];\n\nexport const defaultPalette: PaletteItem[] = [\n // Layout\n {\n id: 'section',\n group: 'layout',\n label: ({ t }) => t.palette.oneColumn,\n icon: <OneColumnIcon />,\n content: () => [section(padding(16), paragraph())],\n },\n { id: 'columns-2', group: 'layout', label: ({ t }) => t.palette.twoColumns, icon: <Columns2Icon size={22} />, content: () => [columns(2)] },\n { id: 'columns-3', group: 'layout', label: ({ t }) => t.palette.threeColumns, icon: <Columns3Icon size={22} />, content: () => [columns(3)] },\n { id: 'columns-4', group: 'layout', label: ({ t }) => t.palette.fourColumns, icon: <Columns4Icon size={22} />, content: () => [columns(4)] },\n // Content\n { id: 'heading', group: 'content', label: ({ t }) => t.palette.heading, icon: <Heading1Icon size={22} />, content: ({ t }) => [heading(2, t.content.heading)] },\n { id: 'text', group: 'content', label: ({ t }) => t.palette.text, icon: <TypeIcon size={22} />, content: ({ t }) => [paragraph(t.content.text)] },\n { id: 'button', group: 'content', label: ({ t }) => t.palette.button, icon: <MousePointerClickIcon size={22} />, content: ({ t }) => [button(t.content.button)] },\n {\n id: 'image',\n group: 'content',\n label: ({ t }) => t.palette.image,\n icon: <ImageIcon size={22} />,\n content: ({ t }) => [image(placeholderImage(600, 300, t.content.image))],\n },\n { id: 'divider', group: 'content', label: ({ t }) => t.palette.divider, icon: <MinusIcon size={22} />, content: () => [{ type: 'horizontalRule' }] },\n {\n id: 'spacer',\n group: 'content',\n label: ({ t }) => t.palette.spacer,\n icon: <SpacerTileIcon />,\n content: () => [{ type: 'spacer', attrs: { height: 32 } }],\n },\n { id: 'social', group: 'content', label: ({ t }) => t.palette.social, icon: <SocialIcon />, content: () => [{ type: 'socialLinks' }] },\n { id: 'menu', group: 'content', label: ({ t }) => t.palette.menu, icon: <PanelTopIcon size={22} />, content: (i18n) => [menuParagraph(i18n)] },\n {\n id: 'list',\n group: 'content',\n label: ({ t }) => t.palette.list,\n icon: <ListIcon size={22} />,\n content: ({ t }) => [\n {\n type: 'bulletList',\n content: t.content.listItems.map((item) => ({ type: 'listItem', content: [paragraph(item)] })),\n },\n ],\n },\n {\n id: 'quote',\n group: 'content',\n label: ({ t }) => t.palette.quote,\n icon: <TextQuoteIcon size={22} />,\n content: ({ t }) => [{ type: 'blockquote', content: [paragraph(t.content.quote)] }],\n },\n {\n id: 'html',\n group: 'content',\n label: ({ t }) => t.palette.html,\n icon: <SquareCodeIcon size={22} />,\n content: ({ t }) => [{ type: 'htmlBlock', attrs: { html: t.content.html } }],\n },\n {\n id: 'card',\n group: 'content',\n label: ({ t }) => t.palette.card,\n icon: <LayoutIcon size={22} />,\n content: ({ t }) => [\n section(`${padding(24)};background-color:#f1f5f9;border-radius:12px`, heading(3, t.content.cardTitle), paragraph(t.content.cardText)),\n ],\n },\n];\n","import type { JSONContent } from '@tiptap/core';\nimport { button, column, columns, heading, image, link, padding, paragraph, placeholderImage, section, sized, text } from '../core/content';\nimport type { I18n } from '../i18n';\nimport { menuParagraph } from './default-palette';\nimport type { TemplateItem } from './types';\n\n/** Abstract wireframe used as the card preview of the built-in templates. */\nexport function TemplateThumbnail({ variant }: { variant: string }) {\n return (\n <span className={`bree-block-thumb bree-thumb-${variant}`} aria-hidden>\n <i />\n <i />\n <i />\n </span>\n );\n}\n\nexport const defaultTemplates: TemplateItem[] = [\n {\n id: 'header',\n label: ({ t }) => t.templates.header,\n description: ({ t }) => t.templates.headerDescription,\n thumbnail: <TemplateThumbnail variant=\"header\" />,\n content: (i18n) => [\n columns(2, [\n sized(column(image(placeholderImage(140, 40, i18n.t.content.logo), { alignment: 'left', width: '140' })), 33),\n sized(column(menuParagraph(i18n, 'right')), 67),\n ]),\n ],\n },\n {\n id: 'hero',\n label: ({ t }) => t.templates.hero,\n description: ({ t }) => t.templates.heroDescription,\n thumbnail: <TemplateThumbnail variant=\"hero\" />,\n content: ({ t }) => [\n section(\n `${padding(40, 24)};background-color:#eef2ff;border-radius:12px`,\n heading(1, t.content.heroTitle, { alignment: 'center' }),\n paragraph(t.content.heroText, { alignment: 'center' }),\n button(t.content.heroButton, { style: `background-color:#4f46e5;color:#ffffff;${padding(12, 24)};border-radius:8px` }),\n ),\n ],\n },\n {\n id: 'products',\n label: ({ t }) => t.templates.products,\n description: ({ t }) => t.templates.productsDescription,\n thumbnail: <TemplateThumbnail variant=\"products\" />,\n content: ({ t }) => [\n columns(\n 2,\n [t.content.productA, t.content.productB].map((name) =>\n column(\n image(placeholderImage(280, 200, name)),\n heading(3, name, { alignment: 'center' }),\n paragraph(t.content.productText, { alignment: 'center' }),\n button(t.content.productButton),\n ),\n ),\n { cellspacing: 16 },\n ),\n ],\n },\n {\n id: 'features',\n label: ({ t }) => t.templates.features,\n description: ({ t }) => t.templates.featuresDescription,\n thumbnail: <TemplateThumbnail variant=\"features\" />,\n content: ({ t }) => [\n columns(\n 3,\n t.content.features.map((title) =>\n column(heading(3, title, { alignment: 'center' }), paragraph(t.content.featureText, { alignment: 'center' })),\n ),\n ),\n ],\n },\n {\n id: 'testimonial',\n label: ({ t }) => t.templates.testimonial,\n description: ({ t }) => t.templates.testimonialDescription,\n thumbnail: <TemplateThumbnail variant=\"testimonial\" />,\n content: ({ t }) => [\n section(\n `${padding(24)};background-color:#f8fafc;border-radius:12px`,\n { type: 'blockquote', content: [paragraph(t.content.testimonialQuote)] },\n paragraph(t.content.testimonialAuthor, { alignment: 'right', style: 'color:#64748b' }),\n ),\n ],\n },\n {\n id: 'footer',\n label: ({ t }) => t.templates.footer,\n description: ({ t }) => t.templates.footerDescription,\n thumbnail: <TemplateThumbnail variant=\"footer\" />,\n content: ({ t }) => [\n { type: 'horizontalRule' },\n { type: 'socialLinks' },\n paragraph(t.content.footerAddress, { alignment: 'center', style: 'color:#94a3b8;font-size:12px' }),\n paragraph([text(t.content.unsubscribe, link('https://example.com/unsubscribe'))], {\n alignment: 'center',\n style: 'font-size:12px',\n }),\n ],\n },\n];\n\nconst template = (id: string, i18n: I18n) => defaultTemplates.find((item) => item.id === id)?.content(i18n) ?? [];\n\n/** The demo email: header, hero, products and footer. */\nexport function createStarterDocument(i18n: I18n): JSONContent {\n const spacer = { type: 'spacer', attrs: { height: 16 } };\n return {\n type: 'doc',\n content: [\n ...template('header', i18n),\n spacer,\n ...template('hero', i18n),\n spacer,\n heading(2, i18n.t.content.starterTitle, { alignment: 'center' }),\n ...template('products', i18n),\n spacer,\n ...template('footer', i18n),\n ],\n };\n}\n","import type { Editor, Extensions, JSONContent } from '@tiptap/core';\nimport { Placeholder } from '@tiptap/extension-placeholder';\nimport { EditorContext, useEditor } from '@tiptap/react';\nimport { composeReactEmail } from '@react-email/editor/core';\nimport { StarterKit } from '@react-email/editor/extensions';\nimport { EmailTheming, extendTheme, useEditorImage, type EditorThemeInput } from '@react-email/editor/plugins';\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from 'react';\nimport { cx, type StyleProps } from './core/cx';\nimport { appendBlocks } from './core/dnd';\nimport { EmailButton } from './core/paste';\nimport { createPasteHandler } from './core/paste-handler';\nimport { SelectAllFix } from './core/select-all';\nimport { createDragSession, createHoverStore, type DragSession, type HoverStore } from './core/stores';\nimport { en, resolveLabel, resolveMessages, type I18n, type Messages, type PartialMessages } from './i18n';\nimport { defaultNodes } from './registry/default-nodes';\nimport { defaultPalette, defaultPaletteGroups } from './registry/default-palette';\nimport { createStarterDocument, defaultTemplates } from './registry/default-templates';\nimport type { NodeDefinition, PaletteGroup, PaletteItem, TemplateItem } from './registry/types';\n\nexport interface EmailSettings {\n /** Inbox preview line (shown after the subject). */\n previewText: string;\n}\n\n/** What the editor saves and loads: the document plus email-level settings. */\nexport interface EmailValue {\n doc: JSONContent;\n settings: EmailSettings;\n}\n\nexport type Device = 'desktop' | 'mobile';\n\nexport interface EmailExport {\n html: string;\n text: string;\n unformattedHtml: string;\n}\n\n/** Imperative API exposed through `ref` (and given to `onReady`). */\nexport interface EmailEditorHandle {\n /** The underlying Tiptap editor. */\n editor: Editor | null;\n getValue: () => EmailValue;\n setValue: (value: EmailValue | JSONContent) => void;\n getJSON: () => JSONContent;\n /** Renders the email (HTML, plain text and unformatted HTML). */\n exportEmail: () => Promise<EmailExport>;\n getHtml: () => Promise<string>;\n getText: () => Promise<string>;\n /** Appends blocks at the end of the email. */\n insertBlocks: (content: JSONContent[]) => void;\n}\n\nexport interface EmailEditorContextValue extends I18n {\n editor: Editor;\n handle: EmailEditorHandle;\n /** Node definitions, by type. */\n nodes: ReadonlyMap<string, NodeDefinition>;\n nodeLabel: (type: string) => string;\n palette: PaletteItem[];\n paletteGroups: PaletteGroup[];\n templates: TemplateItem[];\n starterDocument: (i18n: I18n) => JSONContent;\n uploadImage: (file: File) => Promise<{ url: string }>;\n dragSession: DragSession;\n hoverStore: HoverStore;\n device: Device;\n setDevice: (device: Device) => void;\n layersOpen: boolean;\n setLayersOpen: (open: boolean) => void;\n settings: EmailSettings;\n updateSettings: (patch: Partial<EmailSettings>) => void;\n}\n\nconst EmailEditorContext = createContext<EmailEditorContextValue | null>(null);\n\n/** Everything the editor components share: editor, i18n, registries, UI state. */\nexport function useEmailEditor(): EmailEditorContextValue {\n const value = useContext(EmailEditorContext);\n if (!value) throw new Error('useEmailEditor must be used inside <EditorRoot> or <BetterEmailEditor>.');\n return value;\n}\n\n/** Like `useEmailEditor`, but returns null outside an editor. */\nexport function useOptionalEmailEditor(): EmailEditorContextValue | null {\n return useContext(EmailEditorContext);\n}\n\n/** UI strings, falling back to English outside an editor (lets form fields work standalone). */\nexport function useMessages(): Messages {\n return useContext(EmailEditorContext)?.t ?? en;\n}\n\n/** Current locale and messages. */\nexport function useI18n(): I18n {\n const { locale, t } = useEmailEditor();\n return useMemo(() => ({ locale, t }), [locale, t]);\n}\n\nexport interface EditorRootProps extends StyleProps {\n /** Initial content, read on mount. Use the ref's `setValue` to replace it later. */\n defaultValue?: EmailValue | JSONContent;\n /** Called on every document or settings change. */\n onChange?: (value: EmailValue) => void;\n /** Called once the editor is created. */\n onReady?: (handle: EmailEditorHandle) => void;\n /** \"en\" (default) or \"fr\". Any other value falls back to English unless `messages` covers it. */\n locale?: string;\n /** Overrides some or all UI strings. */\n messages?: PartialMessages;\n /** Node definitions (labels, icons, properties panels, custom extensions). Read on mount for extensions. */\n nodes?: NodeDefinition[];\n /** Tiles of the \"Content\" tab. */\n palette?: PaletteItem[];\n paletteGroups?: PaletteGroup[];\n /** Prebuilt rows of the \"Blocks\" tab. */\n templates?: TemplateItem[];\n /** Content loaded by the top bar's \"Template\" button. */\n starterDocument?: (i18n: I18n) => JSONContent;\n /** Extra Tiptap extensions, read on mount. */\n extensions?: Extensions;\n /** Email theme used for new documents, read on mount. */\n theme?: EditorThemeInput;\n /** Stores an uploaded or pasted image and returns its public URL. Defaults to an inline data URL. */\n uploadImage?: (file: File) => Promise<{ url: string }>;\n editable?: boolean;\n /** Canvas width, controlled. */\n device?: Device;\n defaultDevice?: Device;\n onDeviceChange?: (device: Device) => void;\n /** Layers panel visibility, controlled. */\n layersOpen?: boolean;\n defaultLayersOpen?: boolean;\n onLayersOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n}\n\nexport const defaultTheme: EditorThemeInput = extendTheme('basic', {\n body: { backgroundColor: '#eef1f5', padding: '32px 16px' },\n container: { backgroundColor: '#ffffff', padding: '24px', borderRadius: '12px' },\n});\n\n/** Inlines the file as a data URL. Replace with your own storage (S3, Cloudinary…). */\nexport const readFileAsDataUrl = (file: File) =>\n new Promise<{ url: string }>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve({ url: String(reader.result) });\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n\nconst EMPTY_DOC: JSONContent = { type: 'doc', content: [{ type: 'paragraph' }] };\n\nfunction isEmailValue(value: unknown): value is EmailValue {\n return typeof value === 'object' && value !== null && 'doc' in value;\n}\n\nfunction normalize(value: EmailValue | JSONContent | undefined): EmailValue {\n if (!value) return { doc: EMPTY_DOC, settings: { previewText: '' } };\n if (isEmailValue(value)) return { doc: value.doc, settings: { ...value.settings, previewText: value.settings?.previewText ?? '' } };\n return { doc: value, settings: { previewText: '' } };\n}\n\nfunction useControllable<T>(value: T | undefined, defaultValue: T, onChange?: (value: T) => void) {\n const [inner, setInner] = useState(defaultValue);\n const current = value !== undefined ? value : inner;\n const set = useCallback(\n (next: T) => {\n if (value === undefined) setInner(next);\n onChange?.(next);\n },\n [value, onChange],\n );\n return [current, set] as const;\n}\n\n/**\n * Creates the editor and provides it to every component inside: `Canvas`,\n * `TopBar`, `LayersPanel`, `Sidebar`… Lay them out however you like.\n */\nexport const EditorRoot = forwardRef<EmailEditorHandle, EditorRootProps>(function EditorRoot(\n {\n defaultValue,\n onChange,\n onReady,\n locale = 'en',\n messages,\n nodes = defaultNodes,\n palette = defaultPalette,\n paletteGroups = defaultPaletteGroups,\n templates = defaultTemplates,\n starterDocument = createStarterDocument,\n extensions: extraExtensions,\n theme = defaultTheme,\n uploadImage = readFileAsDataUrl,\n editable = true,\n device: deviceProp,\n defaultDevice = 'desktop',\n onDeviceChange,\n layersOpen: layersOpenProp,\n defaultLayersOpen = true,\n onLayersOpenChange,\n className,\n style,\n children,\n },\n ref,\n) {\n const t = useMemo<Messages>(() => resolveMessages(locale, messages), [locale, messages]);\n\n const [initial] = useState(() => normalize(defaultValue));\n const [settings, setSettings] = useState<EmailSettings>(initial.settings);\n // Settings only change through updateSettings / setValue, which keep this ref in sync.\n const settingsRef = useRef(settings);\n\n // Latest props, read by long-lived callbacks (editor events, placeholder, uploads).\n const tRef = useRef(t);\n const onChangeRef = useRef(onChange);\n const onReadyRef = useRef(onReady);\n const uploadRef = useRef(uploadImage);\n useLayoutEffect(() => {\n tRef.current = t;\n onChangeRef.current = onChange;\n onReadyRef.current = onReady;\n uploadRef.current = uploadImage;\n });\n\n const [device, setDevice] = useControllable(deviceProp, defaultDevice, onDeviceChange);\n const [layersOpen, setLayersOpen] = useControllable(layersOpenProp, defaultLayersOpen, onLayersOpenChange);\n const [stores] = useState(() => ({ dragSession: createDragSession(), hoverStore: createHoverStore() }));\n\n const upload = useCallback((file: File) => uploadRef.current(file), []);\n const imageExtension = useEditorImage({ uploadImage: upload });\n\n // Built once: Tiptap re-creates the editor (and loses history) when extensions change.\n const [extensions] = useState<Extensions>(() => [\n // Button is swapped for a copy/paste-safe version (see core/paste.ts).\n StarterKit.configure({ TiptapStarterKit: { dropcursor: false }, Button: false }),\n EmailButton,\n SelectAllFix,\n Placeholder.configure({\n placeholder: ({ node }) => (node.type.name === 'heading' ? tRef.current.placeholder.heading : tRef.current.placeholder.paragraph),\n includeChildren: true,\n }),\n EmailTheming.configure({ theme }),\n ...nodes.flatMap((node) => node.extensions ?? []),\n ...(extraExtensions ?? []),\n imageExtension,\n ]);\n\n const editor = useEditor(\n {\n extensions,\n content: initial.doc,\n editable,\n immediatelyRender: false,\n editorProps: { handlePaste: createPasteHandler(extensions) },\n },\n [],\n );\n\n useEffect(() => {\n editor?.setEditable(editable);\n }, [editor, editable]);\n\n const getValue = useCallback(\n (): EmailValue => ({ doc: editor?.getJSON() ?? EMPTY_DOC, settings: settingsRef.current }),\n [editor],\n );\n\n const updateSettings = useCallback(\n (patch: Partial<EmailSettings>) => {\n const next = { ...settingsRef.current, ...patch };\n settingsRef.current = next;\n setSettings(next);\n if (editor) onChangeRef.current?.({ doc: editor.getJSON(), settings: next });\n },\n [editor],\n );\n\n const handle = useMemo<EmailEditorHandle>(() => {\n const exportEmail = async (): Promise<EmailExport> => {\n if (!editor) return { html: '', text: '', unformattedHtml: '' };\n return composeReactEmail({ editor, preview: settingsRef.current.previewText || undefined });\n };\n return {\n editor,\n getValue,\n getJSON: () => editor?.getJSON() ?? EMPTY_DOC,\n setValue: (value) => {\n const next = normalize(value);\n settingsRef.current = next.settings;\n setSettings(next.settings);\n editor?.commands.setContent(next.doc, { emitUpdate: true });\n },\n exportEmail,\n getHtml: async () => (await exportEmail()).html,\n getText: async () => (await exportEmail()).text,\n insertBlocks: (content) => {\n if (editor) appendBlocks(editor, content);\n },\n };\n }, [editor, getValue]);\n\n useImperativeHandle(ref, () => handle, [handle]);\n\n useEffect(() => {\n if (!editor) return;\n onReadyRef.current?.(handle);\n const onUpdate = () => onChangeRef.current?.(getValue());\n editor.on('update', onUpdate);\n return () => {\n editor.off('update', onUpdate);\n };\n }, [editor, handle, getValue]);\n\n const nodeMap = useMemo(() => new Map(nodes.map((node) => [node.type, node])), [nodes]);\n\n const value = useMemo<EmailEditorContextValue | null>(() => {\n if (!editor) return null;\n const i18n = { locale, t };\n return {\n ...i18n,\n editor,\n handle,\n nodes: nodeMap,\n nodeLabel: (type) => {\n const label = nodeMap.get(type)?.label;\n return label ? resolveLabel(label, i18n) : (t.nodes[type] ?? type);\n },\n palette,\n paletteGroups,\n templates,\n starterDocument,\n uploadImage: upload,\n ...stores,\n device,\n setDevice,\n layersOpen,\n setLayersOpen,\n settings,\n updateSettings,\n };\n }, [editor, locale, t, handle, nodeMap, palette, paletteGroups, templates, starterDocument, upload, stores, device, setDevice, layersOpen, setLayersOpen, settings, updateSettings]);\n\n const tiptapContext = useMemo(() => ({ editor }), [editor]);\n\n // The empty-zone hint is drawn by CSS (::after), so its text travels as a custom property.\n const rootStyle = { '--bree-empty-zone-label': JSON.stringify(t.canvas.emptyZone), ...style } as CSSProperties;\n\n return (\n <div className={cx('bree bree-root', className)} style={rootStyle} lang={locale}>\n {value && (\n <EditorContext.Provider value={tiptapContext}>\n <EmailEditorContext.Provider value={value}>{children}</EmailEditorContext.Provider>\n </EditorContext.Provider>\n )}\n </div>\n );\n});\n","import { useEditorState } from '@tiptap/react';\r\nimport type { Editor } from '@tiptap/core';\r\nimport { NodeSelection } from '@tiptap/pm/state';\r\nimport { EditorFocusScope, PlusIcon } from '@react-email/editor/ui';\r\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore, type DragEvent as ReactDragEvent } from 'react';\r\nimport { useEmailEditor } from '../context';\r\nimport { cx } from '../core/cx';\r\nimport type { Messages } from '../i18n';\r\nimport {\r\n applyDrop,\r\n BLOCK_CONTAINERS,\r\n COLUMN_PARENTS,\r\n type BlockUnit,\r\n deleteUnit,\r\n DND_MIME,\r\n type DropTarget,\r\n duplicateUnit,\r\n findDropTarget,\r\n isFixedUnit,\r\n parentUnit,\r\n payloadFragment,\r\n selectedUnit,\r\n selectUnit,\r\n unitAt,\r\n} from '../core/dnd';\r\nimport { handleCanvasPaste } from '../core/paste';\r\nimport { CopyIcon, GripIcon, ParentIcon, TrashIcon } from './icons';\r\n\r\ninterface Box {\r\n top: number;\r\n left: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\nfunction toLocal(host: HTMLElement, rect: { top: number; left: number; width: number; height?: number }): Box {\r\n const hostRect = host.getBoundingClientRect();\r\n return {\r\n top: rect.top - hostRect.top + host.scrollTop,\r\n left: rect.left - hostRect.left + host.scrollLeft,\r\n width: rect.width,\r\n height: rect.height ?? 0,\r\n };\r\n}\r\n\r\nfunction unitBox(editor: Editor, host: HTMLElement, unit: BlockUnit | null): Box | null {\r\n if (!unit) return null;\r\n const dom = editor.view.nodeDOM(unit.pos);\r\n if (!(dom instanceof HTMLElement)) return null;\r\n return toLocal(host, dom.getBoundingClientRect());\r\n}\r\n\r\n/** The block under the pointer: what the hover frame shows and what a click selects. */\r\nfunction unitAtPoint(editor: Editor, x: number, y: number): BlockUnit | null {\r\n const coords = editor.view.posAtCoords({ left: x, top: y });\r\n return coords && coords.inside >= 0 ? unitAt(editor.state.doc, coords.inside) : null;\r\n}\r\n\r\n/** Layout blocks: clicking their padding/gaps selects them rather than placing a caret. */\r\nfunction isStructuralUnit(unit: BlockUnit) {\r\n const type = unit.node.type.name;\r\n return BLOCK_CONTAINERS.has(type) || COLUMN_PARENTS.has(type);\r\n}\r\n\r\n/**\r\n * Everything drawn on top of the canvas: hover outline, selection frame with\r\n * its toolbar, and the drop indicator. Also owns the drag & drop listeners for\r\n * the canvas so ProseMirror never sees our custom drags. Rendered by `Canvas`.\r\n */\r\nexport function CanvasOverlay({ editor, host }: { editor: Editor; host: HTMLElement }) {\r\n const { dragSession, hoverStore, nodeLabel, t } = useEmailEditor();\r\n // Read from listeners attached once per editor/host.\r\n const labelRef = useRef(nodeLabel);\r\n useLayoutEffect(() => {\r\n labelRef.current = nodeLabel;\r\n });\r\n // Hover lives in a shared store so the layers panel can drive it too.\r\n const hoverPos = useSyncExternalStore(hoverStore.subscribe, hoverStore.get);\r\n const hoverNode = hoverPos !== null ? editor.state.doc.nodeAt(hoverPos) : null;\r\n const hover: BlockUnit | null = hoverPos !== null && hoverNode ? { pos: hoverPos, node: hoverNode } : null;\r\n const [drop, setDrop] = useState<DropTarget | null>(null);\r\n const [dragging, setDragging] = useState<number | null>(null);\r\n const [, setLayoutTick] = useState(0);\r\n const relayout = useCallback(() => setLayoutTick((tick) => tick + 1), []);\r\n\r\n // Selection (re-rendered on every selection / focus change).\r\n const selection = useEditorState({\r\n editor,\r\n selector: ({ editor: ed }) => {\r\n if (!ed?.isFocused) return null;\r\n const unit = selectedUnit(ed);\r\n return unit ? `${unit.pos}:${unit.node.type.name}:${ed.state.doc.content.size}` : null;\r\n },\r\n });\r\n const selected = selection ? selectedUnit(editor) : null;\r\n\r\n // Keep frames glued to content when layout changes (typing, images loading, resizing).\r\n useEffect(() => {\r\n const onUpdate = () => relayout();\r\n // Positions shift on edits: drop a possibly stale hover.\r\n const onDocChange = () => {\r\n hoverStore.set(null);\r\n relayout();\r\n };\r\n editor.on('update', onDocChange);\r\n const observer = new ResizeObserver(onUpdate);\r\n observer.observe(editor.view.dom);\r\n host.addEventListener('load', onUpdate, true);\r\n window.addEventListener('resize', onUpdate);\r\n return () => {\r\n editor.off('update', onDocChange);\r\n observer.disconnect();\r\n host.removeEventListener('load', onUpdate, true);\r\n window.removeEventListener('resize', onUpdate);\r\n };\r\n }, [editor, host, relayout, hoverStore]);\r\n\r\n // Hover tracking.\r\n useEffect(() => {\r\n let frame = 0;\r\n const onMove = (event: MouseEvent) => {\r\n if (dragSession.get()) return;\r\n if ((event.target as HTMLElement).closest('.bree-ov-toolbar, .bree-ov-handle, .bree-ov-tag')) return;\r\n cancelAnimationFrame(frame);\r\n frame = requestAnimationFrame(() => {\r\n hoverStore.set(unitAtPoint(editor, event.clientX, event.clientY)?.pos ?? null);\r\n });\r\n };\r\n const onLeave = () => hoverStore.set(null);\r\n host.addEventListener('mousemove', onMove);\r\n host.addEventListener('mouseleave', onLeave);\r\n return () => {\r\n cancelAnimationFrame(frame);\r\n host.removeEventListener('mousemove', onMove);\r\n host.removeEventListener('mouseleave', onLeave);\r\n };\r\n }, [editor, host, dragSession, hoverStore]);\r\n\r\n // Clicks follow what the hover frame shows:\r\n // - empty canvas around the email -> deselect (back to the palette);\r\n // - a structural area (column gap, section/column padding) -> select that\r\n // row/section/column instead of letting ProseMirror drop the caret into\r\n // the nearest text.\r\n // Capture phase, so it runs before ProseMirror's own mousedown handler.\r\n useEffect(() => {\r\n const onDown = (event: MouseEvent) => {\r\n if (event.button !== 0 || event.shiftKey || event.metaKey || event.ctrlKey) return;\r\n if ((event.target as HTMLElement).closest('.bree-ov-layer')) return;\r\n const background = [host, editor.view.dom, editor.view.dom.parentElement];\r\n if (background.includes(event.target as HTMLElement)) {\r\n event.preventDefault();\r\n const active = document.activeElement;\r\n if (active instanceof HTMLElement) active.blur();\r\n editor.commands.blur();\r\n return;\r\n }\r\n const unit = unitAtPoint(editor, event.clientX, event.clientY);\r\n if (unit && isStructuralUnit(unit)) {\r\n event.preventDefault();\r\n selectUnit(editor, unit);\r\n return;\r\n }\r\n // A block can stay node-selected after the editor lost focus (deselect,\r\n // or a document starting with an image). Clicking it again changes\r\n // nothing for ProseMirror, so it never writes the selection back to the\r\n // DOM and Chrome's own caret wins: it lands in the next text, e.g. the\r\n // hidden empty paragraph after a lone image. Focusing first puts the node\r\n // selection in the DOM, and Chrome keeps a selection clicked from inside.\r\n if (!editor.isFocused && editor.state.selection instanceof NodeSelection) editor.view.focus();\r\n };\r\n const onPaste = (event: ClipboardEvent) => {\r\n if (editor.view.dom.contains(event.target as Node)) handleCanvasPaste(editor, event);\r\n };\r\n host.addEventListener('mousedown', onDown, true);\r\n host.addEventListener('paste', onPaste, true);\r\n return () => {\r\n host.removeEventListener('mousedown', onDown, true);\r\n host.removeEventListener('paste', onPaste, true);\r\n };\r\n }, [editor, host]);\r\n\r\n // Drag & drop: capture-phase listeners so ProseMirror's own handlers stay out of it.\r\n useEffect(() => {\r\n let frame = 0;\r\n let lastFragmentKey: unknown = null;\r\n let fragment: ReturnType<typeof payloadFragment> = null;\r\n\r\n const compute = (event: DragEvent) => {\r\n const payload = dragSession.get();\r\n if (!payload) return null;\r\n if (lastFragmentKey !== payload) {\r\n lastFragmentKey = payload;\r\n fragment = payloadFragment(editor.view, payload);\r\n }\r\n if (!fragment) return null;\r\n const exclude =\r\n payload.kind === 'move'\r\n ? { from: payload.pos, to: payload.pos + (editor.state.doc.nodeAt(payload.pos)?.nodeSize ?? 0) }\r\n : undefined;\r\n return findDropTarget(editor.view, event.clientX, event.clientY, fragment, exclude);\r\n };\r\n\r\n const onDragOver = (event: DragEvent) => {\r\n const payload = dragSession.get();\r\n if (!payload) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (event.dataTransfer) event.dataTransfer.dropEffect = payload.kind === 'move' ? 'move' : 'copy';\r\n cancelAnimationFrame(frame);\r\n frame = requestAnimationFrame(() => setDrop(compute(event)));\r\n };\r\n const onDrop = (event: DragEvent) => {\r\n const payload = dragSession.get();\r\n if (!payload) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n cancelAnimationFrame(frame);\r\n const target = compute(event);\r\n if (target) applyDrop(editor, payload, target);\r\n // ProseMirror may have started a native node drag (images); its dragend\r\n // never fires once the source node moved, so clear it here.\r\n editor.view.dragging = null;\r\n dragSession.end();\r\n setDrop(null);\r\n setDragging(null);\r\n hoverStore.set(null);\r\n };\r\n const onDragLeave = (event: DragEvent) => {\r\n if (!dragSession.get()) return;\r\n if (!host.contains(event.relatedTarget as Node | null)) {\r\n cancelAnimationFrame(frame);\r\n setDrop(null);\r\n }\r\n };\r\n const onDragEnd = () => {\r\n cancelAnimationFrame(frame);\r\n dragSession.end();\r\n setDrop(null);\r\n setDragging(null);\r\n hoverStore.set(null);\r\n };\r\n // Images are draggable ProseMirror nodes: route their native drag through\r\n // our session so they get the same drop indicator as the handle.\r\n const onDragStart = (event: DragEvent) => {\r\n const target = event.target as HTMLElement;\r\n if (dragSession.get() || target.tagName !== 'IMG' || !editor.view.dom.contains(target)) return;\r\n const pos = editor.view.posAtDOM(target, 0);\r\n const unit = unitAt(editor.state.doc, pos);\r\n if (!unit || isFixedUnit(unit)) return;\r\n dragSession.start({ kind: 'move', pos: unit.pos, label: labelRef.current(unit.node.type.name) });\r\n requestAnimationFrame(() => setDragging(unit.pos));\r\n };\r\n const onKeyDown = (event: KeyboardEvent) => {\r\n if (event.key !== 'Escape' || !editor.isFocused) return;\r\n const current = selectedUnit(editor);\r\n const parent = current ? parentUnit(editor.state.doc, current) : null;\r\n event.preventDefault();\r\n if (parent) {\r\n selectUnit(editor, parent);\r\n } else {\r\n const active = document.activeElement;\r\n if (active instanceof HTMLElement) active.blur();\r\n editor.commands.blur();\r\n }\r\n };\r\n // Text drags stay native: only payloads registered in dragSession are handled here.\r\n host.addEventListener('dragstart', onDragStart, true);\r\n host.addEventListener('keydown', onKeyDown, true);\r\n host.addEventListener('dragover', onDragOver, true);\r\n host.addEventListener('drop', onDrop, true);\r\n host.addEventListener('dragleave', onDragLeave, true);\r\n document.addEventListener('dragend', onDragEnd);\r\n return () => {\r\n cancelAnimationFrame(frame);\r\n host.removeEventListener('dragstart', onDragStart, true);\r\n host.removeEventListener('keydown', onKeyDown, true);\r\n host.removeEventListener('dragover', onDragOver, true);\r\n host.removeEventListener('drop', onDrop, true);\r\n host.removeEventListener('dragleave', onDragLeave, true);\r\n document.removeEventListener('dragend', onDragEnd);\r\n };\r\n }, [editor, host, dragSession, hoverStore]);\r\n\r\n const startMove = (event: ReactDragEvent, unit: BlockUnit) => {\r\n const dom = editor.view.nodeDOM(unit.pos);\r\n dragSession.start({ kind: 'move', pos: unit.pos, label: nodeLabel(unit.node.type.name) });\r\n event.dataTransfer.setData(DND_MIME, 'move');\r\n event.dataTransfer.effectAllowed = 'move';\r\n if (dom instanceof HTMLElement) {\r\n const rect = dom.getBoundingClientRect();\r\n event.dataTransfer.setDragImage(dom, Math.min(24, rect.width / 2), Math.min(24, rect.height / 2));\r\n }\r\n // Never unmount the drag source during dragstart (Chromium cancels the\r\n // drag); restyle it on the next frame instead.\r\n requestAnimationFrame(() => setDragging(unit.pos));\r\n };\r\n\r\n const isDragging = dragging !== null;\r\n const hoverBox = hover && hover.pos !== selected?.pos ? unitBox(editor, host, hover) : null;\r\n const selectedBox = unitBox(editor, host, selected);\r\n const sourceBox = isDragging ? unitBox(editor, host, unitAt(editor.state.doc, dragging)) : null;\r\n const parent = selected ? parentUnit(editor.state.doc, selected) : null;\r\n\r\n return (\r\n <div className=\"bree-ov-layer\">\r\n {hoverBox && hover && (\r\n <div className={cx('bree-ov-frame bree-ov-hover', isDragging && 'bree-ov-ghost')} style={hoverBox}>\r\n <button\r\n type=\"button\"\r\n className=\"bree-ov-tag\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n selectUnit(editor, hover);\r\n }}\r\n >\r\n {nodeLabel(hover.node.type.name)}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {selectedBox && selected && (\r\n <div className={cx('bree-ov-frame bree-ov-selected', isDragging && 'bree-ov-ghost')} style={selectedBox}>\r\n <span className=\"bree-ov-tag bree-ov-tag-selected\">{nodeLabel(selected.node.type.name)}</span>\r\n {!isFixedUnit(selected) && (\r\n // Focusable and registered as a focus scope: pressing it keeps the\r\n // editor \"focused\" (so the selection, and this handle, survive), and\r\n // no preventDefault on mousedown, which would cancel the native drag.\r\n <EditorFocusScope>\r\n <span\r\n className=\"bree-ov-handle\"\r\n role=\"button\"\r\n tabIndex={-1}\r\n draggable\r\n title={t.canvas.move}\r\n aria-label={t.canvas.moveLabel(nodeLabel(selected.node.type.name))}\r\n onDragStart={(e) => startMove(e, selected)}\r\n >\r\n <GripIcon />\r\n </span>\r\n </EditorFocusScope>\r\n )}\r\n <EditorFocusScope>\r\n <div className=\"bree-ov-toolbar\" onMouseDown={(e) => e.preventDefault()}>\r\n {parent && (\r\n <button type=\"button\" className=\"bree-ov-tool\" title={t.canvas.selectParent(nodeLabel(parent.node.type.name))} onClick={() => selectUnit(editor, parent)}>\r\n <ParentIcon />\r\n </button>\r\n )}\r\n {!isFixedUnit(selected) && (\r\n <>\r\n <button type=\"button\" className=\"bree-ov-tool\" title={t.canvas.duplicate} onClick={() => duplicateUnit(editor, selected)}>\r\n <CopyIcon />\r\n </button>\r\n <button type=\"button\" className=\"bree-ov-tool bree-ov-danger\" title={t.canvas.delete} onClick={() => deleteUnit(editor, selected)}>\r\n <TrashIcon />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </EditorFocusScope>\r\n </div>\r\n )}\r\n\r\n {sourceBox && <div className=\"bree-ov-frame bree-ov-source\" style={sourceBox} />}\r\n\r\n {drop && <DropIndicator host={host} target={drop} label={dragSession.get()?.label ?? ''} messages={t} />}\r\n </div>\r\n );\r\n}\r\n\r\nfunction DropIndicator({ host, target, label, messages }: { host: HTMLElement; target: DropTarget; label: string; messages: Messages }) {\r\n if (target.emptyZone) {\r\n const zone = toLocal(host, target.emptyZone);\r\n return (\r\n <div className=\"bree-ov-dropzone\" style={zone}>\r\n <span>\r\n <PlusIcon size={14} /> {messages.canvas.dropLabel(label)}\r\n </span>\r\n </div>\r\n );\r\n }\r\n if (!target.line) return null;\r\n const line = toLocal(host, { ...target.line, height: 0 });\r\n return (\r\n <div className=\"bree-ov-dropline\" style={{ top: line.top, left: line.left, width: line.width }}>\r\n <span className=\"bree-ov-dropline-label\">{messages.canvas.dropHere}</span>\r\n </div>\r\n );\r\n}\r\n","import { EditorContent } from '@tiptap/react';\nimport { BubbleMenu, defaultSlashCommands, SlashCommand, type SlashCommandItem } from '@react-email/editor/ui';\nimport { useMemo, useState, type ReactNode } from 'react';\nimport { useEmailEditor } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { CanvasOverlay } from './CanvasOverlay';\n\nexport interface CanvasProps extends StyleProps {\n /** Hover / selection frames, block toolbar and drag & drop. Default: true. */\n overlay?: boolean;\n /** The package's floating text menu (bold, link…). Default: true. */\n bubbleMenu?: boolean;\n /** \"/\" command menu. `true` (default), `false`, or your own items. */\n slashCommands?: boolean | SlashCommandItem[];\n /** Extra content rendered inside the canvas scroll area. */\n children?: ReactNode;\n}\n\n/** The editable email. Scrolls on its own: give it a height through its parent or `style`. */\nexport function Canvas({ overlay = true, bubbleMenu = true, slashCommands = true, className, style, children }: CanvasProps) {\n const { editor, device, t } = useEmailEditor();\n const [host, setHost] = useState<HTMLDivElement | null>(null);\n\n const slashItems = useMemo(() => {\n if (Array.isArray(slashCommands)) return slashCommands;\n return defaultSlashCommands.map((item) => ({ ...item, ...t.slashCommands[item.title] }));\n }, [slashCommands, t]);\n\n return (\n <div ref={setHost} className={cx('bree-canvas', className)} style={style} data-device={device}>\n <EditorContent editor={editor} className=\"bree-canvas-content\" />\n {bubbleMenu && (\n <>\n <BubbleMenu hideWhenActiveNodes={['button', 'horizontalRule']} hideWhenActiveMarks={['link']} />\n <BubbleMenu.LinkDefault />\n <BubbleMenu.ButtonDefault />\n <BubbleMenu.ImageDefault />\n </>\n )}\n {slashCommands !== false && <SlashCommand items={slashItems} />}\n {overlay && host && <CanvasOverlay editor={editor} host={host} />}\n {children}\n </div>\n );\n}\n","import type { Fragment, Node as PMNode } from '@tiptap/pm/model';\nimport { BLOCK_CONTAINERS, COLUMN_PARENTS, type DropTarget, findRootContainer, isEmptyParagraph } from './dnd';\n\nexport interface LayerItem {\n /** Stable-ish key built from the child indexes (\"0.2.1\"). */\n key: string;\n pos: number;\n node: PMNode;\n depth: number;\n /** 1-based index among siblings (used to name columns). */\n index: number;\n children: LayerItem[];\n /** Accepts blocks dropped \"inside\" (section, column). */\n accepts: boolean;\n /** Can't be moved (columns are locked in their row). */\n fixed: boolean;\n /** Drop zone holding nothing but its placeholder paragraph. */\n empty: boolean;\n}\n\n/** TrailingNode filler: same rule as the serializer, which drops it on export. */\nfunction isTrailingFiller(parent: PMNode, index: number) {\n const child = parent.child(index);\n return (\n index === parent.childCount - 1 &&\n parent.childCount > 1 &&\n isEmptyParagraph(child) &&\n parent.child(index - 1).type.name !== 'paragraph'\n );\n}\n\nfunction itemsOf(parent: PMNode, parentPos: number, depth: number, path: string): LayerItem[] {\n const items: LayerItem[] = [];\n parent.forEach((child, offset, index) => {\n if (isTrailingFiller(parent, index)) return;\n const pos = parentPos + 1 + offset;\n const type = child.type.name;\n const key = `${path}${index}`;\n const accepts = BLOCK_CONTAINERS.has(type);\n const empty = accepts && child.childCount === 1 && isEmptyParagraph(child.firstChild!);\n const nested = accepts || COLUMN_PARENTS.has(type);\n items.push({\n key,\n pos,\n node: child,\n depth,\n index: index + 1,\n children: nested && !empty ? itemsOf(child, pos, depth + 1, `${key}.`) : [],\n accepts,\n fixed: type === 'columnsColumn',\n empty,\n });\n });\n return items;\n}\n\nexport function buildLayers(doc: PMNode): LayerItem[] {\n const root = findRootContainer(doc);\n return root ? itemsOf(root.node, root.pos, 0, '') : [];\n}\n\nexport type LayerZone = 'before' | 'after' | 'inside';\n\n/** Which part of a row the pointer is over, given what the row can accept. */\nexport function zoneFor(item: LayerItem, ratio: number): LayerZone {\n if (item.fixed) return 'inside';\n if (item.accepts) return ratio < 0.25 ? 'before' : ratio > 0.75 ? 'after' : 'inside';\n return ratio < 0.5 ? 'before' : 'after';\n}\n\n/** Translates a layers-panel drop into a document position, validated by the schema. */\nexport function layerDropTarget(\n doc: PMNode,\n item: LayerItem,\n zone: LayerZone,\n fragment: Fragment,\n exclude?: { from: number; to: number },\n): DropTarget | null {\n let pos: number;\n let replaceTo: number | undefined;\n\n if (zone === 'inside') {\n if (!item.accepts) return null;\n if (item.empty) {\n pos = item.pos + 1;\n replaceTo = pos + item.node.firstChild!.nodeSize;\n } else {\n pos = item.pos + item.node.nodeSize - 1;\n }\n } else {\n if (item.fixed) return null;\n pos = zone === 'before' ? item.pos : item.pos + item.node.nodeSize;\n }\n\n // A block can't be dropped into itself, and dropping next to itself is a no-op.\n if (exclude && pos >= exclude.from && pos <= exclude.to) return null;\n\n const $pos = doc.resolve(pos);\n const index = $pos.index();\n const ok = $pos.parent.canReplace(index, replaceTo !== undefined ? index + 1 : index, fragment);\n return ok ? { pos, replaceTo } : null;\n}\n","import { useEditorState } from '@tiptap/react';\r\nimport { EditorFocusScope, LayoutIcon, XIcon } from '@react-email/editor/ui';\r\nimport { useEffect, useMemo, useRef, useState, useSyncExternalStore, type DragEvent } from 'react';\r\nimport { useEmailEditor } from '../context';\r\nimport { cx, type StyleProps } from '../core/cx';\r\nimport { applyDrop, DND_MIME, payloadFragment, selectedUnit, selectUnit } from '../core/dnd';\r\nimport { buildLayers, type LayerItem, layerDropTarget, type LayerZone, zoneFor } from '../core/layers';\r\nimport { textPreview } from '../registry/default-nodes';\r\n\r\ninterface DropState {\r\n key: string;\r\n zone: LayerZone;\r\n}\r\n\r\nexport interface LayersPanelProps extends StyleProps {\r\n /** Shows a close button that calls it, e.g. `() => setLayersOpen(false)` when you also render a `LayersToggle`. */\r\n onClose?: () => void;\r\n /** Panel title. Defaults to the localized \"Layers\". */\r\n title?: string;\r\n /** Shows the \"Expand all\" / \"Collapse all\" buttons in the header. Default: true. */\r\n expandCollapseButtons?: boolean;\r\n}\r\n\r\n/** Tree of the email (Photoshop-like layers): select, hover, reorder and nest blocks by drag & drop. */\r\nexport function LayersPanel({ onClose, title, expandCollapseButtons = true, className, style }: LayersPanelProps) {\r\n const { editor, t, locale, nodes, nodeLabel, dragSession, hoverStore } = useEmailEditor();\r\n const itemLabel = (item: LayerItem) =>\r\n item.node.type.name === 'columnsColumn' ? t.layers.column(item.index) : nodeLabel(item.node.type.name);\r\n const itemPreview = (item: LayerItem) => (nodes.get(item.node.type.name)?.preview ?? textPreview)(item.node, { locale, t });\r\n const doc = useEditorState({\r\n editor,\r\n selector: ({ editor: ed }) => ed?.state.doc ?? null,\r\n // ProseMirror docs are immutable: identity is enough (and they're circular).\r\n equalityFn: (a, b) => a === b,\r\n });\r\n const selectedPos = useEditorState({\r\n editor,\r\n selector: ({ editor: ed }) => (ed?.isFocused ? (selectedUnit(ed)?.pos ?? null) : null),\r\n });\r\n const hoverPos = useSyncExternalStore(hoverStore.subscribe, hoverStore.get);\r\n const layers = useMemo(() => (doc ? buildLayers(doc) : []), [doc]);\r\n const [collapsed, setCollapsed] = useState<Set<string>>(() => new Set());\r\n const [drop, setDrop] = useState<DropState | null>(null);\r\n const listRef = useRef<HTMLDivElement>(null);\r\n\r\n // Keep the selected layer visible.\r\n useEffect(() => {\r\n if (selectedPos === null) return;\r\n listRef.current?.querySelector('[aria-selected=\"true\"]')?.scrollIntoView({ block: 'nearest' });\r\n }, [selectedPos]);\r\n\r\n const toggle = (key: string) =>\r\n setCollapsed((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(key)) next.delete(key);\r\n else next.add(key);\r\n return next;\r\n });\r\n\r\n const select = (item: LayerItem) => {\r\n selectUnit(editor, { pos: item.pos, node: item.node });\r\n const dom = editor.view.nodeDOM(item.pos);\r\n if (dom instanceof HTMLElement) dom.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\r\n };\r\n\r\n const resolveDrop = (event: DragEvent, item: LayerItem) => {\r\n const payload = dragSession.get();\r\n if (!payload) return null;\r\n const fragment = payloadFragment(editor.view, payload);\r\n if (!fragment) return null;\r\n const rect = event.currentTarget.getBoundingClientRect();\r\n const zone = zoneFor(item, (event.clientY - rect.top) / rect.height);\r\n const moving = payload.kind === 'move' ? editor.state.doc.nodeAt(payload.pos) : null;\r\n const exclude = payload.kind === 'move' && moving ? { from: payload.pos, to: payload.pos + moving.nodeSize } : undefined;\r\n const target = layerDropTarget(editor.state.doc, item, zone, fragment, exclude);\r\n return target ? { zone, target, payload } : null;\r\n };\r\n\r\n const finishDrag = () => {\r\n dragSession.end();\r\n setDrop(null);\r\n };\r\n\r\n const renderItems = (items: LayerItem[]) =>\r\n items.map((item) => {\r\n const Icon = nodes.get(item.node.type.name)?.icon ?? LayoutIcon;\r\n const hasChildren = item.children.length > 0;\r\n const isCollapsed = collapsed.has(item.key);\r\n const preview = itemPreview(item);\r\n const dropZone = drop?.key === item.key ? drop.zone : null;\r\n return (\r\n <div key={item.key} role=\"none\">\r\n <div\r\n role=\"treeitem\"\r\n tabIndex={selectedPos === item.pos || (selectedPos === null && item.key === '0') ? 0 : -1}\r\n aria-level={item.depth + 1}\r\n aria-selected={selectedPos === item.pos}\r\n aria-expanded={hasChildren ? !isCollapsed : undefined}\r\n className={cx(\r\n 'bree-layer',\r\n selectedPos === item.pos && 'bree-selected',\r\n hoverPos === item.pos && 'bree-hovered',\r\n dropZone && `bree-drop-${dropZone}`,\r\n item.fixed && 'bree-fixed',\r\n )}\r\n style={{ paddingLeft: 6 + item.depth * 16 }}\r\n draggable={!item.fixed}\r\n title={item.fixed ? t.layers.fixedHint : t.layers.itemHint}\r\n onClick={() => select(item)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n select(item);\r\n } else if ((e.key === 'ArrowLeft' && hasChildren && !isCollapsed) || (e.key === 'ArrowRight' && isCollapsed)) {\r\n toggle(item.key);\r\n } else if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n const rows = [...(listRef.current?.querySelectorAll<HTMLElement>('[role=\"treeitem\"]') ?? [])];\r\n const next = rows[rows.indexOf(e.currentTarget) + (e.key === 'ArrowDown' ? 1 : -1)];\r\n next?.focus();\r\n }\r\n }}\r\n onMouseEnter={() => hoverStore.set(item.pos)}\r\n onMouseLeave={() => hoverStore.set(null)}\r\n onDragStart={(e) => {\r\n e.stopPropagation();\r\n dragSession.start({ kind: 'move', pos: item.pos, label: itemLabel(item) });\r\n e.dataTransfer.setData(DND_MIME, 'move');\r\n e.dataTransfer.effectAllowed = 'move';\r\n }}\r\n onDragEnd={finishDrag}\r\n onDragOver={(e) => {\r\n const result = resolveDrop(e, item);\r\n if (!result) {\r\n if (drop?.key === item.key) setDrop(null);\r\n return;\r\n }\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = result.payload.kind === 'move' ? 'move' : 'copy';\r\n if (drop?.key !== item.key || drop.zone !== result.zone) setDrop({ key: item.key, zone: result.zone });\r\n }}\r\n onDrop={(e) => {\r\n const result = resolveDrop(e, item);\r\n e.preventDefault();\r\n if (result) applyDrop(editor, result.payload, result.target);\r\n finishDrag();\r\n }}\r\n >\r\n {hasChildren ? (\r\n <button\r\n type=\"button\"\r\n className={cx('bree-layer-caret', !isCollapsed && 'bree-open')}\r\n aria-label={isCollapsed ? t.layers.expand : t.layers.collapse}\r\n tabIndex={-1}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggle(item.key);\r\n }}\r\n >\r\n ›\r\n </button>\r\n ) : (\r\n <span className=\"bree-layer-caret-spacer\" />\r\n )}\r\n <span className=\"bree-layer-icon\">\r\n <Icon size={14} />\r\n </span>\r\n <span className=\"bree-layer-label\">{itemLabel(item)}</span>\r\n {preview && <span className=\"bree-layer-preview\">{preview}</span>}\r\n </div>\r\n {item.empty && (\r\n <div className=\"bree-layer-empty\" style={{ paddingLeft: 6 + (item.depth + 1) * 16 + 18 }}>\r\n {t.layers.emptyZone}\r\n </div>\r\n )}\r\n {hasChildren && !isCollapsed && <div role=\"group\">{renderItems(item.children)}</div>}\r\n </div>\r\n );\r\n });\r\n\r\n return (\r\n <EditorFocusScope>\r\n <aside\r\n className={cx('bree-layers', className)}\r\n style={style}\r\n aria-label={title ?? t.layers.title}\r\n tabIndex={-1}\r\n onDragLeave={(e) => !e.currentTarget.contains(e.relatedTarget as Node) && setDrop(null)}\r\n >\r\n <header className=\"bree-layers-header\">\r\n <h2>{title ?? t.layers.title}</h2>\r\n <div className=\"bree-layers-actions\">\r\n {expandCollapseButtons && (\r\n <>\r\n <button type=\"button\" className=\"bree-icon-button bree-small\" title={t.layers.expandAll} onClick={() => setCollapsed(new Set())}>\r\n ⊞\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"bree-icon-button bree-small\"\r\n title={t.layers.collapseAll}\r\n onClick={() => {\r\n const keys = new Set<string>();\r\n const walk = (items: LayerItem[]) =>\r\n items.forEach((i) => {\r\n if (i.children.length) keys.add(i.key);\r\n walk(i.children);\r\n });\r\n walk(layers);\r\n setCollapsed(keys);\r\n }}\r\n >\r\n ⊟\r\n </button>\r\n </>\r\n )}\r\n {onClose && (\r\n <button type=\"button\" className=\"bree-icon-button bree-small\" title={t.layers.close} onClick={onClose}>\r\n <XIcon size={14} />\r\n </button>\r\n )}\r\n </div>\r\n </header>\r\n <div className=\"bree-layers-list\" role=\"tree\" aria-label={t.layers.tree} ref={listRef}>\r\n {layers.length ? renderItems(layers) : <p className=\"bree-hint\">{t.layers.emptyEmail}</p>}\r\n </div>\r\n </aside>\r\n </EditorFocusScope>\r\n );\r\n}\r\n","import { cx } from '../../core/cx';\nimport type { InspectorProps } from '../../registry/types';\nimport { BoxGroup, SpacingGroup, TypographyGroup } from './groups';\n\n/** Text-like blocks (paragraph, list, quote…) and any node without its own inspector. */\nexport function DefaultInspector({ ctx, className, style }: InspectorProps) {\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <TypographyGroup ctx={ctx} alignment={String(ctx.getAttr('alignment') ?? 'left')} setAlignment={(v) => ctx.setAttr('alignment', v)} />\n <SpacingGroup ctx={ctx} />\n <BoxGroup ctx={ctx} />\n </div>\n );\n}\n","import { Inspector, XIcon } from '@react-email/editor/ui';\nimport type { ReactNode } from 'react';\nimport { useEmailEditor } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\n\nexport interface PropertiesPanelProps extends StyleProps {\n title: string;\n children: ReactNode;\n /** Shows the hierarchy (Email / Row / Column / Text…) under the header. Default: true. */\n breadcrumb?: boolean;\n}\n\n/** Deselects everything: the sidebar goes back to the content panel. */\nexport function useDeselect() {\n const { editor } = useEmailEditor();\n return () => {\n const active = document.activeElement;\n if (active instanceof HTMLElement) active.blur();\n editor.commands.blur();\n };\n}\n\n/** Sidebar screen shown when something is selected: header, breadcrumb and the inspector below. */\nexport function PropertiesPanel({ title, children, breadcrumb = true, className, style }: PropertiesPanelProps) {\n const { t, nodeLabel } = useEmailEditor();\n const deselect = useDeselect();\n return (\n <div className={cx('bree-properties', className)} style={style}>\n <header className=\"bree-properties-header\">\n <div>\n <span className=\"bree-eyebrow\">{t.sidebar.propertiesEyebrow}</span>\n <h2>{title}</h2>\n </div>\n <button type=\"button\" className=\"bree-icon-button\" title={t.sidebar.closeProperties} onClick={deselect}>\n <XIcon size={16} />\n </button>\n </header>\n {breadcrumb && (\n <Inspector.Breadcrumb>\n {(segments) =>\n segments.length > 1 && (\n <nav className=\"bree-breadcrumb\" aria-label={t.sidebar.breadcrumb}>\n {segments.map((segment, i) => (\n <span key={`${segment.node.nodeType}-${segment.node.nodePos.pos}`} className=\"bree-crumb\">\n {i > 0 && <span className=\"bree-crumb-sep\">/</span>}\n <button type=\"button\" disabled={i === segments.length - 1} onClick={segment.focus}>\n {nodeLabel(segment.node.nodeType)}\n </button>\n </span>\n ))}\n </nav>\n )\n }\n </Inspector.Breadcrumb>\n )}\n <div className=\"bree-panel-scroll\">{children}</div>\n </div>\n );\n}\n","import type { InspectorNodeContext } from '@react-email/editor/ui';\nimport { useEmailEditor } from '../context';\nimport type { StyleProps } from '../core/cx';\nimport { DefaultInspector } from './inspectors/DefaultInspector';\nimport { PropertiesPanel } from './PropertiesPanel';\n\nexport interface BlockPropertiesProps extends StyleProps {\n ctx: InspectorNodeContext;\n}\n\n/** Properties of the selected block: picks the inspector registered for its node type. */\nexport function BlockProperties({ ctx, className, style }: BlockPropertiesProps) {\n const { nodes, nodeLabel } = useEmailEditor();\n const Inspector = nodes.get(ctx.nodeType)?.inspector ?? DefaultInspector;\n return (\n <PropertiesPanel title={nodeLabel(ctx.nodeType)} className={className} style={style}>\n {/* Keyed so local state (drafts, open groups) resets when the selection changes. */}\n <Inspector key={`${ctx.nodeType}-${ctx.nodePos.pos}`} ctx={ctx} />\n </PropertiesPanel>\n );\n}\n","import type { JSONContent } from '@tiptap/core';\nimport type { DragEvent } from 'react';\nimport { useEmailEditor } from '../context';\nimport { appendBlocks, DND_MIME } from '../core/dnd';\n\n/**\n * Makes any element a source of new blocks: drag it onto the canvas or the\n * layers panel, or click it to append the blocks at the end of the email.\n *\n * ```tsx\n * const drag = useDraggableBlock('Promo', () => [paragraph('-20% today')]);\n * return <button {...drag}>Promo</button>;\n * ```\n */\nexport function useDraggableBlock(label: string, content: () => JSONContent[]) {\n const { editor, dragSession } = useEmailEditor();\n return {\n draggable: true,\n onDragStart: (event: DragEvent) => {\n dragSession.start({ kind: 'new', label, content });\n event.dataTransfer.setData(DND_MIME, label);\n event.dataTransfer.effectAllowed = 'copy';\n },\n onDragEnd: () => dragSession.end(),\n onClick: () => appendBlocks(editor, content()),\n };\n}\n","import { useEmailEditor, useI18n } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { resolveLabel } from '../i18n';\nimport { TemplateThumbnail } from '../registry/default-templates';\nimport type { TemplateItem } from '../registry/types';\nimport { useDraggableBlock } from './useDraggableBlock';\n\nexport interface TemplateCardProps extends StyleProps {\n template: TemplateItem;\n}\n\n/** One draggable prebuilt row. */\nexport function TemplateCard({ template, className, style }: TemplateCardProps) {\n const i18n = useI18n();\n const label = resolveLabel(template.label, i18n);\n const drag = useDraggableBlock(label, () => template.content(i18n));\n return (\n <button type=\"button\" className={cx('bree-block-card', className)} style={style} {...drag}>\n {template.thumbnail ?? <TemplateThumbnail variant=\"default\" />}\n <span className=\"bree-block-text\">\n <strong>{label}</strong>\n {template.description && <span>{resolveLabel(template.description, i18n)}</span>}\n </span>\n </button>\n );\n}\n\nexport interface BlocksTabProps extends StyleProps {\n /** Defaults to the editor's `templates`. */\n templates?: TemplateItem[];\n}\n\n/** \"Blocks\" tab: prebuilt rows (header, hero, footer…). */\nexport function BlocksTab({ templates, className, style }: BlocksTabProps) {\n const ctx = useEmailEditor();\n return (\n <div className={cx('bree-block-list', className)} style={style}>\n {(templates ?? ctx.templates).map((template) => (\n <TemplateCard key={template.id} template={template} />\n ))}\n </div>\n );\n}\n","import type { InspectorDocumentProps } from '@react-email/editor/ui';\nimport { useEmailEditor } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { ColorInput, Field, Group, NumberInput, TextInput } from './fields';\n\n/** Context given by `Inspector.Document`: global (theme) styles of the email. */\nexport type DocumentContext = Parameters<NonNullable<InspectorDocumentProps['children']>>[0];\n\nexport interface BodyTabProps extends StyleProps {\n ctx: DocumentContext;\n}\n\n/** \"Body\" tab: email-wide settings (background, width, default colors, preview text). */\nexport function BodyTab({ ctx, className, style }: BodyTabProps) {\n const { settings, updateSettings, t } = useEmailEditor();\n const b = t.body;\n const { findStyleValue, setGlobalStyle } = ctx;\n return (\n <div className={cx('bree-body-tab', className)} style={style}>\n <Group title={b.general}>\n <Field label={b.previewText} stacked>\n <TextInput value={settings.previewText} onChange={(previewText) => updateSettings({ previewText })} placeholder={b.previewTextPlaceholder} />\n </Field>\n </Group>\n <Group title={b.background}>\n <Field label={b.backgroundColor} stacked>\n <ColorInput value={findStyleValue('body', 'backgroundColor')} onChange={(v) => setGlobalStyle('body', 'backgroundColor', v)} />\n </Field>\n <Field label={b.outerPadding}>\n <NumberInput value={findStyleValue('body', 'padding')} onChange={(v) => setGlobalStyle('body', 'padding', v)} />\n </Field>\n </Group>\n <Group title={b.content}>\n <Field label={b.width}>\n <NumberInput value={findStyleValue('container', 'width')} onChange={(v) => setGlobalStyle('container', 'width', v)} min={320} max={900} />\n </Field>\n <Field label={b.contentColor} stacked>\n <ColorInput value={findStyleValue('container', 'backgroundColor')} onChange={(v) => setGlobalStyle('container', 'backgroundColor', v)} />\n </Field>\n <Field label={b.innerPadding}>\n <NumberInput value={findStyleValue('container', 'padding')} onChange={(v) => setGlobalStyle('container', 'padding', v)} />\n </Field>\n <Field label={b.radius}>\n <NumberInput value={findStyleValue('container', 'borderRadius')} onChange={(v) => setGlobalStyle('container', 'borderRadius', v)} />\n </Field>\n </Group>\n <Group title={b.defaultStyles}>\n <Field label={b.text} stacked>\n <ColorInput value={findStyleValue('paragraph', 'color')} onChange={(v) => setGlobalStyle('paragraph', 'color', v)} />\n </Field>\n <Field label={b.headings} stacked>\n <ColorInput\n value={findStyleValue('h1', 'color')}\n onChange={(v) =>\n ctx.batchSetGlobalStyle((['h1', 'h2', 'h3'] as const).map((classReference) => ({ classReference, property: 'color', value: v })))\n }\n />\n </Field>\n <Field label={b.links} stacked>\n <ColorInput value={findStyleValue('link', 'color')} onChange={(v) => setGlobalStyle('link', 'color', v)} />\n </Field>\n <Field label={b.buttonBackground} stacked>\n <ColorInput value={findStyleValue('button', 'backgroundColor')} onChange={(v) => setGlobalStyle('button', 'backgroundColor', v)} />\n </Field>\n <Field label={b.buttonText} stacked>\n <ColorInput value={findStyleValue('button', 'color')} onChange={(v) => setGlobalStyle('button', 'color', v)} />\n </Field>\n </Group>\n </div>\n );\n}\n","import { useEmailEditor, useI18n } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { resolveLabel } from '../i18n';\nimport type { PaletteGroup, PaletteItem } from '../registry/types';\nimport { useDraggableBlock } from './useDraggableBlock';\n\nexport interface PaletteTileProps extends StyleProps {\n item: PaletteItem;\n}\n\n/** One draggable tile of the palette. */\nexport function PaletteTile({ item, className, style }: PaletteTileProps) {\n const i18n = useI18n();\n const label = resolveLabel(item.label, i18n);\n const drag = useDraggableBlock(label, () => item.content(i18n));\n return (\n <button type=\"button\" className={cx('bree-tile', className)} style={style} title={i18n.t.sidebar.tileTitle(label)} {...drag}>\n <span className=\"bree-tile-icon\">{item.icon}</span>\n <span className=\"bree-tile-label\">{label}</span>\n </button>\n );\n}\n\nexport interface ContentTabProps extends StyleProps {\n /** Defaults to the editor's `palette`. */\n items?: PaletteItem[];\n /** Defaults to the editor's `paletteGroups`; groups found only in items are added at the end. */\n groups?: PaletteGroup[];\n /** Hint under the tiles. `null` hides it. */\n hint?: string | null;\n}\n\n/** \"Content\" tab: layout and content tiles, grouped. */\nexport function ContentTab({ items, groups, hint, className, style }: ContentTabProps) {\n const ctx = useEmailEditor();\n const palette = items ?? ctx.palette;\n const known = groups ?? ctx.paletteGroups;\n const allGroups = [\n ...known,\n ...[...new Set(palette.map((item) => item.group))].filter((id) => !known.some((g) => g.id === id)).map((id) => ({ id, title: id })),\n ];\n return (\n <div className={cx('bree-content-tab', className)} style={style}>\n {allGroups.map((group) => {\n const groupItems = palette.filter((item) => item.group === group.id);\n if (!groupItems.length) return null;\n return (\n <section key={group.id}>\n <h3 className=\"bree-panel-title\">{resolveLabel(group.title, ctx)}</h3>\n <div className=\"bree-tiles\">\n {groupItems.map((item) => (\n <PaletteTile key={item.id} item={item} />\n ))}\n </div>\n </section>\n );\n })}\n {hint !== null && <p className=\"bree-hint\">{hint ?? ctx.t.sidebar.dragHint}</p>}\n </div>\n );\n}\n","import { useState, type ReactNode } from 'react';\nimport { useEmailEditor } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { BlocksTab } from './BlocksTab';\nimport { BodyTab, type DocumentContext } from './BodyTab';\nimport { ContentTab } from './ContentTab';\n\nexport interface ContentPanelTab {\n id: string;\n label: string;\n render: (ctx: DocumentContext) => ReactNode;\n}\n\nexport interface ContentPanelProps extends StyleProps {\n ctx: DocumentContext;\n /**\n * Tabs to show. Built-in ids: \"content\", \"blocks\", \"body\". Pass objects to\n * add your own tabs, e.g. `['content', { id: 'saved', label: 'Saved', render: () => <Saved /> }]`.\n */\n tabs?: Array<'content' | 'blocks' | 'body' | ContentPanelTab>;\n defaultTab?: string;\n}\n\n/** Sidebar screen shown when nothing is selected: tabs Content / Blocks / Body. */\nexport function ContentPanel({ ctx, tabs = ['content', 'blocks', 'body'], defaultTab, className, style }: ContentPanelProps) {\n const { t } = useEmailEditor();\n const builtIn: Record<string, ContentPanelTab> = {\n content: { id: 'content', label: t.sidebar.tabContent, render: () => <ContentTab /> },\n blocks: { id: 'blocks', label: t.sidebar.tabBlocks, render: () => <BlocksTab /> },\n body: { id: 'body', label: t.sidebar.tabBody, render: (doc) => <BodyTab ctx={doc} /> },\n };\n const resolved = tabs.map((tab) => (typeof tab === 'string' ? builtIn[tab] : tab));\n const [current, setCurrent] = useState(defaultTab ?? resolved[0]?.id);\n const active = resolved.find((tab) => tab.id === current) ?? resolved[0];\n\n return (\n <div className={cx('bree-content-panel', className)} style={style}>\n {resolved.length > 1 && (\n <nav className=\"bree-tabs\" role=\"tablist\">\n {resolved.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab.id === active?.id}\n className={cx(tab.id === active?.id && 'bree-active')}\n onClick={() => setCurrent(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </nav>\n )}\n <div className=\"bree-panel-scroll\">{active?.render(ctx)}</div>\n </div>\n );\n}\n","import { BoldIcon, ItalicIcon, StrikethroughIcon, UnderlineIcon, type InspectorTextContext } from '@react-email/editor/ui';\nimport { useMessages } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { ColorInput, Field, Group } from './fields';\nimport { TypographyGroup } from './inspectors/groups';\nimport { PropertiesPanel } from './PropertiesPanel';\n\nexport interface TextPropertiesProps extends StyleProps {\n ctx: InspectorTextContext;\n}\n\n/** Properties of a text selection: marks, typography and link color. */\nexport function TextProperties({ ctx, className, style }: TextPropertiesProps) {\n const t = useMessages();\n const i = t.inspector;\n const marks = [\n { mark: 'bold', Icon: BoldIcon, title: i.bold },\n { mark: 'italic', Icon: ItalicIcon, title: i.italic },\n { mark: 'underline', Icon: UnderlineIcon, title: i.underline },\n { mark: 'strike', Icon: StrikethroughIcon, title: i.strike },\n ];\n return (\n <PropertiesPanel title={t.sidebar.selectedText} className={className} style={style}>\n <Group title={i.formatting}>\n <div className=\"bree-mark-row\">\n {marks.map(({ mark, Icon, title }) => (\n <button\n key={mark}\n type=\"button\"\n title={title}\n aria-pressed={!!ctx.marks[mark]}\n className={cx('bree-mark', ctx.marks[mark] && 'bree-active')}\n onClick={() => ctx.toggleMark(mark)}\n >\n <Icon size={14} />\n </button>\n ))}\n </div>\n </Group>\n <TypographyGroup ctx={ctx} alignment={ctx.alignment} setAlignment={ctx.setAlignment} />\n {ctx.isLinkActive && (\n <Group title={i.link}>\n <Field label={i.url} stacked>\n <span className=\"bree-readonly\">{ctx.linkHref}</span>\n </Field>\n <Field label={i.linkColor} stacked>\n <ColorInput value={ctx.linkColor} presets={ctx.presetColors} onChange={ctx.setLinkColor} />\n </Field>\n </Group>\n )}\n </PropertiesPanel>\n );\n}\n","import { Inspector, type InspectorNodeContext, type InspectorTextContext } from '@react-email/editor/ui';\nimport type { ReactNode } from 'react';\nimport { useEmailEditor } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { BlockProperties } from './BlockProperties';\nimport type { DocumentContext } from './BodyTab';\nimport { ContentPanel } from './ContentPanel';\nimport { TextProperties } from './TextProperties';\n\nexport interface SidebarProps extends StyleProps {\n /** Screen when nothing is selected. Default: `<ContentPanel />`. */\n renderDocument?: (ctx: DocumentContext) => ReactNode;\n /** Screen when a block is selected. Default: `<BlockProperties />`. */\n renderNode?: (ctx: InspectorNodeContext) => ReactNode;\n /** Screen when text is selected. Default: `<TextProperties />`. */\n renderText?: (ctx: InspectorTextContext) => ReactNode;\n}\n\n/** Right panel: switches between the content panel and the properties of the selection. */\nexport function Sidebar({\n renderDocument = (ctx) => <ContentPanel ctx={ctx} />,\n renderNode = (ctx) => <BlockProperties ctx={ctx} />,\n renderText = (ctx) => <TextProperties ctx={ctx} />,\n className,\n style,\n}: SidebarProps) {\n const { t } = useEmailEditor();\n return (\n <Inspector.Root className={cx('bree-sidebar', className)} style={style} aria-label={t.sidebar.label}>\n <Inspector.Document>{renderDocument}</Inspector.Document>\n <Inspector.Node>{renderNode}</Inspector.Node>\n <Inspector.Text>{renderText}</Inspector.Text>\n </Inspector.Root>\n );\n}\n","import { EditorFocusScope, XIcon } from '@react-email/editor/ui';\r\nimport { useEffect, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { useEmailEditor, type EmailExport } from '../context';\r\nimport { cx, type StyleProps } from '../core/cx';\r\n\r\nexport type PreviewView = 'desktop' | 'mobile' | 'html' | 'text';\r\n\r\n/** Triggers a browser download of `content`. */\r\nexport function download(filename: string, content: string, type: string) {\r\n const url = URL.createObjectURL(new Blob([content], { type }));\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n}\r\n\r\nexport interface PreviewDialogProps extends StyleProps {\r\n onClose: () => void;\r\n /** Tab shown first. Default: \"desktop\". */\r\n defaultView?: PreviewView;\r\n /** Tabs to show. Default: all four. */\r\n views?: PreviewView[];\r\n /** Name of the downloaded file. Default: \"email.html\". */\r\n filename?: string;\r\n}\r\n\r\n/** Modal with the rendered email: desktop / mobile preview, HTML and plain text, copy and download. Render it to open it. */\r\nexport function PreviewDialog({\r\n onClose,\r\n defaultView = 'desktop',\r\n views = ['desktop', 'mobile', 'html', 'text'],\r\n filename = 'email.html',\r\n className,\r\n style,\r\n}: PreviewDialogProps) {\r\n const { handle, settings, t } = useEmailEditor();\r\n const [view, setView] = useState<PreviewView>(defaultView);\r\n const [result, setResult] = useState<EmailExport | null>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n const [copied, setCopied] = useState(false);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n handle\r\n .exportEmail()\r\n .then((r) => !cancelled && setResult(r))\r\n .catch((e: unknown) => !cancelled && setError(e instanceof Error ? e.message : String(e)));\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [handle, settings.previewText]);\r\n\r\n useEffect(() => {\r\n const onKey = (e: KeyboardEvent) => e.key === 'Escape' && onClose();\r\n window.addEventListener('keydown', onKey);\r\n return () => window.removeEventListener('keydown', onKey);\r\n }, [onClose]);\r\n\r\n const copy = async () => {\r\n if (!result) return;\r\n await navigator.clipboard.writeText(view === 'text' ? result.text : result.html);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 1500);\r\n };\r\n\r\n const p = t.preview;\r\n // Portaled to <body> so it sits above every stacking context of the host page\r\n // (and of the canvas overlay); `bree` brings the theme variables along.\r\n return createPortal(\r\n <EditorFocusScope>\r\n <div className=\"bree bree-modal-backdrop\" onMouseDown={(e) => e.target === e.currentTarget && onClose()}>\r\n <div className={cx('bree-modal', className)} style={style} role=\"dialog\" aria-modal=\"true\" aria-label={p.dialogLabel}>\r\n <header className=\"bree-modal-header\">\r\n <nav className=\"bree-tabs bree-compact\" role=\"tablist\">\r\n {views.map((id) => (\r\n <button key={id} type=\"button\" role=\"tab\" aria-selected={view === id} className={cx(view === id && 'bree-active')} onClick={() => setView(id)}>\r\n {p[id]}\r\n </button>\r\n ))}\r\n </nav>\r\n <div className=\"bree-modal-actions\">\r\n {result && (view === 'html' || view === 'text') && (\r\n <button type=\"button\" className=\"bree-btn\" onClick={copy}>\r\n {copied ? p.copied : p.copy}\r\n </button>\r\n )}\r\n {result && (\r\n <button type=\"button\" className=\"bree-btn bree-primary\" onClick={() => download(filename, result.unformattedHtml, 'text/html')}>\r\n {p.download}\r\n </button>\r\n )}\r\n <button type=\"button\" className=\"bree-icon-button\" onClick={onClose} title={p.close}>\r\n <XIcon size={18} />\r\n </button>\r\n </div>\r\n </header>\r\n <div className=\"bree-modal-body\">\r\n {error && <p className=\"bree-error\">{p.renderError(error)}</p>}\r\n {!result && !error && <p className=\"bree-loading\">{p.rendering}</p>}\r\n {result && (view === 'desktop' || view === 'mobile') && (\r\n <div className={cx('bree-preview-frame', `bree-preview-${view}`)}>\r\n <iframe title={p.iframeTitle} srcDoc={result.html} sandbox=\"allow-same-origin allow-popups\" />\r\n </div>\r\n )}\r\n {result && view === 'html' && <pre className=\"bree-code\">{result.html}</pre>}\r\n {result && view === 'text' && <pre className=\"bree-code\">{result.text}</pre>}\r\n </div>\r\n </div>\r\n </div>\r\n </EditorFocusScope>,\r\n document.body,\r\n );\r\n}\r\n","import { useEditorState } from '@tiptap/react';\r\nimport { EditorFocusScope } from '@react-email/editor/ui';\r\nimport { useRef, useState, type ReactNode } from 'react';\r\nimport { useEmailEditor } from '../context';\r\nimport { cx, type StyleProps } from '../core/cx';\r\nimport { DesktopIcon, LayersIcon, MobileIcon, RedoIcon, UndoIcon } from './icons';\r\nimport { download, PreviewDialog, type PreviewView } from './PreviewDialog';\r\n\r\n/*\r\n * The top bar and each of its controls. Use `<TopBar />` as is, or compose\r\n * your own bar from the buttons below (they all need to live inside the editor).\r\n */\r\n\r\nexport function LayersToggle({ className, style }: StyleProps) {\r\n const { layersOpen, setLayersOpen, t } = useEmailEditor();\r\n return (\r\n <button\r\n type=\"button\"\r\n className={cx('bree-btn bree-ghost bree-layers-toggle', layersOpen && 'bree-active', className)}\r\n style={style}\r\n aria-pressed={layersOpen}\r\n onClick={() => setLayersOpen(!layersOpen)}\r\n title={t.topBar.toggleLayers}\r\n >\r\n <LayersIcon /> {t.topBar.layers}\r\n </button>\r\n );\r\n}\r\n\r\nexport function UndoRedo({ className, style }: StyleProps) {\r\n const { editor, t } = useEmailEditor();\r\n const history = useEditorState({\r\n editor,\r\n selector: ({ editor: ed }) => ({ undo: !!ed?.can().undo(), redo: !!ed?.can().redo() }),\r\n });\r\n return (\r\n <div className={cx('bree-btn-group', className)} style={style}>\r\n <button type=\"button\" className=\"bree-icon-button\" title={t.topBar.undo} disabled={!history?.undo} onClick={() => editor.chain().focus().undo().run()}>\r\n <UndoIcon />\r\n </button>\r\n <button type=\"button\" className=\"bree-icon-button\" title={t.topBar.redo} disabled={!history?.redo} onClick={() => editor.chain().focus().redo().run()}>\r\n <RedoIcon />\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nexport function DeviceToggle({ className, style }: StyleProps) {\r\n const { device, setDevice, t } = useEmailEditor();\r\n const options = [\r\n { id: 'desktop', label: t.topBar.desktop, Icon: DesktopIcon },\r\n { id: 'mobile', label: t.topBar.mobile, Icon: MobileIcon },\r\n ] as const;\r\n return (\r\n <div className={cx('bree-segmented bree-device-toggle', className)} style={style} role=\"radiogroup\" aria-label={t.topBar.canvasWidth}>\r\n {options.map(({ id, label, Icon }) => (\r\n <button key={id} type=\"button\" role=\"radio\" aria-checked={device === id} className={cx(device === id && 'bree-active')} onClick={() => setDevice(id)} title={label}>\r\n <Icon />\r\n </button>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n/** Replaces the content with the starter document (after confirmation). */\r\nexport function TemplateButton({ className, style }: StyleProps) {\r\n const { editor, starterDocument, locale, t } = useEmailEditor();\r\n return (\r\n <button\r\n type=\"button\"\r\n className={cx('bree-btn bree-ghost', className)}\r\n style={style}\r\n onClick={() => {\r\n if (confirm(t.topBar.confirmTemplate)) editor.commands.setContent(starterDocument({ locale, t }));\r\n }}\r\n >\r\n {t.topBar.template}\r\n </button>\r\n );\r\n}\r\n\r\n/** Loads a JSON file saved by `ExportJsonButton` (or a bare Tiptap document). */\r\nexport function ImportButton({ className, style }: StyleProps) {\r\n const { handle, t } = useEmailEditor();\r\n const input = useRef<HTMLInputElement>(null);\r\n const importJson = async (file: File) => {\r\n try {\r\n handle.setValue(JSON.parse(await file.text()));\r\n } catch (error) {\r\n alert(t.topBar.invalidFile(error instanceof Error ? error.message : String(error)));\r\n }\r\n };\r\n return (\r\n <>\r\n <button type=\"button\" className={cx('bree-btn bree-ghost', className)} style={style} onClick={() => input.current?.click()}>\r\n {t.topBar.import}\r\n </button>\r\n <input\r\n ref={input}\r\n type=\"file\"\r\n accept=\"application/json,.json\"\r\n hidden\r\n onChange={(e) => {\r\n const file = e.target.files?.[0];\r\n if (file) void importJson(file);\r\n e.target.value = '';\r\n }}\r\n />\r\n </>\r\n );\r\n}\r\n\r\n/** Downloads `{ doc, settings }` as email.json. */\r\nexport function ExportJsonButton({ className, style, filename = 'email.json' }: StyleProps & { filename?: string }) {\r\n const { handle, t } = useEmailEditor();\r\n return (\r\n <button\r\n type=\"button\"\r\n className={cx('bree-btn bree-ghost', className)}\r\n style={style}\r\n onClick={() => download(filename, JSON.stringify(handle.getValue(), null, 2), 'application/json')}\r\n >\r\n {t.topBar.exportJson}\r\n </button>\r\n );\r\n}\r\n\r\nexport interface PreviewButtonProps extends StyleProps {\r\n /** Tab opened in the preview dialog. Default: \"desktop\". */\r\n view?: PreviewView;\r\n variant?: 'default' | 'primary' | 'ghost';\r\n children?: ReactNode;\r\n}\r\n\r\n/** Opens the preview / export dialog. */\r\nexport function PreviewButton({ view = 'desktop', variant = 'default', children, className, style }: PreviewButtonProps) {\r\n const { t } = useEmailEditor();\r\n const [open, setOpen] = useState(false);\r\n return (\r\n <>\r\n <button\r\n type=\"button\"\r\n className={cx('bree-btn', variant !== 'default' && `bree-${variant}`, className)}\r\n style={style}\r\n onClick={() => setOpen(true)}\r\n >\r\n {children ?? t.topBar.preview}\r\n </button>\r\n {open && <PreviewDialog defaultView={view} onClose={() => setOpen(false)} />}\r\n </>\r\n );\r\n}\r\n\r\nexport function ExportHtmlButton(props: StyleProps) {\r\n const { t } = useEmailEditor();\r\n return (\r\n <PreviewButton view=\"html\" variant=\"primary\" {...props}>\r\n {t.topBar.exportHtml}\r\n </PreviewButton>\r\n );\r\n}\r\n\r\nexport interface TopBarProps extends StyleProps {\r\n /** Left side, e.g. your logo. Empty by default. */\r\n brand?: ReactNode;\r\n /** Extra controls placed before the export button. */\r\n actions?: ReactNode;\r\n /** Replaces the default controls (device toggle + export) with your own. */\r\n children?: ReactNode;\r\n}\r\n\r\n/**\r\n * Top bar: device toggle (desktop / mobile) and the export button. Add more\r\n * controls with `actions`, or compose your own bar from `LayersToggle`,\r\n * `UndoRedo`, `TemplateButton`, `ImportButton`, `ExportJsonButton`, `PreviewButton`…\r\n */\r\nexport function TopBar({ brand, actions, children, className, style }: TopBarProps) {\r\n return (\r\n <EditorFocusScope>\r\n <header className={cx('bree-topbar', className)} style={style}>\r\n <div className=\"bree-topbar-start\">{brand}</div>\r\n {children ?? (\r\n <>\r\n <div className=\"bree-topbar-center\">\r\n <DeviceToggle />\r\n </div>\r\n <div className=\"bree-topbar-actions\">\r\n {actions}\r\n <ExportHtmlButton />\r\n </div>\r\n </>\r\n )}\r\n </header>\r\n </EditorFocusScope>\r\n );\r\n}\r\n","import { forwardRef, type ComponentType } from 'react';\r\nimport { EditorRoot, useEmailEditor, type EditorRootProps, type EmailEditorHandle } from '../context';\r\nimport { cx } from '../core/cx';\r\nimport { Canvas, type CanvasProps } from './Canvas';\r\nimport { LayersPanel, type LayersPanelProps } from './LayersPanel';\r\nimport { Sidebar, type SidebarProps } from './Sidebar';\r\nimport { TopBar, type TopBarProps } from './TopBar';\r\n\r\nexport interface BetterEmailEditorComponents {\r\n TopBar?: ComponentType<TopBarProps>;\r\n LayersPanel?: ComponentType<LayersPanelProps>;\r\n Canvas?: ComponentType<CanvasProps>;\r\n Sidebar?: ComponentType<SidebarProps>;\r\n}\r\n\r\nexport interface BetterEmailEditorProps extends Omit<EditorRootProps, 'children'> {\r\n /** Show the top bar. Default: true. */\r\n showTopBar?: boolean;\r\n /** Show the layers panel. Default: true. */\r\n showLayers?: boolean;\r\n /** Show the right sidebar. Default: true. */\r\n showSidebar?: boolean;\r\n /** Replace any part with your own component. */\r\n components?: BetterEmailEditorComponents;\r\n /** Props (className, style…) forwarded to each part. */\r\n slotProps?: {\r\n topBar?: TopBarProps;\r\n layersPanel?: LayersPanelProps;\r\n canvas?: CanvasProps;\r\n sidebar?: SidebarProps;\r\n };\r\n}\r\n\r\nfunction DefaultLayout({\r\n showTopBar = true,\r\n showLayers = true,\r\n showSidebar = true,\r\n components = {},\r\n slotProps = {},\r\n}: Pick<BetterEmailEditorProps, 'showTopBar' | 'showLayers' | 'showSidebar' | 'components' | 'slotProps'>) {\r\n const { layersOpen } = useEmailEditor();\r\n const { TopBar: Top = TopBar, LayersPanel: Layers = LayersPanel, Canvas: Main = Canvas, Sidebar: Side = Sidebar } = components;\r\n const withLayers = showLayers && layersOpen;\r\n return (\r\n <div\r\n className={cx(\r\n 'bree-layout',\r\n showTopBar && 'bree-with-topbar',\r\n withLayers && 'bree-with-layers',\r\n showSidebar && 'bree-with-sidebar',\r\n )}\r\n >\r\n {showTopBar && <Top {...slotProps.topBar} />}\r\n {withLayers && <Layers {...slotProps.layersPanel} />}\r\n <Main {...slotProps.canvas} />\r\n {showSidebar && <Side {...slotProps.sidebar} />}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * The complete editor in one component: top bar, layers, canvas and sidebar.\r\n * For a custom layout, use `EditorRoot` with the individual components instead.\r\n */\r\nexport const BetterEmailEditor = forwardRef<EmailEditorHandle, BetterEmailEditorProps>(function BetterEmailEditor(\r\n { showTopBar, showLayers, showSidebar, components, slotProps, ...rootProps },\r\n ref,\r\n) {\r\n return (\r\n <EditorRoot ref={ref} {...rootProps}>\r\n <DefaultLayout showTopBar={showTopBar} showLayers={showLayers} showSidebar={showSidebar} components={components} slotProps={slotProps} />\r\n </EditorRoot>\r\n );\r\n});\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","Fragment$1","Popover","__defProp","__exportAll","target","name","all","no_symbols","cx","classes","BLOCK_CONTAINERS","COLUMN_PARENTS","DND_MIME","domRect","dom","view","pos","childrenOf","result","node","childPos","offset","rect","child","isEmptyParagraph","findRootContainer","found","doc","findDropTarget","root","isExcluded","exclude","resolveIn","children","containerRect","edge","insideY","y","insideX","x","type","nested","columns","column","c","only","fragment","index","i","insertIndex","pmIndex","p","insertPos","top","payloadFragment","payload","Fragment","schema","json","error","selectInserted","tr","NodeSelection","TextSelection","releaseNodeSelection","selection","Selection","beforeTrailingFiller","$pos","parent","last","applyDrop","editor","rawTarget","from","to","mappedFrom","mappedTo","removeNode","unitAt","candidates","self","includeSelf","depth","candidate","isFixedUnit","unit","parentUnit","selectedUnit","selectUnit","duplicateUnit","insertAt","deleteUnit","appendBlocks","end","content","EmailButton","Button","el","alignment","cls","handleCanvasPaste","html","event","internal","state","$insert","paragraph","EDITOR_CLASS_PATTERN","FORBIDDEN_TAGS","URL_ATTRIBUTES","PRESERVED_ATTRIBUTES","isSafeUrl","trimmed","value","allowDataImage","sanitizeElement","allowed","attr","sanitizeNode","sanitizePastedHtml","tag","createPasteHandler","slice","generateJSON","extensions","SCOPES","SelectAllFix","Extension","$from","container","Plugin","PluginKey","old","oldState","transactions","step","ReplaceStep","newState","defaultFonts","primaryFamily","stack","findFont","family","fonts","font","createDragSession","active","createHoverStore","hoverPos","listeners","listener","en","message","label","fr","locales","resolveLabel","i18n","isPlainObject","merge","patch","base","key","resolveMessages","locale","overrides","icons_exports","CopyIcon","DesktopIcon","GripIcon","LayersIcon","MobileIcon","OneColumnIcon","ParentIcon","PipetteIcon","RedoIcon","SocialIcon","SpacerIcon","SpacerTileIcon","TrashIcon","UndoIcon","stroke","size","Group","open","setOpen","useState","defaultOpen","className","title","Field","stacked","useDraft","draft","setDraft","synced","setSynced","TextInput","onChange","TextArea","toNumber","n","NumberInput","t","useMessages","commit","raw","min","max","placeholder","next","RangeInput","DEFAULT_SWATCHES","toHex","color","rgb","ColorInput","emptyLabel","hex","onChangeRef","useRef","pending","timer","flush","live","EyeDropper","documentColors","presets","EditorFocusScope","popoverClassName","HexColorPicker","HexColorInput","swatch","swatches","Select","options","v","FontInput","useOptionalEmailEditor","match","custom","style","Segmented","ariaLabel","option","AlignInput","AlignLeftIcon","AlignCenterIcon","AlignRightIcon","PaddingInput","sides","values","get","side","uniform","expanded","setExpanded","labels","set","css","prop","TypographyGroup","ctx","setAlignment","SpacingGroup","changes","BoxGroup","ButtonInspector","ColumnsInspector","useEmailEditor","count","applyWidths","row","rest","col","d","widths","w","HeadingInspector","ImageInspector","width","file","e","uploadImage","SpacerInspector","HtmlInspector","DividerInspector","ContainerInspector","inlineStyleToObject","declaration","styleAttribute","attrs","Spacer","EmailNode","mergeAttributes","HTMLAttributes","height","Section","SOCIAL_NETWORKS","ICON_OVERRIDES","iconUrl","network","meta","parseLinks","SocialLinks","gap","links","link","align","Row","Column","Link","Img","HtmlBlock","updated","SocialLinksInspector","save","j","l","id","XIcon","truncate","clean","text","textPreview","noPreview","defaultNodes","TypeIcon","Heading1Icon","ImageIcon","src","url","MousePointerClickIcon","MinusIcon","LinkIcon","SquareCodeIcon","LayoutIcon","PanelLeftIcon","Columns2Icon","Columns3Icon","Columns4Icon","ListIcon","ListOrderedIcon","TextQuoteIcon","CodeIcon","TableIcon","content_exports","button","heading","image","padding","placeholderImage","section","sized","marks","cols","h","menuParagraph","defaultPaletteGroups","defaultPalette","PanelTopIcon","item","TemplateThumbnail","variant","defaultTemplates","template","createStarterDocument","spacer","EmailEditorContext","createContext","useContext","useI18n","useMemo","defaultTheme","extendTheme","readFileAsDataUrl","reader","resolve","reject","EMPTY_DOC","isEmailValue","normalize","empty","useControllable","inner","setInner","defaultValue","useCallback","EditorRoot","forwardRef","extraExtensions","deviceProp","layersOpenProp","messages","initial","settings","setSettings","settingsRef","tRef","onReadyRef","onReady","uploadRef","device","setDevice","defaultDevice","onDeviceChange","layersOpen","setLayersOpen","defaultLayersOpen","onLayersOpenChange","stores","upload","imageExtension","useEditorImage","StarterKit","Placeholder","EmailTheming","nodes","useEditor","editable","getValue","updateSettings","handle","exportEmail","composeReactEmail","useImperativeHandle","ref","useEffect","onUpdate","nodeMap","palette","paletteGroups","templates","starterDocument","tiptapContext","rootStyle","EditorContext","toLocal","hostRect","host","unitBox","unitAtPoint","coords","isStructuralUnit","CanvasOverlay","labelRef","nodeLabel","useSyncExternalStore","hoverStore","hoverNode","hover","drop","setDrop","dragging","setDragging","setLayoutTick","relayout","tick","selected","useEditorState","ed","onDocChange","observer","frame","onMove","dragSession","onLeave","onDown","onPaste","lastFragmentKey","compute","onDragOver","onDrop","onDragLeave","onDragEnd","onDragStart","onKeyDown","current","startMove","isDragging","hoverBox","selectedBox","sourceBox","DropIndicator","zone","PlusIcon","line","EmailHeader","useId","useHeaderBox","box","setBox","header","raf","observed","read","resize","prev","schedule","Canvas","setHost","headerEl","setHeaderEl","slashItems","slashCommands","defaultSlashCommands","EditorContent","bubbleMenu","BubbleMenu","SlashCommand","overlay","isTrailingFiller","itemsOf","items","parentPos","path","accepts","buildLayers","zoneFor","ratio","layerDropTarget","replaceTo","LayersPanel","itemLabel","itemPreview","a","b","selectedPos","layers","collapsed","setCollapsed","listRef","toggle","select","resolveDrop","moving","finishDrag","renderItems","Icon","hasChildren","isCollapsed","preview","dropZone","rows","expandCollapseButtons","keys","walk","onClose","DefaultInspector","useDeselect","PropertiesPanel","deselect","breadcrumb","Inspector","segments","segment","BlockProperties","useDraggableBlock","TemplateCard","drag","BlocksTab","FONT_TARGETS","getEmailFont","getEmailTheming","input","styles","group","setEmailFont","isFont","bodyIndex","inputs","BodyTab","findStyleValue","setGlobalStyle","PaletteTile","ContentTab","known","groups","allGroups","g","groupItems","hint","ContentPanel","builtIn","resolved","tabs","tab","setCurrent","defaultTab","TextProperties","BoldIcon","ItalicIcon","UnderlineIcon","StrikethroughIcon","mark","Sidebar","renderDocument","renderNode","renderText","download","filename","PreviewDialog","setView","defaultView","setResult","setError","copied","setCopied","cancelled","r","onKey","copy","createPortal","views","LayersToggle","UndoRedo","history","DeviceToggle","TemplateButton","ImportButton","importJson","ExportJsonButton","PreviewButton","ExportHtmlButton","props","TopBar","brand","actions","DefaultLayout","Top","Layers","Main","Side","components","withLayers","showLayers","showTopBar","showSidebar","slotProps","showEmailHeader","BetterEmailEditor","rootProps"],"sources":["../src/core/cx.ts","../src/core/dnd.ts","../src/core/paste.ts","../src/core/paste-handler.ts","../src/core/select-all.ts","../src/core/fonts.ts","../src/core/stores.ts","../src/i18n/en.ts","../src/i18n/fr.ts","../src/i18n/index.ts","../src/components/icons.tsx","../src/components/fields.tsx","../src/components/inspectors/groups.tsx","../src/components/inspectors/ButtonInspector.tsx","../src/components/inspectors/ColumnsInspector.tsx","../src/components/inspectors/HeadingInspector.tsx","../src/components/inspectors/ImageInspector.tsx","../src/components/inspectors/SimpleInspectors.tsx","../src/core/style-utils.ts","../src/nodes/custom-nodes.tsx","../src/components/inspectors/SocialLinksInspector.tsx","../src/registry/default-nodes.tsx","../src/core/content.ts","../src/registry/default-palette.tsx","../src/registry/default-templates.tsx","../src/context.tsx","../src/components/CanvasOverlay.tsx","../src/components/EmailHeader.tsx","../src/components/Canvas.tsx","../src/core/layers.ts","../src/components/LayersPanel.tsx","../src/components/inspectors/DefaultInspector.tsx","../src/components/PropertiesPanel.tsx","../src/components/BlockProperties.tsx","../src/components/useDraggableBlock.ts","../src/components/BlocksTab.tsx","../src/core/email-font.ts","../src/components/BodyTab.tsx","../src/components/ContentTab.tsx","../src/components/ContentPanel.tsx","../src/components/TextProperties.tsx","../src/components/Sidebar.tsx","../src/components/PreviewDialog.tsx","../src/components/TopBar.tsx","../src/components/BetterEmailEditor.tsx"],"sourcesContent":["import type { CSSProperties } from 'react';\n\n/** Joins class names, skipping falsy values. */\nexport function cx(...classes: Array<string | false | null | undefined>) {\n return classes.filter(Boolean).join(' ');\n}\n\n/** Props accepted by every visual component of the library. */\nexport interface StyleProps {\n className?: string;\n style?: CSSProperties;\n}\n","import type { Editor, JSONContent } from '@tiptap/core';\r\nimport { Fragment, type Node as PMNode } from '@tiptap/pm/model';\r\nimport { NodeSelection, Selection, TextSelection, type Transaction } from '@tiptap/pm/state';\r\nimport type { EditorView } from '@tiptap/pm/view';\r\n\r\n/** Nodes whose children are free-flowing blocks (the \"drop zones\"). */\r\nexport const BLOCK_CONTAINERS = new Set(['container', 'section', 'columnsColumn']);\r\n/** Row-like nodes whose children are columns laid out horizontally. */\r\nexport const COLUMN_PARENTS = new Set(['twoColumns', 'threeColumns', 'fourColumns']);\r\n\r\nexport const DND_MIME = 'application/x-email-block';\r\n\r\nexport type DragPayload =\r\n | { kind: 'new'; label: string; content: () => JSONContent[] }\r\n | { kind: 'move'; pos: number; label: string };\r\n\r\nexport interface DropTarget {\r\n /** Document position where the content will be inserted. */\r\n pos: number;\r\n /** When set, the range [pos, replaceTo) is replaced (empty placeholder paragraph). */\r\n replaceTo?: number;\r\n /** Indicator geometry in client coordinates (canvas drops only). */\r\n line?: { top: number; left: number; width: number };\r\n /** Whether the target is an empty drop zone (shows a filled zone instead of a line). */\r\n emptyZone?: { top: number; left: number; width: number; height: number };\r\n}\r\n\r\ninterface Child {\r\n node: PMNode;\r\n pos: number;\r\n rect: DOMRect;\r\n}\r\n\r\nfunction domRect(view: EditorView, pos: number): DOMRect | null {\r\n const dom = view.nodeDOM(pos);\r\n return dom instanceof HTMLElement ? dom.getBoundingClientRect() : null;\r\n}\r\n\r\nfunction childrenOf(view: EditorView, node: PMNode, pos: number): Child[] {\r\n const result: Child[] = [];\r\n node.forEach((child, offset) => {\r\n const childPos = pos + 1 + offset;\r\n const rect = domRect(view, childPos);\r\n if (rect) result.push({ node: child, pos: childPos, rect });\r\n });\r\n return result;\r\n}\r\n\r\nexport function isEmptyParagraph(node: PMNode) {\r\n return node.type.name === 'paragraph' && node.childCount === 0;\r\n}\r\n\r\nexport function findRootContainer(doc: PMNode): { node: PMNode; pos: number } | null {\r\n let found: { node: PMNode; pos: number } | null = null;\r\n doc.forEach((child, offset) => {\r\n if (!found && child.type.name === 'container') found = { node: child, pos: offset };\r\n });\r\n return found;\r\n}\r\n\r\n/**\r\n * Finds where content dragged at (x, y) should land. Walks down from the email\r\n * container into sections and columns, then picks the gap between children\r\n * closest to the pointer — the same mental model as Unlayer's rows/contents.\r\n */\r\nexport function findDropTarget(\r\n view: EditorView,\r\n x: number,\r\n y: number,\r\n fragment: Fragment,\r\n exclude?: { from: number; to: number },\r\n): DropTarget | null {\r\n const root = findRootContainer(view.state.doc);\r\n if (!root) return null;\r\n\r\n const isExcluded = (pos: number) => !!exclude && pos >= exclude.from && pos < exclude.to;\r\n\r\n const resolveIn = (node: PMNode, pos: number): DropTarget | null => {\r\n const children = childrenOf(view, node, pos);\r\n const containerRect = domRect(view, pos);\r\n if (!containerRect) return null;\r\n\r\n // 1. Descend into nested drop zones when the pointer is well inside them.\r\n for (const child of children) {\r\n const { rect } = child;\r\n const edge = Math.min(12, rect.height / 4);\r\n const insideY = y > rect.top + edge && y < rect.bottom - edge;\r\n const insideX = x >= rect.left && x <= rect.right;\r\n if (!insideY || !insideX || isExcluded(child.pos)) continue;\r\n\r\n const type = child.node.type.name;\r\n if (BLOCK_CONTAINERS.has(type)) {\r\n const nested = resolveIn(child.node, child.pos);\r\n if (nested) return nested;\r\n } else if (COLUMN_PARENTS.has(type)) {\r\n const columns = childrenOf(view, child.node, child.pos);\r\n const column =\r\n columns.find((c) => x >= c.rect.left && x <= c.rect.right) ??\r\n (x < columns[0]?.rect.left ? columns[0] : columns[columns.length - 1]);\r\n if (column && !isExcluded(column.pos)) {\r\n const nested = resolveIn(column.node, column.pos);\r\n if (nested) return nested;\r\n }\r\n }\r\n }\r\n\r\n // 2. Empty zone (a column/section holding a single empty paragraph): replace it.\r\n if (children.length === 1 && isEmptyParagraph(children[0].node) && !isExcluded(children[0].pos)) {\r\n const only = children[0];\r\n if (!node.type.validContent(fragment)) return null;\r\n return {\r\n pos: only.pos,\r\n replaceTo: only.pos + only.node.nodeSize,\r\n line: { top: only.rect.top, left: containerRect.left, width: containerRect.width },\r\n emptyZone: {\r\n top: containerRect.top,\r\n left: containerRect.left,\r\n width: containerRect.width,\r\n height: Math.max(containerRect.height, 40),\r\n },\r\n };\r\n }\r\n\r\n // 3. Pick the gap between children.\r\n let index = children.length;\r\n for (let i = 0; i < children.length; i++) {\r\n const { rect } = children[i];\r\n if (y < rect.top + rect.height / 2) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n\r\n // Use ProseMirror's content expression to validate the drop.\r\n const insertIndex = index;\r\n const childIndex = (p: number) => {\r\n let i = 0;\r\n let found = -1;\r\n node.forEach((_c, offset) => {\r\n if (pos + 1 + offset === p) found = i;\r\n i++;\r\n });\r\n return found;\r\n };\r\n const pmIndex = index < children.length ? childIndex(children[index].pos) : node.childCount;\r\n if (!node.canReplace(pmIndex, pmIndex, fragment)) return null;\r\n\r\n const insertPos =\r\n insertIndex < children.length ? children[insertIndex].pos : pos + node.nodeSize - 1;\r\n\r\n let top: number;\r\n if (children.length === 0) top = containerRect.top + 4;\r\n else if (insertIndex === 0) top = children[0].rect.top;\r\n else if (insertIndex === children.length) top = children[children.length - 1].rect.bottom;\r\n else top = (children[insertIndex - 1].rect.bottom + children[insertIndex].rect.top) / 2;\r\n\r\n return {\r\n pos: insertPos,\r\n line: { top, left: containerRect.left, width: containerRect.width },\r\n };\r\n };\r\n\r\n return resolveIn(root.node, root.pos);\r\n}\r\n\r\n/** Builds the PM fragment for a drag payload. */\r\nexport function payloadFragment(view: EditorView, payload: DragPayload): Fragment | null {\r\n const { schema, doc } = view.state;\r\n if (payload.kind === 'new') {\r\n try {\r\n return Fragment.fromArray(payload.content().map((json) => schema.nodeFromJSON(json)));\r\n } catch (error) {\r\n console.error('Invalid block content', error);\r\n return null;\r\n }\r\n }\r\n const node = doc.nodeAt(payload.pos);\r\n return node ? Fragment.from(node) : null;\r\n}\r\n\r\nfunction selectInserted(tr: Transaction, pos: number) {\r\n const node = tr.doc.nodeAt(pos);\r\n if (!node) return;\r\n if (node.isAtom || node.type.name === 'horizontalRule') {\r\n tr.setSelection(NodeSelection.create(tr.doc, pos));\r\n } else {\r\n tr.setSelection(TextSelection.near(tr.doc.resolve(pos + 1)));\r\n }\r\n}\r\n\r\n/**\r\n * The Divider extension filters out any transaction inserting content while a\r\n * divider is node-selected (to stop typing over it). Collapse such selections\r\n * first so structural edits (drop, duplicate) go through.\r\n */\r\nfunction releaseNodeSelection(view: EditorView) {\r\n const { selection, doc } = view.state;\r\n if (selection instanceof NodeSelection) {\r\n view.dispatch(view.state.tr.setSelection(Selection.near(doc.resolve(selection.from))));\r\n }\r\n}\r\n\r\n/**\r\n * Inserting at the very end of a zone would land after TrailingNode's empty\r\n * filler paragraph, which then stops being \"trailing\" and shows up as a stray\r\n * empty line. Insert before it instead.\r\n */\r\nfunction beforeTrailingFiller(doc: PMNode, target: DropTarget): DropTarget {\r\n if (target.replaceTo !== undefined) return target;\r\n const $pos = doc.resolve(target.pos);\r\n const parent = $pos.parent;\r\n const last = parent.lastChild;\r\n const atEnd = $pos.index() === parent.childCount;\r\n if (!atEnd || !last || parent.childCount < 2 || !isEmptyParagraph(last)) return target;\r\n return { ...target, pos: target.pos - last.nodeSize };\r\n}\r\n\r\n/** Applies a drop. Returns true when the document changed. */\r\nexport function applyDrop(editor: Editor, payload: DragPayload, rawTarget: DropTarget): boolean {\r\n const { view } = editor;\r\n releaseNodeSelection(view);\r\n const fragment = payloadFragment(view, payload);\r\n if (!fragment) return false;\r\n const target = beforeTrailingFiller(view.state.doc, rawTarget);\r\n const tr = view.state.tr;\r\n\r\n if (payload.kind === 'new') {\r\n if (target.replaceTo !== undefined) tr.replaceWith(target.pos, target.replaceTo, fragment);\r\n else tr.insert(target.pos, fragment);\r\n selectInserted(tr, target.pos);\r\n } else {\r\n const node = view.state.doc.nodeAt(payload.pos);\r\n if (!node) return false;\r\n const from = payload.pos;\r\n const to = from + node.nodeSize;\r\n // Dropping right before or after itself is a no-op.\r\n if (target.replaceTo === undefined && (target.pos === from || target.pos === to)) return false;\r\n\r\n removeNode(tr, from, to);\r\n const mappedFrom = tr.mapping.map(target.pos, -1);\r\n if (target.replaceTo !== undefined) {\r\n const mappedTo = tr.mapping.map(target.replaceTo, 1);\r\n tr.replaceWith(mappedFrom, mappedTo, node);\r\n } else {\r\n tr.insert(mappedFrom, node);\r\n }\r\n selectInserted(tr, mappedFrom);\r\n }\r\n\r\n view.dispatch(tr.scrollIntoView());\r\n view.focus();\r\n return true;\r\n}\r\n\r\n/** Deletes a node; keeps its parent valid by leaving an empty paragraph if needed. */\r\nexport function removeNode(tr: Transaction, from: number, to: number) {\r\n const $from = tr.doc.resolve(from);\r\n const parent = $from.parent;\r\n if (parent.childCount === 1 && BLOCK_CONTAINERS.has(parent.type.name)) {\r\n tr.replaceWith(from, to, tr.doc.type.schema.nodes.paragraph.create());\r\n } else {\r\n tr.delete(from, to);\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Block \"units\": what gets outlined, labelled and moved in the canvas.\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface BlockUnit {\r\n pos: number;\r\n node: PMNode;\r\n}\r\n\r\n/** The innermost node at `pos` (or one of its ancestors) that sits directly in a drop zone. */\r\nexport function unitAt(doc: PMNode, pos: number, includeSelf = true): BlockUnit | null {\r\n if (pos < 0 || pos > doc.content.size) return null;\r\n const candidates: BlockUnit[] = [];\r\n const self = doc.nodeAt(pos);\r\n if (includeSelf && self) candidates.push({ pos, node: self });\r\n const $pos = doc.resolve(pos);\r\n for (let depth = $pos.depth; depth > 0; depth--) {\r\n candidates.push({ pos: $pos.before(depth), node: $pos.node(depth) });\r\n }\r\n for (const candidate of candidates) {\r\n const parent = doc.resolve(candidate.pos).parent.type.name;\r\n // Columns are units too (selectable, styleable), but they can't be moved out of their row.\r\n if (BLOCK_CONTAINERS.has(parent) || COLUMN_PARENTS.has(parent)) return candidate;\r\n }\r\n return null;\r\n}\r\n\r\n/** Columns live in fixed-size rows: they can be selected but not moved, duplicated or deleted. */\r\nexport function isFixedUnit(unit: BlockUnit) {\r\n return unit.node.type.name === 'columnsColumn';\r\n}\r\n\r\n/** The unit enclosing `unit` (e.g. paragraph -> its columns row). */\r\nexport function parentUnit(doc: PMNode, unit: BlockUnit): BlockUnit | null {\r\n const $pos = doc.resolve(unit.pos);\r\n for (let depth = $pos.depth; depth > 0; depth--) {\r\n const candidatePos = $pos.before(depth);\r\n const found = unitAt(doc, candidatePos);\r\n if (found && found.pos !== unit.pos) return found;\r\n }\r\n return null;\r\n}\r\n\r\nexport function selectedUnit(editor: Editor): BlockUnit | null {\r\n const { selection, doc } = editor.state;\r\n if (selection instanceof NodeSelection) {\r\n return unitAt(doc, selection.from) ?? { pos: selection.from, node: selection.node };\r\n }\r\n return unitAt(doc, selection.from, false);\r\n}\r\n\r\nexport function selectUnit(editor: Editor, unit: BlockUnit) {\r\n const { view } = editor;\r\n const tr = view.state.tr.setSelection(NodeSelection.create(view.state.doc, unit.pos));\r\n view.dispatch(tr);\r\n view.focus();\r\n}\r\n\r\nexport function duplicateUnit(editor: Editor, unit: BlockUnit) {\r\n const { view } = editor;\r\n releaseNodeSelection(view);\r\n const node = view.state.doc.nodeAt(unit.pos);\r\n if (!node) return;\r\n const insertAt = unit.pos + node.nodeSize;\r\n const tr = view.state.tr.insert(insertAt, node.copy(node.content));\r\n tr.setSelection(NodeSelection.create(tr.doc, insertAt));\r\n view.dispatch(tr.scrollIntoView());\r\n view.focus();\r\n}\r\n\r\nexport function deleteUnit(editor: Editor, unit: BlockUnit) {\r\n const { view } = editor;\r\n const node = view.state.doc.nodeAt(unit.pos);\r\n if (!node) return;\r\n const tr = view.state.tr;\r\n removeNode(tr, unit.pos, unit.pos + node.nodeSize);\r\n view.dispatch(tr);\r\n}\r\n\r\n/** Appends blocks at the end of the email (click-to-insert from the palette). */\r\nexport function appendBlocks(editor: Editor, content: JSONContent[]) {\r\n const root = findRootContainer(editor.state.doc);\r\n if (!root) return;\r\n const last = root.node.lastChild;\r\n const end = root.pos + root.node.nodeSize - 1;\r\n const target: DropTarget =\r\n last && isEmptyParagraph(last) && root.node.childCount > 1\r\n ? { pos: end - last.nodeSize, replaceTo: end, line: { top: 0, left: 0, width: 0 } }\r\n : { pos: end, line: { top: 0, left: 0, width: 0 } };\r\n applyDrop(editor, { kind: 'new', label: '', content: () => content }, target);\r\n}\r\n","import type { Editor } from '@tiptap/core';\nimport { Button } from '@react-email/editor/extensions';\nimport { NodeSelection, TextSelection } from '@tiptap/pm/state';\nimport { COLUMN_PARENTS } from './dnd';\n\n/**\n * The package's Button renders `data-href` and wraps the link in\n * `div.align-*`, but its parseHTML reads neither: a copied button came back\n * with href \"#\" and left-aligned. Read them back so copy/paste round-trips.\n */\nexport const EmailButton = Button.extend({\n parseHTML() {\n return [\n {\n tag: 'a[data-id=\"react-email-button\"]',\n getAttrs: (node) => {\n if (typeof node === 'string') return false;\n const el = node as HTMLElement;\n const alignment = el.parentElement?.className.match(/align-(left|center|right)/)?.[1];\n const cls = el.className.replace(/\\bnode-button\\b/g, '').trim();\n return {\n href: el.getAttribute('href') ?? el.dataset.href ?? '#',\n alignment: alignment ?? 'left',\n class: cls || 'button',\n style: el.getAttribute('style'),\n };\n },\n },\n ];\n },\n});\n\n/**\n * Block-friendly paste, wired as a capture-phase `paste` listener on the canvas:\n *\n * 1. With a block selected (NodeSelection), ProseMirror would *replace* it.\n * Builders (Unlayer, Elementor) paste *after* it instead, so copy + paste on\n * the same block duplicates it. We open an empty paragraph after the block\n * and paste there.\n * 2. Content copied from this editor (`data-pm-slice`) is replayed through\n * `view.pasteHTML` without clipboard data, which makes the package's paste\n * handler step aside and lets ProseMirror restore the exact slice.\n * External HTML still goes through the package's sanitizer.\n *\n * Returns true when the event was handled.\n */\nexport function handleCanvasPaste(editor: Editor, event: ClipboardEvent): boolean {\n const html = event.clipboardData?.getData('text/html') ?? '';\n const internal = html.includes('data-pm-slice');\n const hasFiles = (event.clipboardData?.files?.length ?? 0) > 0;\n if (hasFiles) return false; // image files: the image extension uploads them\n\n const { view } = editor;\n const { state } = view;\n const { selection } = state;\n\n if (selection instanceof NodeSelection && selection.node.isBlock) {\n const node = selection.node;\n // A column can't get siblings: paste at the end of its content instead.\n const isColumn = node.type.name === 'columnsColumn';\n const insertAt = isColumn ? selection.from + node.nodeSize - 1 : selection.from + node.nodeSize;\n const $insert = state.doc.resolve(insertAt);\n const paragraph = state.schema.nodes.paragraph;\n if (COLUMN_PARENTS.has($insert.parent.type.name)) return false;\n if (!$insert.parent.canReplaceWith($insert.index(), $insert.index(), paragraph)) return false;\n // Divider's filterTransaction rejects inserts while a divider is node-selected:\n // collapse the selection in a first transaction.\n view.dispatch(state.tr.setSelection(TextSelection.near($insert)));\n const tr = view.state.tr.insert(insertAt, paragraph.create());\n tr.setSelection(TextSelection.create(tr.doc, insertAt + 1));\n view.dispatch(tr);\n }\n\n if (!internal) return false; // let the browser event continue (package handler / ProseMirror)\n\n event.preventDefault();\n event.stopPropagation();\n view.pasteHTML(html);\n return true;\n}\n","import type { Extensions } from '@tiptap/core';\nimport { generateJSON } from '@tiptap/html';\nimport type { Slice } from '@tiptap/pm/model';\nimport type { EditorView } from '@tiptap/pm/view';\n\n/*\n * Same paste handling as `EmailEditor` from @react-email/editor (MIT), which\n * this library replaces with its own provider so the canvas can be placed\n * anywhere in the layout. Neither helper is exported by the package.\n */\n\nconst EDITOR_CLASS_PATTERN = /class=\"[^\"]*node-/;\nconst FORBIDDEN_TAGS = ['script', 'iframe', 'object', 'embed', 'meta', 'base'];\nconst URL_ATTRIBUTES = ['href', 'src'];\n/** Attributes kept on external content: functional ones only, no style or class. */\nconst PRESERVED_ATTRIBUTES: Record<string, string[]> = {\n a: ['href', 'target', 'rel'],\n img: ['src', 'alt', 'width', 'height'],\n td: ['colspan', 'rowspan'],\n th: ['colspan', 'rowspan', 'scope'],\n table: ['border', 'cellpadding', 'cellspacing'],\n '*': ['id'],\n};\n\nfunction isSafeUrl(value: string, allowDataImage: boolean) {\n const trimmed = value.trim().toLowerCase();\n if (trimmed.startsWith('javascript:') || trimmed.startsWith('vbscript:')) return false;\n if (trimmed.startsWith('data:')) return allowDataImage && trimmed.startsWith('data:image/');\n return true;\n}\n\nfunction sanitizeElement(el: Element) {\n const allowed = new Set([...(PRESERVED_ATTRIBUTES[el.tagName.toLowerCase()] ?? []), ...PRESERVED_ATTRIBUTES['*']]);\n for (const attr of Array.from(el.attributes)) {\n if (attr.name.startsWith('data-') || !allowed.has(attr.name)) el.removeAttribute(attr.name);\n }\n}\n\nfunction sanitizeNode(node: Node) {\n if (node.nodeType === Node.ELEMENT_NODE) sanitizeElement(node as Element);\n for (const child of Array.from(node.childNodes)) sanitizeNode(child);\n}\n\n/**\n * Drops dangerous elements and URL schemes. Content copied from the editor\n * (node-* classes) keeps its attributes; external content keeps semantic HTML only.\n */\nexport function sanitizePastedHtml(html: string) {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n for (const tag of FORBIDDEN_TAGS) for (const el of Array.from(doc.body.getElementsByTagName(tag))) el.remove();\n for (const el of Array.from(doc.body.querySelectorAll('[href], [src]'))) {\n const allowDataImage = el.tagName.toLowerCase() === 'img';\n for (const attr of URL_ATTRIBUTES) {\n const value = el.getAttribute(attr);\n if (value !== null && !isSafeUrl(value, allowDataImage)) el.removeAttribute(attr);\n }\n }\n if (!EDITOR_CLASS_PATTERN.test(html)) sanitizeNode(doc.body);\n return doc.body.innerHTML;\n}\n\nexport function createPasteHandler(extensions: Extensions) {\n return (view: EditorView, event: ClipboardEvent, slice: Slice) => {\n if (slice.content.childCount === 1) return false;\n const html = event.clipboardData?.getData?.('text/html');\n if (!html) return false;\n event.preventDefault();\n const json = generateJSON(sanitizePastedHtml(html), extensions);\n const node = view.state.schema.nodeFromJSON(json);\n view.dispatch(view.state.tr.replaceSelectionWith(node, false));\n return true;\n };\n}\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey, Selection, TextSelection } from '@tiptap/pm/state';\nimport { ReplaceStep } from '@tiptap/pm/transform';\n\nconst SCOPES = new Set(['columnsColumn', 'codeBlock']);\n\n/**\n * Select-all that keeps the email's structure.\n *\n * The package's Mod-a inside a column selects the whole column with a\n * TextSelection whose ends sit on the column itself, not in text. Deleting it\n * (Delete, Backspace, cut) empties the column, but the mapped selection then\n * lands outside it: on the next block as a NodeSelection (the next key\n * replaces that block) or in the next column. Put the caret back in the\n * emptied column instead.\n */\nexport const SelectAllFix = Extension.create({\n name: 'selectAllFix',\n // Above Tiptap's core keymap, whose Mod-a selects the whole document.\n priority: 101,\n\n addKeyboardShortcuts() {\n return {\n // The default select-all also takes the hidden globalContent node (email\n // body styles) and the container: deleting it wiped the theme and layout.\n // Select the container's content instead.\n 'Mod-a': ({ editor }) => {\n const { state } = editor;\n // A column or code block not yet fully selected: its own Mod-a selects it.\n const { $from } = state.selection;\n for (let depth = $from.depth; depth > 0; depth--) {\n if (!SCOPES.has($from.node(depth).type.name)) continue;\n if (state.selection.from !== $from.start(depth) || state.selection.to !== $from.end(depth)) return false;\n }\n let pos = -1;\n state.doc.forEach((node, offset) => {\n if (pos < 0 && node.type.name === 'container') pos = offset;\n });\n const container = pos < 0 ? null : state.doc.nodeAt(pos);\n if (!container) return false;\n const from = pos + 1;\n const to = pos + container.nodeSize - 1;\n if (state.selection.from !== from || state.selection.to !== to) {\n editor.view.dispatch(state.tr.setSelection(TextSelection.create(state.doc, from, to)));\n }\n return true;\n },\n };\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('selectAllFix'),\n appendTransaction(transactions, oldState, newState) {\n const old = oldState.selection;\n if (!(old instanceof TextSelection) || (old.$from.parent.inlineContent && old.$to.parent.inlineContent)) return null;\n const replacesSelection = transactions.some((tr) =>\n tr.steps.some((step) => step instanceof ReplaceStep && step.from === old.from && step.to === old.to),\n );\n if (!replacesSelection) return null;\n\n let from = old.from;\n let to = old.to;\n for (const tr of transactions) {\n from = tr.mapping.map(from, -1);\n to = tr.mapping.map(to, 1);\n }\n // Typing or pasting over the selection leaves the caret in what was inserted.\n const { selection } = newState;\n if (selection instanceof TextSelection && selection.from >= from && selection.to <= to) return null;\n\n const $pos = newState.doc.resolve(from);\n return newState.tr.setSelection(Selection.findFrom($pos, 1, true) ?? Selection.near($pos));\n },\n }),\n ];\n },\n});\n","/** A font offered in the font pickers. `value` is a full CSS `font-family` stack. */\nexport interface FontOption {\n label: string;\n value: string;\n}\n\n/**\n * Fonts installed on virtually every device and supported by every email\n * client, each with fallbacks. Single quotes only: the stack ends up in a\n * `style` attribute.\n */\nexport const defaultFonts: FontOption[] = [\n { label: 'Arial', value: 'Arial, Helvetica, sans-serif' },\n { label: 'Verdana', value: 'Verdana, Geneva, sans-serif' },\n { label: 'Tahoma', value: 'Tahoma, Verdana, Segoe, sans-serif' },\n { label: 'Georgia', value: \"Georgia, 'Times New Roman', Times, serif\" },\n { label: 'Times New Roman', value: \"'Times New Roman', Times, serif\" },\n];\n\n/** First family of a stack, unquoted and lowercased: `\"'Times New Roman', serif\"` -> `times new roman`. */\nfunction primaryFamily(stack: string) {\n return stack.split(',')[0].trim().replace(/^['\"]|['\"]$/g, '').toLowerCase();\n}\n\n/** The option whose first family matches `value` (quotes and fallbacks may differ). */\nexport function findFont(fonts: FontOption[], value: string | undefined): FontOption | undefined {\n if (!value) return undefined;\n const family = primaryFamily(value);\n return fonts.find((font) => primaryFamily(font.value) === family);\n}\n","import type { DragPayload } from './dnd';\n\n/**\n * Per-editor state shared by the canvas, the palette and the layers panel.\n * One instance lives in each `EditorRoot`, so several editors can coexist on a page.\n */\n\n/** Only one drag happens at a time; `dragover` can't read dataTransfer payloads, so the active payload lives here. */\nexport interface DragSession {\n get: () => DragPayload | null;\n start: (payload: DragPayload) => void;\n end: () => void;\n}\n\nexport function createDragSession(): DragSession {\n let active: DragPayload | null = null;\n return {\n get: () => active,\n start: (payload) => {\n active = payload;\n },\n end: () => {\n active = null;\n },\n };\n}\n\n/** Hovered block position: the canvas and the layers panel highlight the same block. */\nexport interface HoverStore {\n get: () => number | null;\n set: (pos: number | null) => void;\n subscribe: (listener: () => void) => () => void;\n}\n\nexport function createHoverStore(): HoverStore {\n let hoverPos: number | null = null;\n const listeners = new Set<() => void>();\n return {\n get: () => hoverPos,\n set: (pos) => {\n if (pos === hoverPos) return;\n hoverPos = pos;\n for (const listener of listeners) listener();\n },\n subscribe: (listener) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n","/** English UI strings (default locale). Every other locale implements the same shape. */\nexport const en = {\n topBar: {\n layers: 'Layers',\n toggleLayers: 'Show / hide layers',\n undo: 'Undo (Ctrl+Z)',\n redo: 'Redo (Ctrl+Y)',\n canvasWidth: 'Canvas width',\n desktop: 'Desktop',\n mobile: 'Mobile',\n template: 'Template',\n confirmTemplate: 'Replace the content with the starter template?',\n import: 'Import',\n exportJson: 'Save JSON',\n preview: 'Preview',\n exportHtml: 'Export HTML',\n invalidFile: (message: string) => `Invalid file: ${message}`,\n },\n preview: {\n dialogLabel: 'Preview and export',\n desktop: 'Desktop',\n mobile: 'Mobile',\n html: 'HTML',\n text: 'Plain text',\n copy: 'Copy',\n copied: 'Copied ✓',\n download: 'Download .html',\n close: 'Close',\n rendering: 'Rendering the email…',\n renderError: (message: string) => `Render error: ${message}`,\n iframeTitle: 'Email preview',\n },\n sidebar: {\n label: 'Side panel',\n tabContent: 'Content',\n tabBlocks: 'Blocks',\n tabBody: 'Body',\n layoutTitle: 'Layout',\n contentTitle: 'Content',\n dragHint: 'Drag an item into the email. A click adds it at the end.',\n tileTitle: (label: string) => `Drag “${label}” into the email (or click to add it at the end)`,\n propertiesEyebrow: 'Properties',\n closeProperties: 'Close (back to content)',\n breadcrumb: 'Hierarchy',\n selectedText: 'Selected text',\n },\n emailHeader: {\n subject: 'Subject',\n subjectPlaceholder: 'Subject line',\n previewText: 'Preview',\n previewTextPlaceholder: 'Shown after the subject line in the inbox',\n },\n body: {\n general: 'General',\n previewText: 'Preview text',\n previewTextPlaceholder: 'Shown after the subject line in the inbox',\n background: 'Background',\n backgroundColor: 'Background color',\n outerPadding: 'Outer padding',\n content: 'Content',\n width: 'Width',\n contentColor: 'Content color',\n innerPadding: 'Inner padding',\n radius: 'Corner radius',\n defaultStyles: 'Default styles',\n font: 'Font',\n fontDefault: 'Default (system font)',\n text: 'Text',\n headings: 'Headings',\n links: 'Links',\n buttonBackground: 'Button background',\n buttonText: 'Button text',\n },\n inspector: {\n typography: 'Typography',\n font: 'Font',\n fontDefault: 'Default (email font)',\n color: 'Color',\n size: 'Size',\n weight: 'Weight',\n weightLight: 'Light',\n weightNormal: 'Normal',\n weightSemibold: 'Semibold',\n weightBold: 'Bold',\n weightExtrabold: 'Extra bold',\n lineHeight: 'Line height',\n alignment: 'Alignment',\n spacing: 'Spacing',\n padding: 'Padding',\n box: 'Background & border',\n backgroundColor: 'Background color',\n radius: 'Corner radius',\n border: 'Border',\n borderColor: 'Border color',\n // Image\n image: 'Image',\n uploadImage: 'Upload an image…',\n imageUrl: 'Image URL',\n altText: 'Alt text',\n altPlaceholder: 'Describe the image',\n layout: 'Layout',\n autoWidth: 'Auto width',\n width: 'Width',\n action: 'Action',\n clickLink: 'Link on click',\n // Button\n linkUrl: 'Link URL',\n button: 'Button',\n textColor: 'Text color',\n textSize: 'Text size',\n buttonPadding: 'Button padding',\n // Social\n networks: 'Networks',\n removeNetwork: 'Remove',\n addNetwork: '+ Add a network',\n appearance: 'Appearance',\n iconSize: 'Icon size',\n gap: 'Spacing',\n // Columns\n columns: 'Columns',\n distribution: 'Distribution',\n equal: 'Equal',\n columnGap: 'Gap between columns',\n columnsHint: 'Click inside a column to set its background and padding.',\n // Spacer\n spacer: 'Spacer',\n height: 'Height',\n // HTML\n htmlCode: 'HTML code',\n htmlHint: 'The HTML is inserted as is in the exported email.',\n // Divider\n line: 'Line',\n thickness: 'Thickness',\n lineStyle: 'Style',\n // Heading\n heading: 'Heading',\n level: 'Level',\n // Text selection\n formatting: 'Formatting',\n bold: 'Bold',\n italic: 'Italic',\n underline: 'Underline',\n strike: 'Strikethrough',\n link: 'Link',\n url: 'URL',\n linkColor: 'Link color',\n },\n fields: {\n colorDefault: 'Default',\n chooseColor: (value: string) => `Pick a color (${value})`,\n hexCode: 'Hex code',\n eyedropper: 'Eyedropper: pick a color on screen',\n documentColors: 'Document colors',\n palette: 'Palette',\n resetColor: 'Reset to default',\n alignLeft: 'Left',\n alignCenter: 'Center',\n alignRight: 'Right',\n top: 'Top',\n right: 'Right',\n bottom: 'Bottom',\n left: 'Left',\n moreOptions: 'More options',\n auto: 'auto',\n },\n layers: {\n title: 'Layers',\n expandAll: 'Expand all',\n collapseAll: 'Collapse all',\n close: 'Close layers',\n tree: 'Email structure',\n emptyEmail: 'The email is empty.',\n emptyZone: 'Empty — drop content here',\n column: (index: number) => `Column ${index}`,\n fixedHint: 'Columns stay in their row',\n itemHint: 'Click to select, drag to move',\n expand: 'Expand',\n collapse: 'Collapse',\n uploadedImage: 'uploaded image',\n empty: 'empty',\n },\n canvas: {\n dropHere: 'Drop here',\n dropLabel: (label: string) => (label ? `Drop “${label}” here` : 'Drop here'),\n emptyZone: 'Drag content here',\n move: 'Drag to move',\n moveLabel: (label: string) => `Move: ${label}`,\n selectParent: (label: string) => `Select: ${label}`,\n duplicate: 'Duplicate',\n delete: 'Delete',\n },\n placeholder: {\n heading: 'Heading',\n paragraph: 'Write, or type “/” for commands',\n },\n nodes: {\n body: 'Body',\n paragraph: 'Text',\n heading: 'Heading',\n image: 'Image',\n button: 'Button',\n horizontalRule: 'Divider',\n spacer: 'Spacer',\n socialLinks: 'Social links',\n htmlBlock: 'HTML',\n section: 'Section',\n twoColumns: 'Row · 2 columns',\n threeColumns: 'Row · 3 columns',\n fourColumns: 'Row · 4 columns',\n columnsColumn: 'Column',\n bulletList: 'List',\n orderedList: 'Numbered list',\n listItem: 'List item',\n blockquote: 'Quote',\n codeBlock: 'Code',\n table: 'Table',\n container: 'Email',\n } as Record<string, string>,\n palette: {\n oneColumn: '1 column',\n twoColumns: '2 columns',\n threeColumns: '3 columns',\n fourColumns: '4 columns',\n heading: 'Heading',\n text: 'Text',\n button: 'Button',\n image: 'Image',\n divider: 'Divider',\n spacer: 'Spacer',\n social: 'Social',\n menu: 'Menu',\n list: 'List',\n quote: 'Quote',\n html: 'HTML',\n card: 'Card',\n },\n templates: {\n header: 'Header',\n headerDescription: 'Logo on the left, menu on the right',\n hero: 'Hero',\n heroDescription: 'Big heading, tagline and button',\n products: 'Products',\n productsDescription: 'Two product cards side by side',\n features: 'Features',\n featuresDescription: 'Three columns with heading + text',\n testimonial: 'Testimonial',\n testimonialDescription: 'Highlighted customer quote',\n footer: 'Footer',\n footerDescription: 'Social links, address and unsubscribe',\n },\n /** Default text inserted by the palette, the templates and the starter email. */\n content: {\n heading: 'Your heading here',\n text: 'This is a new text block. Click it to edit the content, select text to format it.',\n button: 'Click here',\n image: 'Image',\n menuHome: 'Home',\n menuShop: 'Shop',\n menuBlog: 'Blog',\n menuContact: 'Contact',\n listItems: ['First item', 'Second item', 'Third item'],\n quote: '“A quote that highlights your message.”',\n html: '<p style=\"margin:0;text-align:center;font-family:sans-serif\">Your custom <strong>HTML</strong></p>',\n cardTitle: 'Did you know?',\n cardText: 'A card draws attention to an important piece of information.',\n logo: 'LOGO',\n heroTitle: 'What’s new this season',\n heroText: 'Discover our selection made for you, available today.',\n heroButton: 'Discover',\n productA: 'Product A',\n productB: 'Product B',\n productText: 'A short description of the product.',\n productButton: 'Buy',\n features: ['Free shipping', 'Free returns', '24/7 support'],\n featureText: 'A clear and concise argument.',\n testimonialQuote: '“Flawless service, I recommend it with my eyes closed.”',\n testimonialAuthor: '— Camille, customer since 2021',\n footerAddress: 'Acme Inc. · 10 Main Street, Springfield',\n unsubscribe: 'Unsubscribe',\n starterTitle: 'Our favourites',\n },\n /** Translations of the package's “/” commands, keyed by their English title. */\n slashCommands: {} as Record<string, { title: string; description: string }>,\n};\n\nexport type Messages = typeof en;\n","import type { Messages } from './en';\n\n/** Textes de l'interface en français. */\nexport const fr: Messages = {\n topBar: {\n layers: 'Calques',\n toggleLayers: 'Afficher / masquer les calques',\n undo: 'Annuler (Ctrl+Z)',\n redo: 'Rétablir (Ctrl+Y)',\n canvasWidth: 'Largeur du canvas',\n desktop: 'Bureau',\n mobile: 'Mobile',\n template: 'Modèle',\n confirmTemplate: 'Remplacer le contenu par le modèle de départ ?',\n import: 'Importer',\n exportJson: 'Enregistrer JSON',\n preview: 'Aperçu',\n exportHtml: 'Exporter HTML',\n invalidFile: (message) => `Fichier invalide : ${message}`,\n },\n preview: {\n dialogLabel: 'Aperçu et export',\n desktop: 'Bureau',\n mobile: 'Mobile',\n html: 'HTML',\n text: 'Texte brut',\n copy: 'Copier',\n copied: 'Copié ✓',\n download: 'Télécharger .html',\n close: 'Fermer',\n rendering: 'Rendu de l’email…',\n renderError: (message) => `Erreur de rendu : ${message}`,\n iframeTitle: 'Aperçu de l’email',\n },\n sidebar: {\n label: 'Panneau latéral',\n tabContent: 'Contenu',\n tabBlocks: 'Blocs',\n tabBody: 'Corps',\n layoutTitle: 'Mise en page',\n contentTitle: 'Contenus',\n dragHint: 'Glissez un élément dans l’email. Un clic l’ajoute à la fin.',\n tileTitle: (label) => `Glissez « ${label} » dans l’email (ou cliquez pour l’ajouter à la fin)`,\n propertiesEyebrow: 'Propriétés',\n closeProperties: 'Fermer (retour aux contenus)',\n breadcrumb: 'Hiérarchie',\n selectedText: 'Texte sélectionné',\n },\n emailHeader: {\n subject: 'Objet',\n subjectPlaceholder: 'Objet de l’email',\n previewText: 'Aperçu',\n previewTextPlaceholder: 'Affiché après l’objet dans la boîte de réception',\n },\n body: {\n general: 'Général',\n previewText: 'Texte d’aperçu',\n previewTextPlaceholder: 'Affiché après l’objet dans la boîte de réception',\n background: 'Arrière-plan',\n backgroundColor: 'Couleur de fond',\n outerPadding: 'Marge extérieure',\n content: 'Contenu',\n width: 'Largeur',\n contentColor: 'Couleur du contenu',\n innerPadding: 'Marge intérieure',\n radius: 'Arrondi',\n defaultStyles: 'Styles par défaut',\n font: 'Police',\n fontDefault: 'Par défaut (police système)',\n text: 'Texte',\n headings: 'Titres',\n links: 'Liens',\n buttonBackground: 'Fond des boutons',\n buttonText: 'Texte des boutons',\n },\n inspector: {\n typography: 'Typographie',\n font: 'Police',\n fontDefault: 'Par défaut (police de l’email)',\n color: 'Couleur',\n size: 'Taille',\n weight: 'Graisse',\n weightLight: 'Fin',\n weightNormal: 'Normal',\n weightSemibold: 'Semi-gras',\n weightBold: 'Gras',\n weightExtrabold: 'Extra-gras',\n lineHeight: 'Interligne',\n alignment: 'Alignement',\n spacing: 'Espacement',\n padding: 'Marge intérieure',\n box: 'Fond et bordure',\n backgroundColor: 'Couleur de fond',\n radius: 'Arrondi',\n border: 'Bordure',\n borderColor: 'Couleur de bordure',\n image: 'Image',\n uploadImage: 'Importer une image…',\n imageUrl: 'URL de l’image',\n altText: 'Texte alternatif',\n altPlaceholder: 'Décrivez l’image',\n layout: 'Disposition',\n autoWidth: 'Largeur auto',\n width: 'Largeur',\n action: 'Action',\n clickLink: 'Lien au clic',\n linkUrl: 'URL du lien',\n button: 'Bouton',\n textColor: 'Couleur du texte',\n textSize: 'Taille du texte',\n buttonPadding: 'Marges du bouton',\n networks: 'Réseaux',\n removeNetwork: 'Retirer',\n addNetwork: '+ Ajouter un réseau',\n appearance: 'Apparence',\n iconSize: 'Taille des icônes',\n gap: 'Espacement',\n columns: 'Colonnes',\n distribution: 'Répartition',\n equal: 'Égales',\n columnGap: 'Espace entre colonnes',\n columnsHint: 'Cliquez dans une colonne pour régler son fond et ses marges.',\n spacer: 'Espacement',\n height: 'Hauteur',\n htmlCode: 'Code HTML',\n htmlHint: 'Le HTML est inséré tel quel dans l’email exporté.',\n line: 'Ligne',\n thickness: 'Épaisseur',\n lineStyle: 'Style',\n heading: 'Titre',\n level: 'Niveau',\n formatting: 'Mise en forme',\n bold: 'Gras',\n italic: 'Italique',\n underline: 'Souligné',\n strike: 'Barré',\n link: 'Lien',\n url: 'URL',\n linkColor: 'Couleur du lien',\n },\n fields: {\n colorDefault: 'Par défaut',\n chooseColor: (value) => `Choisir une couleur (${value})`,\n hexCode: 'Code hexadécimal',\n eyedropper: 'Pipette : prendre une couleur à l’écran',\n documentColors: 'Couleurs du document',\n palette: 'Palette',\n resetColor: 'Revenir à la valeur par défaut',\n alignLeft: 'Gauche',\n alignCenter: 'Centre',\n alignRight: 'Droite',\n top: 'Haut',\n right: 'Droite',\n bottom: 'Bas',\n left: 'Gauche',\n moreOptions: 'Plus d’options',\n auto: 'auto',\n },\n layers: {\n title: 'Calques',\n expandAll: 'Tout déplier',\n collapseAll: 'Tout replier',\n close: 'Fermer les calques',\n tree: 'Structure de l’email',\n emptyEmail: 'L’email est vide.',\n emptyZone: 'Vide — déposez du contenu ici',\n column: (index) => `Colonne ${index}`,\n fixedHint: 'Les colonnes restent dans leur ligne',\n itemHint: 'Cliquer pour sélectionner, glisser pour déplacer',\n expand: 'Déplier',\n collapse: 'Replier',\n uploadedImage: 'image importée',\n empty: 'vide',\n },\n canvas: {\n dropHere: 'Déposer ici',\n dropLabel: (label) => (label ? `Déposer « ${label} » ici` : 'Déposer ici'),\n emptyZone: 'Glissez du contenu ici',\n move: 'Glisser pour déplacer',\n moveLabel: (label) => `Déplacer : ${label}`,\n selectParent: (label) => `Sélectionner : ${label}`,\n duplicate: 'Dupliquer',\n delete: 'Supprimer',\n },\n placeholder: {\n heading: 'Titre',\n paragraph: 'Écrivez, ou tapez « / » pour les commandes',\n },\n nodes: {\n body: 'Corps',\n paragraph: 'Texte',\n heading: 'Titre',\n image: 'Image',\n button: 'Bouton',\n horizontalRule: 'Séparateur',\n spacer: 'Espacement',\n socialLinks: 'Réseaux sociaux',\n htmlBlock: 'HTML',\n section: 'Section',\n twoColumns: 'Ligne · 2 colonnes',\n threeColumns: 'Ligne · 3 colonnes',\n fourColumns: 'Ligne · 4 colonnes',\n columnsColumn: 'Colonne',\n bulletList: 'Liste',\n orderedList: 'Liste numérotée',\n listItem: 'Élément de liste',\n blockquote: 'Citation',\n codeBlock: 'Code',\n table: 'Tableau',\n container: 'Email',\n },\n palette: {\n oneColumn: '1 colonne',\n twoColumns: '2 colonnes',\n threeColumns: '3 colonnes',\n fourColumns: '4 colonnes',\n heading: 'Titre',\n text: 'Texte',\n button: 'Bouton',\n image: 'Image',\n divider: 'Séparateur',\n spacer: 'Espacement',\n social: 'Réseaux',\n menu: 'Menu',\n list: 'Liste',\n quote: 'Citation',\n html: 'HTML',\n card: 'Encadré',\n },\n templates: {\n header: 'En-tête',\n headerDescription: 'Logo à gauche, menu à droite',\n hero: 'Hero',\n heroDescription: 'Grand titre, accroche et bouton',\n products: 'Produits',\n productsDescription: 'Deux cartes produit côte à côte',\n features: 'Avantages',\n featuresDescription: 'Trois colonnes titre + texte',\n testimonial: 'Témoignage',\n testimonialDescription: 'Citation client mise en avant',\n footer: 'Pied de page',\n footerDescription: 'Réseaux sociaux, adresse et désinscription',\n },\n content: {\n heading: 'Votre titre ici',\n text: 'Ceci est un nouveau bloc de texte. Cliquez dessus pour modifier le contenu, sélectionnez du texte pour le mettre en forme.',\n button: 'Cliquez ici',\n image: 'Image',\n menuHome: 'Accueil',\n menuShop: 'Boutique',\n menuBlog: 'Blog',\n menuContact: 'Contact',\n listItems: ['Premier point', 'Deuxième point', 'Troisième point'],\n quote: '« Une citation qui met en valeur votre message. »',\n html: '<p style=\"margin:0;text-align:center;font-family:sans-serif\">Votre <strong>HTML</strong> personnalisé</p>',\n cardTitle: 'Le saviez-vous ?',\n cardText: 'Un encadré attire l’œil sur une information importante.',\n logo: 'LOGO',\n heroTitle: 'Les nouveautés de la saison',\n heroText: 'Découvrez notre sélection pensée pour vous, disponible dès aujourd’hui.',\n heroButton: 'Découvrir',\n productA: 'Produit A',\n productB: 'Produit B',\n productText: 'Une courte description du produit.',\n productButton: 'Acheter',\n features: ['Livraison offerte', 'Retours gratuits', 'Support 7j/7'],\n featureText: 'Un argument clair et concis.',\n testimonialQuote: '« Service impeccable, je recommande les yeux fermés. »',\n testimonialAuthor: '— Camille, cliente depuis 2021',\n footerAddress: 'Acme SAS · 10 rue de la Paix, 75002 Paris',\n unsubscribe: 'Se désinscrire',\n starterTitle: 'Nos coups de cœur',\n },\n slashCommands: {\n Text: { title: 'Texte', description: 'Paragraphe simple' },\n Title: { title: 'Titre', description: 'Grand titre' },\n Subtitle: { title: 'Sous-titre', description: 'Titre moyen' },\n Heading: { title: 'Intertitre', description: 'Petit titre' },\n 'Bullet list': { title: 'Liste à puces', description: 'Liste non ordonnée' },\n 'Numbered list': { title: 'Liste numérotée', description: 'Liste ordonnée' },\n Quote: { title: 'Citation', description: 'Bloc de citation' },\n 'Code block': { title: 'Bloc de code', description: 'Extrait de code' },\n Button: { title: 'Bouton', description: 'Bouton cliquable' },\n Divider: { title: 'Séparateur', description: 'Ligne horizontale' },\n Section: { title: 'Section', description: 'Section de contenu' },\n '2 columns': { title: '2 colonnes', description: 'Mise en page sur deux colonnes' },\n '3 columns': { title: '3 colonnes', description: 'Mise en page sur trois colonnes' },\n '4 columns': { title: '4 colonnes', description: 'Mise en page sur quatre colonnes' },\n },\n};\n","import { en, type Messages } from './en';\nimport { fr } from './fr';\n\nexport { en, fr, type Messages };\n\n/** Built-in locales. Pass your own `messages` to support any other language. */\nexport const locales = { en, fr } as const;\n\nexport type BuiltInLocale = keyof typeof locales;\n\nexport interface I18n {\n locale: string;\n t: Messages;\n}\n\n/**\n * A user-facing string: plain text, or a function of the current locale.\n * Lets custom palette items and templates follow the editor's language.\n */\nexport type Label = string | ((i18n: I18n) => string);\n\nexport function resolveLabel(label: Label, i18n: I18n): string {\n return typeof label === 'function' ? label(i18n) : label;\n}\n\ntype DeepPartial<T> = {\n [K in keyof T]?: T[K] extends (...args: never[]) => unknown\n ? T[K]\n : T[K] extends readonly unknown[]\n ? T[K]\n : T[K] extends object\n ? DeepPartial<T[K]>\n : T[K];\n};\n\nexport type PartialMessages = DeepPartial<Messages>;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction merge<T>(base: T, patch: unknown): T {\n if (!isPlainObject(patch) || !isPlainObject(base)) return (patch ?? base) as T;\n const result: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) continue;\n result[key] = isPlainObject(value) && isPlainObject(result[key]) ? merge(result[key], value) : value;\n }\n return result as T;\n}\n\n/** Built-in locale (falls back to English) with optional overrides on top. */\nexport function resolveMessages(locale: string, overrides?: PartialMessages): Messages {\n const base = (locales as Record<string, Messages>)[locale] ?? en;\n return overrides ? merge(base, overrides) : base;\n}\n","/** Icons missing from @react-email/editor/ui. All accept a `size` like the package's icons. */\n\ninterface IconProps {\n size?: number;\n}\n\nconst stroke = (size: number, strokeWidth = 2) => ({\n viewBox: '0 0 24 24',\n width: size,\n height: size,\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n 'aria-hidden': true,\n});\n\nexport const GripIcon = ({ size = 14 }: IconProps) => (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"currentColor\" aria-hidden>\n {[6, 12, 18].map((y) => (\n <g key={y}>\n <circle cx=\"9\" cy={y} r=\"1.6\" />\n <circle cx=\"15\" cy={y} r=\"1.6\" />\n </g>\n ))}\n </svg>\n);\n\nexport const CopyIcon = ({ size = 14 }: IconProps) => (\n <svg {...stroke(size)}>\n <rect x=\"8\" y=\"8\" width=\"12\" height=\"12\" rx=\"2\" />\n <path d=\"M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2\" />\n </svg>\n);\n\nexport const TrashIcon = ({ size = 14 }: IconProps) => (\n <svg {...stroke(size)}>\n <path d=\"M4 7h16M10 11v6M14 11v6M6 7l1 12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l1-12M9 7V4h6v3\" />\n </svg>\n);\n\nexport const ParentIcon = ({ size = 14 }: IconProps) => (\n <svg {...stroke(size)}>\n <path d=\"M12 19V5M6 11l6-6 6 6\" />\n </svg>\n);\n\nexport const UndoIcon = ({ size = 16 }: IconProps) => (\n <svg {...stroke(size)}>\n <path d=\"M9 14 4 9l5-5\" />\n <path d=\"M4 9h10.5a5.5 5.5 0 0 1 0 11H11\" />\n </svg>\n);\n\nexport const RedoIcon = ({ size = 16 }: IconProps) => (\n <svg {...stroke(size)}>\n <path d=\"m15 14 5-5-5-5\" />\n <path d=\"M20 9H9.5a5.5 5.5 0 0 0 0 11H13\" />\n </svg>\n);\n\nexport const DesktopIcon = ({ size = 16 }: IconProps) => (\n <svg {...stroke(size)}>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"12\" rx=\"2\" />\n <path d=\"M8 20h8M12 16v4\" />\n </svg>\n);\n\nexport const MobileIcon = ({ size = 16 }: IconProps) => (\n <svg {...stroke(size)}>\n <rect x=\"7\" y=\"2\" width=\"10\" height=\"20\" rx=\"2\" />\n <path d=\"M11 18h2\" />\n </svg>\n);\n\nexport const LayersIcon = ({ size = 16 }: IconProps) => (\n <svg {...stroke(size)}>\n <path d=\"m12 3 9 5-9 5-9-5 9-5Z\" />\n <path d=\"m3 13 9 5 9-5\" />\n </svg>\n);\n\nexport const PipetteIcon = ({ size = 15 }: IconProps) => (\n <svg {...stroke(size)}>\n <path d=\"m2 22 1-1h3l9-9\" />\n <path d=\"M3 21v-3l9-9\" />\n <path d=\"m15 6 3.4-3.4a2.1 2.1 0 1 1 3 3L18 9l.4.4a2.1 2.1 0 1 1-3 3l-3.8-3.8a2.1 2.1 0 1 1 3-3l.4.4Z\" />\n </svg>\n);\n\n/** Layers-panel spacer icon (small). */\nexport const SpacerIcon = ({ size = 14 }: IconProps) => (\n <svg {...stroke(size)}>\n <path d=\"M4 4h16M4 20h16M12 8v8\" />\n </svg>\n);\n\n/** Palette spacer icon (with arrows). */\nexport const SpacerTileIcon = ({ size = 22 }: IconProps) => (\n <svg {...stroke(size, 1.8)}>\n <path d=\"M4 4h16M4 20h16M12 7v10M9 9.5 12 7l3 2.5M9 14.5l3 2.5 3-2.5\" />\n </svg>\n);\n\nexport const SocialIcon = ({ size = 22 }: IconProps) => (\n <svg {...stroke(size, 1.8)}>\n <circle cx=\"6\" cy=\"12\" r=\"2.5\" />\n <circle cx=\"18\" cy=\"6\" r=\"2.5\" />\n <circle cx=\"18\" cy=\"18\" r=\"2.5\" />\n <path d=\"m8.2 10.8 7.6-3.6M8.2 13.2l7.6 3.6\" />\n </svg>\n);\n\nexport const OneColumnIcon = ({ size = 22 }: IconProps) => (\n <svg {...stroke(size, 1.8)}>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n </svg>\n);\n","import * as Popover from '@radix-ui/react-popover';\nimport { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { HexColorInput, HexColorPicker } from 'react-colorful';\nimport { AlignCenterIcon, AlignLeftIcon, AlignRightIcon, EditorFocusScope } from '@react-email/editor/ui';\nimport { useMessages, useOptionalEmailEditor } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { defaultFonts, findFont } from '../core/fonts';\nimport { PipetteIcon } from './icons';\n\n/**\n * Form controls of the properties panel. Exported so custom inspectors look\n * like the built-in ones. Text-like inputs commit on blur / Enter to avoid\n * spamming editor transactions.\n */\n\nexport interface GroupProps extends StyleProps {\n title: string;\n children: ReactNode;\n defaultOpen?: boolean;\n}\n\n/** Collapsible section of the properties panel. */\nexport function Group({ title, children, defaultOpen = true, className, style }: GroupProps) {\n const [open, setOpen] = useState(defaultOpen);\n return (\n <section className={cx('bree-group', className)} style={style}>\n <button type=\"button\" className=\"bree-group-header\" onClick={() => setOpen(!open)} aria-expanded={open}>\n <span>{title}</span>\n <span className={cx('bree-chevron', open && 'bree-open')} aria-hidden>\n ›\n </span>\n </button>\n {open && <div className=\"bree-group-body\">{children}</div>}\n </section>\n );\n}\n\nexport interface FieldProps extends StyleProps {\n label: string;\n children: ReactNode;\n /** Label above the control instead of beside it. */\n stacked?: boolean;\n}\n\nexport function Field({ label, children, stacked, className, style }: FieldProps) {\n return (\n <label className={cx('bree-field', stacked && 'bree-stacked', className)} style={style}>\n <span className=\"bree-field-label\">{label}</span>\n <span className=\"bree-field-control\">{children}</span>\n </label>\n );\n}\n\n/** Local draft that resets whenever the external value changes. */\nfunction useDraft<T>(value: T) {\n const [draft, setDraft] = useState(value);\n const [synced, setSynced] = useState(value);\n if (!Object.is(value, synced)) {\n setSynced(value);\n setDraft(value);\n }\n return [draft, setDraft] as const;\n}\n\nexport interface TextInputProps extends StyleProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n type?: string;\n}\n\nexport function TextInput({ value, onChange, placeholder, type = 'text', className, style }: TextInputProps) {\n const [draft, setDraft] = useDraft(value);\n return (\n <input\n className={cx('bree-input', className)}\n style={style}\n type={type}\n value={draft}\n placeholder={placeholder}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => draft !== value && onChange(draft)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onChange(draft);\n }}\n />\n );\n}\n\nexport interface TextAreaProps extends StyleProps {\n value: string;\n onChange: (value: string) => void;\n rows?: number;\n}\n\nexport function TextArea({ value, onChange, rows = 8, className, style }: TextAreaProps) {\n const [draft, setDraft] = useDraft(value);\n return (\n <textarea\n className={cx('bree-input bree-textarea', className)}\n style={style}\n rows={rows}\n value={draft}\n spellCheck={false}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => draft !== value && onChange(draft)}\n />\n );\n}\n\nfunction toNumber(value: unknown): number | '' {\n if (value === undefined || value === null || value === '' || value === 'auto') return '';\n const n = Number.parseFloat(String(value));\n return Number.isFinite(n) ? n : '';\n}\n\nexport interface NumberInputProps extends StyleProps {\n value: unknown;\n onChange: (value: number | '') => void;\n unit?: string;\n min?: number;\n max?: number;\n step?: number;\n placeholder?: string;\n}\n\n/** Number with a unit suffix. Arrow keys step (Shift = ×10). Empty means \"auto\". */\nexport function NumberInput({ value, onChange, unit = 'px', min = 0, max, step = 1, placeholder, className, style }: NumberInputProps) {\n const t = useMessages();\n const [draft, setDraft] = useDraft<string>(String(toNumber(value)));\n const commit = (raw: string) => {\n if (raw.trim() === '') return onChange('');\n const n = Number.parseFloat(raw);\n if (Number.isFinite(n)) onChange(Math.max(min, max !== undefined ? Math.min(max, n) : n));\n };\n return (\n <span className={cx('bree-number', className)} style={style}>\n <input\n className=\"bree-input\"\n inputMode=\"decimal\"\n value={draft}\n placeholder={placeholder ?? t.fields.auto}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => commit(draft)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commit(draft);\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const current = toNumber(draft) || 0;\n const next = current + (e.key === 'ArrowUp' ? step : -step) * (e.shiftKey ? 10 : 1);\n setDraft(String(next));\n commit(String(next));\n }\n }}\n />\n {unit && <span className=\"bree-unit\">{unit}</span>}\n </span>\n );\n}\n\nexport interface RangeInputProps extends StyleProps {\n value: unknown;\n onChange: (value: number) => void;\n min: number;\n max: number;\n unit?: string;\n}\n\nexport function RangeInput({ value, onChange, min, max, unit = 'px', className, style }: RangeInputProps) {\n const n = toNumber(value) || min;\n return (\n <span className={cx('bree-range', className)} style={style}>\n <input type=\"range\" min={min} max={max} value={n} onChange={(e) => onChange(Number(e.target.value))} />\n <span className=\"bree-range-value\">\n {n}\n {unit}\n </span>\n </span>\n );\n}\n\nexport const DEFAULT_SWATCHES = [\n '#111827', '#374151', '#6b7280', '#d1d5db', '#f3f4f6', '#ffffff',\n '#ef4444', '#f97316', '#f59e0b', '#10b981', '#0ea5e9', '#2563eb',\n '#4f46e5', '#7c3aed', '#db2777', '#eef2ff', '#ecfdf5', '#fef3c7',\n];\n\n/** \"#abc\" / \"#aabbcc\" / \"rgb(1, 2, 3)\" -> \"#aabbcc\" (null when not a plain color). */\nexport function toHex(color: string): string | null {\n const c = color.trim().toLowerCase();\n if (/^#[0-9a-f]{6}$/.test(c)) return c;\n if (/^#[0-9a-f]{3}$/.test(c)) return `#${[...c.slice(1)].map((x) => x + x).join('')}`;\n const rgb = c.match(/^rgba?\\(\\s*(\\d+)[\\s,]+(\\d+)[\\s,]+(\\d+)/);\n if (rgb) return `#${rgb.slice(1, 4).map((n) => Number(n).toString(16).padStart(2, '0')).join('')}`;\n return null;\n}\n\ntype EyeDropperCtor = new () => { open: () => Promise<{ sRGBHex: string }> };\n\nexport interface ColorInputProps extends StyleProps {\n value: unknown;\n onChange: (value: string) => void;\n /** Colors already used in the document, offered first. */\n presets?: string[];\n /** Palette of the picker. */\n swatches?: string[];\n placeholder?: string;\n /** Class name of the (portaled) picker popover. */\n popoverClassName?: string;\n}\n\n/**\n * Color field: swatch + hex text, opening a react-colorful picker in a Radix\n * popover. The popover is portaled out of the sidebar, so it is wrapped in an\n * EditorFocusScope: interacting with it keeps the block selected.\n */\nexport function ColorInput({\n value,\n onChange,\n presets = [],\n swatches = DEFAULT_SWATCHES,\n placeholder,\n className,\n style,\n popoverClassName,\n}: ColorInputProps) {\n const t = useMessages();\n const emptyLabel = placeholder ?? t.fields.colorDefault;\n const raw = typeof value === 'string' ? value : '';\n const hex = toHex(raw);\n const [open, setOpen] = useState(false);\n const [draft, setDraft] = useState(hex ?? '#ffffff');\n const onChangeRef = useRef(onChange);\n useEffect(() => {\n onChangeRef.current = onChange;\n });\n const pending = useRef<string | null>(null);\n const timer = useRef(0);\n\n const flush = () => {\n window.clearTimeout(timer.current);\n timer.current = 0;\n if (pending.current) onChangeRef.current(pending.current);\n pending.current = null;\n };\n // Dragging in the picker fires continuously: commit at most every 60ms.\n const live = (color: string) => {\n setDraft(color);\n pending.current = color;\n if (!timer.current) timer.current = window.setTimeout(flush, 60);\n };\n const commit = (color: string) => {\n pending.current = null;\n window.clearTimeout(timer.current);\n timer.current = 0;\n setDraft(toHex(color) ?? draft);\n onChangeRef.current(color);\n };\n\n const EyeDropper = typeof window !== 'undefined' ? (window as unknown as { EyeDropper?: EyeDropperCtor }).EyeDropper : undefined;\n const documentColors = [...new Set(presets.map((c) => toHex(c)).filter((c): c is string => !!c))].slice(0, 9);\n\n return (\n <Popover.Root\n open={open}\n onOpenChange={(next) => {\n if (next) setDraft(hex ?? '#ffffff');\n else flush();\n setOpen(next);\n }}\n >\n <span className={cx('bree-color-field', className)} style={style}>\n <Popover.Trigger asChild>\n <button\n type=\"button\"\n className={cx('bree-color-trigger', !hex && 'bree-empty')}\n style={hex ? { background: hex } : undefined}\n aria-label={t.fields.chooseColor(raw || emptyLabel)}\n />\n </Popover.Trigger>\n <TextInput value={raw} onChange={onChange} placeholder={emptyLabel} />\n </span>\n <Popover.Portal>\n <EditorFocusScope>\n <Popover.Content\n // Portaled outside the editor root: `bree` brings the theme variables along.\n className={cx('bree bree-color-popover', popoverClassName)}\n side=\"left\"\n align=\"start\"\n sideOffset={10}\n collisionPadding={12}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <HexColorPicker color={draft} onChange={live} />\n <div className=\"bree-color-popover-row\">\n <span className=\"bree-color-preview\" style={{ background: draft }} />\n <label className=\"bree-hex-field\">\n <span>#</span>\n <HexColorInput color={draft} onChange={commit} aria-label={t.fields.hexCode} />\n </label>\n {EyeDropper && (\n <button\n type=\"button\"\n className=\"bree-icon-button\"\n title={t.fields.eyedropper}\n onClick={() =>\n new EyeDropper()\n .open()\n .then((result) => commit(result.sRGBHex))\n .catch(() => {})\n }\n >\n <PipetteIcon />\n </button>\n )}\n </div>\n {documentColors.length > 0 && (\n <>\n <span className=\"bree-color-popover-title\">{t.fields.documentColors}</span>\n <div className=\"bree-swatches\">\n {documentColors.map((swatch) => (\n <button key={swatch} type=\"button\" className=\"bree-swatch\" style={{ background: swatch }} title={swatch} onClick={() => commit(swatch)} />\n ))}\n </div>\n </>\n )}\n <span className=\"bree-color-popover-title\">{t.fields.palette}</span>\n <div className=\"bree-swatches\">\n {swatches.map((swatch) => (\n <button\n key={swatch}\n type=\"button\"\n className={cx('bree-swatch', swatch === draft && 'bree-active')}\n style={{ background: swatch }}\n title={swatch}\n onClick={() => commit(swatch)}\n />\n ))}\n </div>\n <button\n type=\"button\"\n className=\"bree-color-reset\"\n onClick={() => {\n pending.current = null;\n onChangeRef.current('');\n setOpen(false);\n }}\n >\n {t.fields.resetColor}\n </button>\n </Popover.Content>\n </EditorFocusScope>\n </Popover.Portal>\n </Popover.Root>\n );\n}\n\nexport interface SelectProps extends StyleProps {\n value: string;\n onChange: (value: string) => void;\n /** [value, label] pairs. */\n options: Array<[string, string]>;\n}\n\nexport function Select({ value, onChange, options, className, style }: SelectProps) {\n return (\n <select className={cx('bree-input bree-select', className)} style={style} value={value} onChange={(e) => onChange(e.target.value)}>\n {options.map(([v, label]) => (\n <option key={v} value={v}>\n {label}\n </option>\n ))}\n </select>\n );\n}\n\nexport interface FontInputProps extends StyleProps {\n /** A CSS `font-family` stack, or '' for none. */\n value: string | undefined;\n onChange: (value: string) => void;\n /** Label of an extra first option that clears the font (''), e.g. \"Default\". */\n emptyLabel?: string;\n}\n\n/** Font picker over the editor's `fonts`. Each option is drawn in its own font. */\nexport function FontInput({ value, onChange, emptyLabel, className, style }: FontInputProps) {\n const fonts = useOptionalEmailEditor()?.fonts ?? defaultFonts;\n const match = findFont(fonts, value);\n // A stack set elsewhere (pasted HTML, older document) stays selectable as is.\n const custom = value && !match ? { label: value.split(',')[0].replace(/['\"]/g, '').trim(), value } : null;\n const options = custom ? [...fonts, custom] : fonts;\n return (\n <select\n className={cx('bree-input bree-select', className)}\n style={{ fontFamily: value || undefined, ...style }}\n value={match?.value ?? value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n >\n {(emptyLabel !== undefined || !value) && <option value=\"\">{emptyLabel ?? ''}</option>}\n {options.map((font) => (\n <option key={font.value} value={font.value} style={{ fontFamily: font.value }}>\n {font.label}\n </option>\n ))}\n </select>\n );\n}\n\nexport interface SegmentedProps<T extends string> extends StyleProps {\n value: T;\n onChange: (value: T) => void;\n options: Array<{ value: T; label: ReactNode; title?: string }>;\n ariaLabel?: string;\n}\n\nexport function Segmented<T extends string>({ value, onChange, options, ariaLabel, className, style }: SegmentedProps<T>) {\n return (\n <span className={cx('bree-segmented', className)} style={style} role=\"radiogroup\" aria-label={ariaLabel}>\n {options.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={value === option.value}\n title={option.title}\n className={cx(value === option.value && 'bree-active')}\n onClick={() => onChange(option.value)}\n >\n {option.label}\n </button>\n ))}\n </span>\n );\n}\n\nexport interface AlignInputProps extends StyleProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nexport function AlignInput({ value, onChange, className, style }: AlignInputProps) {\n const t = useMessages();\n return (\n <Segmented\n className={className}\n style={style}\n value={value || 'left'}\n onChange={onChange}\n options={[\n { value: 'left', label: <AlignLeftIcon size={14} />, title: t.fields.alignLeft },\n { value: 'center', label: <AlignCenterIcon size={14} />, title: t.fields.alignCenter },\n { value: 'right', label: <AlignRightIcon size={14} />, title: t.fields.alignRight },\n ]}\n />\n );\n}\n\nexport type Side = 'Top' | 'Right' | 'Bottom' | 'Left';\n\nexport interface PaddingInputProps extends StyleProps {\n get: (side: Side) => unknown;\n set: (changes: Array<[side: Side, value: number | '']>) => void;\n}\n\n/** One value for the four sides, or four values with \"More options\". */\nexport function PaddingInput({ get, set, className, style }: PaddingInputProps) {\n const t = useMessages();\n const sides = ['Top', 'Right', 'Bottom', 'Left'] as const;\n const values = sides.map((side) => toNumber(get(side)));\n const uniform = values.every((v) => v === values[0]);\n const [expanded, setExpanded] = useState(!uniform);\n const labels = { Top: t.fields.top, Right: t.fields.right, Bottom: t.fields.bottom, Left: t.fields.left };\n return (\n <div className={cx('bree-padding', className)} style={style}>\n {expanded ? (\n <div className=\"bree-padding-grid\">\n {sides.map((side, i) => (\n <label key={side} className=\"bree-padding-side\">\n <span>{labels[side]}</span>\n <NumberInput value={values[i]} onChange={(v) => set([[side, v]])} />\n </label>\n ))}\n </div>\n ) : (\n <NumberInput value={values[0]} onChange={(v) => set(sides.map((side) => [side, v]))} />\n )}\n <label className=\"bree-checkbox\">\n <input type=\"checkbox\" checked={expanded} onChange={(e) => setExpanded(e.target.checked)} />\n {t.fields.moreOptions}\n </label>\n </div>\n );\n}\n","import type { InspectorNodeContext } from '@react-email/editor/ui';\nimport type { KnownCssProperties } from '@react-email/editor/plugins';\nimport { useMessages } from '../../context';\nimport type { StyleProps } from '../../core/cx';\nimport { AlignInput, ColorInput, Field, FontInput, Group, NumberInput, PaddingInput, Select } from '../fields';\n\n/** Reusable groups of controls, shared by the built-in inspectors. */\n\nexport const css = (prop: string) => prop as KnownCssProperties;\n\nexport type StyleContext = Pick<InspectorNodeContext, 'getStyle' | 'setStyle' | 'presetColors'>;\n\nexport interface TypographyGroupProps extends StyleProps {\n ctx: StyleContext;\n alignment?: string;\n /** Shows the alignment control when set. */\n setAlignment?: (value: string) => void;\n}\n\nexport function TypographyGroup({ ctx, alignment, setAlignment, className, style }: TypographyGroupProps) {\n const t = useMessages();\n const i = t.inspector;\n return (\n <Group title={i.typography} className={className} style={style}>\n <Field label={i.font}>\n <FontInput\n value={ctx.getStyle(css('fontFamily')) as string | undefined}\n emptyLabel={i.fontDefault}\n onChange={(v) => ctx.setStyle(css('fontFamily'), v)}\n />\n </Field>\n <Field label={i.color} stacked>\n <ColorInput value={ctx.getStyle(css('color'))} presets={ctx.presetColors} onChange={(v) => ctx.setStyle(css('color'), v)} />\n </Field>\n <Field label={i.size}>\n <NumberInput value={ctx.getStyle(css('fontSize'))} onChange={(v) => ctx.setStyle(css('fontSize'), v)} min={8} max={96} />\n </Field>\n <Field label={i.weight}>\n <Select\n value={String(ctx.getStyle(css('fontWeight')) ?? '400')}\n onChange={(v) => ctx.setStyle(css('fontWeight'), v)}\n options={[\n ['300', i.weightLight],\n ['400', i.weightNormal],\n ['600', i.weightSemibold],\n ['700', i.weightBold],\n ['800', i.weightExtrabold],\n ]}\n />\n </Field>\n <Field label={i.lineHeight}>\n <NumberInput value={ctx.getStyle(css('lineHeight'))} unit=\"%\" onChange={(v) => ctx.setStyle(css('lineHeight'), v)} min={80} max={300} step={5} />\n </Field>\n {setAlignment && (\n <Field label={i.alignment}>\n <AlignInput value={alignment ?? 'left'} onChange={setAlignment} />\n </Field>\n )}\n </Group>\n );\n}\n\nexport interface SpacingGroupProps extends StyleProps {\n ctx: InspectorNodeContext;\n title?: string;\n}\n\nexport function SpacingGroup({ ctx, title, className, style }: SpacingGroupProps) {\n const t = useMessages();\n return (\n <Group title={title ?? t.inspector.spacing} className={className} style={style}>\n <Field label={t.inspector.padding} stacked>\n <PaddingInput\n get={(side) => ctx.getStyle(css(`padding${side}`)) ?? ctx.getStyle(css('padding'))}\n set={(changes) =>\n ctx.batchSetStyle([\n // Drop any shorthand so the four longhands are the single source of truth.\n { prop: css('padding'), value: '' },\n ...changes.map(([side, value]) => ({ prop: css(`padding${side}`), value })),\n ])\n }\n />\n </Field>\n </Group>\n );\n}\n\nexport interface BoxGroupProps extends StyleProps {\n ctx: InspectorNodeContext;\n}\n\nexport function BoxGroup({ ctx, className, style }: BoxGroupProps) {\n const t = useMessages();\n const i = t.inspector;\n return (\n <Group title={i.box} className={className} style={style}>\n <Field label={i.backgroundColor} stacked>\n <ColorInput value={ctx.getStyle(css('backgroundColor'))} presets={ctx.presetColors} onChange={(v) => ctx.setStyle(css('backgroundColor'), v)} />\n </Field>\n <Field label={i.radius}>\n <NumberInput value={ctx.getStyle(css('borderRadius'))} onChange={(v) => ctx.setStyle(css('borderRadius'), v)} />\n </Field>\n <Field label={i.border}>\n <NumberInput\n value={ctx.getStyle(css('borderWidth'))}\n onChange={(v) =>\n ctx.batchSetStyle([\n { prop: css('borderWidth'), value: v },\n { prop: css('borderStyle'), value: v ? 'solid' : '' },\n ])\n }\n />\n </Field>\n <Field label={i.borderColor} stacked>\n <ColorInput value={ctx.getStyle(css('borderColor'))} presets={ctx.presetColors} onChange={(v) => ctx.setStyle(css('borderColor'), v)} />\n </Field>\n </Group>\n );\n}\n","import { useMessages } from '../../context';\nimport { cx } from '../../core/cx';\nimport type { InspectorProps } from '../../registry/types';\nimport { AlignInput, ColorInput, Field, Group, NumberInput, TextInput } from '../fields';\nimport { css, SpacingGroup } from './groups';\n\nexport function ButtonInspector({ ctx, className, style }: InspectorProps) {\n const t = useMessages();\n const i = t.inspector;\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={i.action}>\n <Field label={i.linkUrl} stacked>\n <TextInput value={String(ctx.getAttr('href') ?? '')} onChange={(v) => ctx.setAttr('href', v)} placeholder=\"https://\" />\n </Field>\n </Group>\n <Group title={i.button}>\n <Field label={i.alignment}>\n <AlignInput value={String(ctx.getAttr('alignment') ?? 'left')} onChange={(v) => ctx.setAttr('alignment', v)} />\n </Field>\n <Field label={i.backgroundColor} stacked>\n <ColorInput value={ctx.getStyle(css('backgroundColor'))} presets={ctx.presetColors} onChange={(v) => ctx.setStyle(css('backgroundColor'), v)} />\n </Field>\n <Field label={i.textColor} stacked>\n <ColorInput value={ctx.getStyle(css('color'))} presets={ctx.presetColors} onChange={(v) => ctx.setStyle(css('color'), v)} />\n </Field>\n <Field label={i.textSize}>\n <NumberInput value={ctx.getStyle(css('fontSize'))} onChange={(v) => ctx.setStyle(css('fontSize'), v)} min={8} max={48} />\n </Field>\n <Field label={i.radius}>\n <NumberInput value={ctx.getStyle(css('borderRadius'))} onChange={(v) => ctx.setStyle(css('borderRadius'), v)} />\n </Field>\n </Group>\n <SpacingGroup ctx={ctx} title={i.buttonPadding} />\n </div>\n );\n}\n","import { NodeSelection } from '@tiptap/pm/state';\nimport { useEmailEditor } from '../../context';\nimport { cx } from '../../core/cx';\nimport type { InspectorProps } from '../../registry/types';\nimport { Field, Group, NumberInput } from '../fields';\n\n/** Rows of 2, 3 or 4 columns: width presets and gap. */\nexport function ColumnsInspector({ ctx, className, style }: InspectorProps) {\n const { editor, t } = useEmailEditor();\n const i = t.inspector;\n const count = ({ twoColumns: 2, threeColumns: 3, fourColumns: 4 } as Record<string, number>)[ctx.nodeType] ?? 2;\n const presets: Array<[string, number[]]> =\n count === 2\n ? [\n ['50 / 50', [50, 50]],\n ['33 / 67', [33, 67]],\n ['67 / 33', [67, 33]],\n ['25 / 75', [25, 75]],\n ]\n : count === 3\n ? [\n [i.equal, [33.33, 33.33, 33.34]],\n ['25 / 50 / 25', [25, 50, 25]],\n ]\n : [[i.equal, [25, 25, 25, 25]]];\n\n const applyWidths = (widths: number[]) => {\n const { state } = editor;\n const row = state.doc.nodeAt(ctx.nodePos.pos);\n if (!row) return;\n const tr = state.tr;\n row.forEach((col, offset, index) => {\n const pos = ctx.nodePos.pos + 1 + offset;\n const rest = String(col.attrs.style ?? '')\n .split(';')\n .filter((d) => d.trim() && !d.trim().startsWith('width'))\n .join(';');\n tr.setNodeMarkup(pos, undefined, { ...col.attrs, style: `${rest ? `${rest};` : ''}width:${widths[index]}%` });\n });\n if (state.selection instanceof NodeSelection) tr.setSelection(NodeSelection.create(tr.doc, ctx.nodePos.pos));\n editor.view.dispatch(tr);\n };\n\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={i.columns}>\n <Field label={i.distribution} stacked>\n <div className=\"bree-ratio-grid\">\n {presets.map(([label, widths]) => (\n <button key={label} type=\"button\" className=\"bree-ratio\" onClick={() => applyWidths(widths)}>\n <span className=\"bree-ratio-bars\">\n {widths.map((w, index) => (\n <i key={index} style={{ flex: w }} />\n ))}\n </span>\n {label}\n </button>\n ))}\n </div>\n </Field>\n <Field label={i.columnGap}>\n <NumberInput value={ctx.getAttr('cellspacing') ?? 0} onChange={(v) => ctx.setAttr('cellspacing', v === '' ? null : v)} />\n </Field>\n <p className=\"bree-hint\">{i.columnsHint}</p>\n </Group>\n </div>\n );\n}\n","import { useMessages } from '../../context';\nimport { cx } from '../../core/cx';\nimport type { InspectorProps } from '../../registry/types';\nimport { Field, Group, Segmented } from '../fields';\nimport { BoxGroup, SpacingGroup, TypographyGroup } from './groups';\n\nexport function HeadingInspector({ ctx, className, style }: InspectorProps) {\n const t = useMessages();\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={t.inspector.heading}>\n <Field label={t.inspector.level}>\n <Segmented\n value={String(ctx.getAttr('level') ?? 1)}\n onChange={(v) => ctx.setAttr('level', Number(v))}\n options={[\n { value: '1', label: 'H1' },\n { value: '2', label: 'H2' },\n { value: '3', label: 'H3' },\n ]}\n />\n </Field>\n </Group>\n <TypographyGroup ctx={ctx} alignment={String(ctx.getAttr('alignment') ?? 'left')} setAlignment={(v) => ctx.setAttr('alignment', v)} />\n <SpacingGroup ctx={ctx} />\n <BoxGroup ctx={ctx} />\n </div>\n );\n}\n","import { useEmailEditor } from '../../context';\nimport { cx } from '../../core/cx';\nimport type { InspectorProps } from '../../registry/types';\nimport { AlignInput, Field, Group, NumberInput, RangeInput, TextInput } from '../fields';\nimport { css, SpacingGroup } from './groups';\n\nexport function ImageInspector({ ctx, className, style }: InspectorProps) {\n const { t, uploadImage } = useEmailEditor();\n const i = t.inspector;\n const width = String(ctx.getAttr('width') ?? 'auto');\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={i.image}>\n <div className=\"bree-image-preview\">{ctx.getAttr('src') ? <img src={String(ctx.getAttr('src'))} alt=\"\" /> : null}</div>\n <label className=\"bree-button-like\">\n {i.uploadImage}\n <input\n type=\"file\"\n accept=\"image/*\"\n hidden\n onChange={async (e) => {\n const file = e.target.files?.[0];\n if (file) ctx.setAttr('src', (await uploadImage(file)).url);\n e.target.value = '';\n }}\n />\n </label>\n <Field label={i.imageUrl} stacked>\n <TextInput value={String(ctx.getAttr('src') ?? '')} onChange={(v) => ctx.setAttr('src', v)} />\n </Field>\n <Field label={i.altText} stacked>\n <TextInput value={String(ctx.getAttr('alt') ?? '')} onChange={(v) => ctx.setAttr('alt', v)} placeholder={i.altPlaceholder} />\n </Field>\n </Group>\n <Group title={i.layout}>\n <Field label={i.autoWidth}>\n <input type=\"checkbox\" checked={width === 'auto'} onChange={(e) => ctx.setAttr('width', e.target.checked ? 'auto' : '300')} />\n </Field>\n {width !== 'auto' && (\n <Field label={i.width}>\n <RangeInput value={width} min={20} max={900} onChange={(v) => ctx.setAttr('width', String(v))} />\n </Field>\n )}\n <Field label={i.alignment}>\n <AlignInput value={String(ctx.getAttr('alignment') ?? 'center')} onChange={(v) => ctx.setAttr('alignment', v)} />\n </Field>\n <Field label={i.radius}>\n <NumberInput value={ctx.getStyle(css('borderRadius'))} onChange={(v) => ctx.setStyle(css('borderRadius'), v)} />\n </Field>\n </Group>\n <Group title={i.action}>\n <Field label={i.clickLink} stacked>\n <TextInput value={String(ctx.getAttr('href') ?? '')} onChange={(v) => ctx.setAttr('href', v || null)} placeholder=\"https://\" />\n </Field>\n </Group>\n <SpacingGroup ctx={ctx} />\n </div>\n );\n}\n","import { useMessages } from '../../context';\nimport { cx } from '../../core/cx';\nimport type { InspectorProps } from '../../registry/types';\nimport { ColorInput, Field, Group, NumberInput, RangeInput, Segmented, TextArea } from '../fields';\nimport { BoxGroup, css, SpacingGroup } from './groups';\n\nexport function SpacerInspector({ ctx, className, style }: InspectorProps) {\n const t = useMessages();\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={t.inspector.spacer}>\n <Field label={t.inspector.height}>\n <RangeInput value={ctx.getAttr('height')} min={4} max={160} onChange={(v) => ctx.setAttr('height', v)} />\n </Field>\n </Group>\n </div>\n );\n}\n\nexport function HtmlInspector({ ctx, className, style }: InspectorProps) {\n const t = useMessages();\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={t.inspector.htmlCode}>\n <TextArea value={String(ctx.getAttr('html') ?? '')} onChange={(v) => ctx.setAttr('html', v)} rows={14} />\n <p className=\"bree-hint\">{t.inspector.htmlHint}</p>\n </Group>\n </div>\n );\n}\n\nexport function DividerInspector({ ctx, className, style }: InspectorProps) {\n const t = useMessages();\n const i = t.inspector;\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={i.line}>\n <Field label={i.color} stacked>\n <ColorInput value={ctx.getStyle(css('borderTopColor'))} presets={ctx.presetColors} onChange={(v) => ctx.setStyle(css('borderTopColor'), v)} />\n </Field>\n <Field label={i.thickness}>\n <NumberInput\n value={ctx.getStyle(css('borderTopWidth')) ?? 1}\n onChange={(v) =>\n ctx.batchSetStyle([\n { prop: css('borderTopWidth'), value: v },\n { prop: css('borderTopStyle'), value: 'solid' },\n ])\n }\n min={1}\n max={12}\n />\n </Field>\n <Field label={i.lineStyle}>\n <Segmented\n value={String(ctx.getStyle(css('borderTopStyle')) ?? 'solid')}\n onChange={(v) => ctx.setStyle(css('borderTopStyle'), v)}\n options={[\n { value: 'solid', label: '———' },\n { value: 'dashed', label: '- - -' },\n { value: 'dotted', label: '· · ·' },\n ]}\n />\n </Field>\n </Group>\n </div>\n );\n}\n\n/** Sections and columns: background, border and padding. */\nexport function ContainerInspector({ ctx, className, style }: InspectorProps) {\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <BoxGroup ctx={ctx} />\n <SpacingGroup ctx={ctx} />\n </div>\n );\n}\n","import type { CSSProperties } from 'react';\n\n/** \"padding-top: 4px; color: red\" -> { paddingTop: '4px', color: 'red' } */\nexport function inlineStyleToObject(style: unknown): CSSProperties {\n if (typeof style !== 'string' || !style.trim()) return {};\n const result: Record<string, string> = {};\n for (const declaration of style.split(';')) {\n const index = declaration.indexOf(':');\n if (index === -1) continue;\n const prop = declaration.slice(0, index).trim();\n const value = declaration.slice(index + 1).trim();\n if (!prop || !value) continue;\n result[prop.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] =\n value;\n }\n return result as CSSProperties;\n}\n","import { mergeAttributes } from '@tiptap/core';\nimport { EmailNode } from '@react-email/editor/core';\nimport { Column, Img, Link, Row, Section } from 'react-email';\nimport { inlineStyleToObject } from '../core/style-utils';\n\n/**\n * Custom email blocks built on the public `EmailNode` API: each node defines\n * how it renders in the editor (renderHTML / node view) AND how it renders in\n * the final email (renderToReactEmail). That second half is what makes the\n * export work with zero extra glue.\n */\n\nconst styleAttribute = {\n style: {\n default: null as string | null,\n parseHTML: (el: HTMLElement) => el.getAttribute('style'),\n renderHTML: (attrs: Record<string, unknown>) =>\n attrs.style ? { style: attrs.style } : {},\n },\n};\n\n// ---------------------------------------------------------------------------\n// Spacer\n// ---------------------------------------------------------------------------\n\nexport const Spacer = EmailNode.create({\n name: 'spacer',\n group: 'block',\n atom: true,\n selectable: true,\n\n addAttributes() {\n return {\n ...styleAttribute,\n height: {\n default: 32,\n parseHTML: (el: HTMLElement) => Number(el.dataset.height) || 32,\n renderHTML: (attrs: Record<string, unknown>) => ({\n 'data-height': attrs.height,\n }),\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"spacer\"]' }];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'spacer',\n class: 'node-spacer',\n style: `height:${Number(node.attrs.height)}px`,\n }),\n ];\n },\n\n renderToReactEmail({ node }) {\n const height = Number(node.attrs?.height ?? 32);\n return (\n <Section\n style={{\n height,\n lineHeight: `${height}px`,\n fontSize: '1px',\n ...inlineStyleToObject(node.attrs?.style),\n }}\n >\n {' '}\n </Section>\n );\n },\n});\n\n// ---------------------------------------------------------------------------\n// Social links\n// ---------------------------------------------------------------------------\n\nexport interface SocialLink {\n network: string;\n url: string;\n}\n\n/**\n * Icons come from the Simple Icons CDN. For maximum client support (Gmail\n * does not render SVG) host PNG versions and swap `iconUrl`.\n */\nexport const SOCIAL_NETWORKS: Record<\n string,\n { label: string; slug: string; color: string }\n> = {\n facebook: { label: 'Facebook', slug: 'facebook', color: '1877F2' },\n instagram: { label: 'Instagram', slug: 'instagram', color: 'E4405F' },\n x: { label: 'X', slug: 'x', color: '000000' },\n linkedin: { label: 'LinkedIn', slug: 'linkedin', color: '0A66C2' },\n youtube: { label: 'YouTube', slug: 'youtube', color: 'FF0000' },\n tiktok: { label: 'TikTok', slug: 'tiktok', color: '000000' },\n github: { label: 'GitHub', slug: 'github', color: '181717' },\n};\n\n// LinkedIn was removed from recent Simple Icons releases; pin an older one.\nconst ICON_OVERRIDES: Record<string, string> = {\n linkedin: 'https://cdn.jsdelivr.net/npm/simple-icons@9.21.0/icons/linkedin.svg',\n};\n\nexport function iconUrl(network: string) {\n if (ICON_OVERRIDES[network]) return ICON_OVERRIDES[network];\n const meta = SOCIAL_NETWORKS[network] ?? SOCIAL_NETWORKS.facebook;\n return `https://cdn.simpleicons.org/${meta.slug}/${meta.color}`;\n}\n\nfunction parseLinks(value: unknown): SocialLink[] {\n if (Array.isArray(value)) return value as SocialLink[];\n if (typeof value === 'string') {\n try {\n return JSON.parse(value) as SocialLink[];\n } catch {\n return [];\n }\n }\n return [];\n}\n\nexport const SocialLinks = EmailNode.create({\n name: 'socialLinks',\n group: 'block',\n atom: true,\n selectable: true,\n\n addAttributes() {\n return {\n ...styleAttribute,\n links: {\n default: [\n { network: 'facebook', url: 'https://facebook.com/' },\n { network: 'instagram', url: 'https://instagram.com/' },\n { network: 'x', url: 'https://x.com/' },\n { network: 'linkedin', url: 'https://linkedin.com/' },\n ] as SocialLink[],\n parseHTML: (el: HTMLElement) => parseLinks(el.dataset.links),\n renderHTML: (attrs: Record<string, unknown>) => ({\n 'data-links': JSON.stringify(attrs.links ?? []),\n }),\n },\n size: { default: 28 },\n gap: { default: 12 },\n alignment: { default: 'center' },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"social-links\"]' }];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n const size = Number(node.attrs.size);\n const gap = Number(node.attrs.gap);\n const links = parseLinks(node.attrs.links);\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'social-links',\n class: 'node-socialLinks',\n alignment: node.attrs.alignment,\n }),\n ...links.map((link, i) => [\n 'span',\n {\n class: 'node-socialLinks-item',\n style: `margin-left:${i === 0 ? 0 : gap}px`,\n },\n [\n 'img',\n {\n src: iconUrl(link.network),\n width: String(size),\n height: String(size),\n alt: SOCIAL_NETWORKS[link.network]?.label ?? link.network,\n },\n ],\n ]),\n ];\n },\n\n renderToReactEmail({ node }) {\n const size = Number(node.attrs?.size ?? 28);\n const gap = Number(node.attrs?.gap ?? 12);\n const links = parseLinks(node.attrs?.links);\n const align = (node.attrs?.alignment ?? 'center') as\n | 'left'\n | 'center'\n | 'right';\n return (\n <Section style={inlineStyleToObject(node.attrs?.style)}>\n <Row>\n <Column align={align}>\n {links.map((link, i) => (\n <Link\n key={`${link.network}-${i}`}\n href={link.url}\n style={{\n display: 'inline-block',\n marginLeft: i === 0 ? 0 : gap,\n }}\n >\n <Img\n src={iconUrl(link.network)}\n width={size}\n height={size}\n alt={SOCIAL_NETWORKS[link.network]?.label ?? link.network}\n />\n </Link>\n ))}\n </Column>\n </Row>\n </Section>\n );\n },\n});\n\n// ---------------------------------------------------------------------------\n// Raw HTML\n// ---------------------------------------------------------------------------\n\nexport const HtmlBlock = EmailNode.create({\n name: 'htmlBlock',\n group: 'block',\n atom: true,\n selectable: true,\n\n addAttributes() {\n return {\n html: {\n default:\n '<p style=\"margin:0;text-align:center;font-family:sans-serif\">Your custom <strong>HTML</strong></p>',\n parseHTML: (el: HTMLElement) => el.dataset.html ?? el.innerHTML,\n renderHTML: () => ({}),\n },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"html-block\"]' }];\n },\n\n renderHTML({ node, HTMLAttributes }) {\n return [\n 'div',\n mergeAttributes(HTMLAttributes, {\n 'data-type': 'html-block',\n class: 'node-htmlBlock',\n 'data-html': node.attrs.html,\n }),\n ];\n },\n\n addNodeView() {\n return ({ node }) => {\n const dom = document.createElement('div');\n dom.className = 'node-htmlBlock';\n dom.dataset.type = 'html-block';\n dom.innerHTML = node.attrs.html;\n return {\n dom,\n update(updated) {\n if (updated.type !== node.type) return false;\n dom.innerHTML = updated.attrs.html;\n return true;\n },\n ignoreMutation: () => true,\n };\n };\n },\n\n renderToReactEmail({ node }) {\n return <div dangerouslySetInnerHTML={{ __html: node.attrs?.html ?? '' }} />;\n },\n});\n\nexport const customNodes = [Spacer, SocialLinks, HtmlBlock];\n","import { XIcon } from '@react-email/editor/ui';\nimport { useMessages } from '../../context';\nimport { cx } from '../../core/cx';\nimport { SOCIAL_NETWORKS, type SocialLink } from '../../nodes/custom-nodes';\nimport type { InspectorProps } from '../../registry/types';\nimport { AlignInput, Field, Group, RangeInput, Select, TextInput } from '../fields';\nimport { SpacingGroup } from './groups';\n\nexport function SocialLinksInspector({ ctx, className, style }: InspectorProps) {\n const t = useMessages();\n const i = t.inspector;\n const raw = ctx.getAttr('links');\n const links: SocialLink[] = Array.isArray(raw) ? (raw as SocialLink[]) : [];\n const save = (next: SocialLink[]) => ctx.setAttr('links', next);\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <Group title={i.networks}>\n <div className=\"bree-social-list\">\n {links.map((link, index) => (\n <div key={index} className=\"bree-social-row\">\n <Select\n value={link.network}\n onChange={(network) => save(links.map((l, j) => (j === index ? { ...l, network } : l)))}\n options={Object.entries(SOCIAL_NETWORKS).map(([id, meta]) => [id, meta.label])}\n />\n <TextInput value={link.url} onChange={(url) => save(links.map((l, j) => (j === index ? { ...l, url } : l)))} />\n <button type=\"button\" className=\"bree-icon-button\" title={i.removeNetwork} onClick={() => save(links.filter((_, j) => j !== index))}>\n <XIcon size={14} />\n </button>\n </div>\n ))}\n </div>\n <button type=\"button\" className=\"bree-button-like\" onClick={() => save([...links, { network: 'youtube', url: 'https://youtube.com/' }])}>\n {i.addNetwork}\n </button>\n </Group>\n <Group title={i.appearance}>\n <Field label={i.iconSize}>\n <RangeInput value={ctx.getAttr('size')} min={16} max={64} onChange={(v) => ctx.setAttr('size', v)} />\n </Field>\n <Field label={i.gap}>\n <RangeInput value={ctx.getAttr('gap')} min={0} max={40} onChange={(v) => ctx.setAttr('gap', v)} />\n </Field>\n <Field label={i.alignment}>\n <AlignInput value={String(ctx.getAttr('alignment') ?? 'center')} onChange={(v) => ctx.setAttr('alignment', v)} />\n </Field>\n </Group>\n <SpacingGroup ctx={ctx} />\n </div>\n );\n}\n","import {\n CodeIcon,\n Columns2Icon,\n Columns3Icon,\n Columns4Icon,\n Heading1Icon,\n ImageIcon,\n LayoutIcon,\n LinkIcon,\n ListIcon,\n ListOrderedIcon,\n MinusIcon,\n MousePointerClickIcon,\n PanelLeftIcon,\n SquareCodeIcon,\n TableIcon,\n TextQuoteIcon,\n TypeIcon,\n} from '@react-email/editor/ui';\nimport type { Node as PMNode } from '@tiptap/pm/model';\nimport { SpacerIcon } from '../components/icons';\nimport { ButtonInspector } from '../components/inspectors/ButtonInspector';\nimport { ColumnsInspector } from '../components/inspectors/ColumnsInspector';\nimport { HeadingInspector } from '../components/inspectors/HeadingInspector';\nimport { ImageInspector } from '../components/inspectors/ImageInspector';\nimport { ContainerInspector, DividerInspector, HtmlInspector, SpacerInspector } from '../components/inspectors/SimpleInspectors';\nimport { SocialLinksInspector } from '../components/inspectors/SocialLinksInspector';\nimport { HtmlBlock, SocialLinks, Spacer } from '../nodes/custom-nodes';\nimport type { I18n } from '../i18n';\nimport type { NodeDefinition } from './types';\n\nexport function truncate(text: string, max = 36) {\n const clean = text.replace(/\\s+/g, ' ').trim();\n return clean.length > max ? `${clean.slice(0, max)}…` : clean;\n}\n\n/** Text content, or \"empty\". The default preview of text-like nodes. */\nexport const textPreview = (node: PMNode, { t }: I18n) => truncate(node.textContent) || t.layers.empty;\n\nconst noPreview = () => '';\n\nconst imagePreview = (node: PMNode, { t }: I18n) => {\n const { attrs } = node;\n if (attrs.alt) return truncate(attrs.alt);\n const src = String(attrs.src ?? '');\n if (src.startsWith('data:')) return t.layers.uploadedImage;\n try {\n const url = new URL(src);\n // Placeholder services carry the label in ?text=\n return truncate(url.searchParams.get('text') ?? decodeURIComponent(url.pathname.split('/').pop() ?? ''));\n } catch {\n return '';\n }\n};\n\nexport const defaultNodes: NodeDefinition[] = [\n { type: 'paragraph', icon: TypeIcon },\n { type: 'heading', icon: Heading1Icon, inspector: HeadingInspector },\n { type: 'image', icon: ImageIcon, inspector: ImageInspector, preview: imagePreview },\n { type: 'button', icon: MousePointerClickIcon, inspector: ButtonInspector },\n { type: 'horizontalRule', icon: MinusIcon, inspector: DividerInspector, preview: noPreview },\n {\n type: 'spacer',\n icon: SpacerIcon,\n inspector: SpacerInspector,\n preview: (node) => `${node.attrs.height}px`,\n extensions: [Spacer],\n },\n {\n type: 'socialLinks',\n icon: LinkIcon,\n inspector: SocialLinksInspector,\n preview: (node) => (Array.isArray(node.attrs.links) ? node.attrs.links.map((l: { network: string }) => l.network).join(', ') : ''),\n extensions: [SocialLinks],\n },\n {\n type: 'htmlBlock',\n icon: SquareCodeIcon,\n inspector: HtmlInspector,\n preview: (node) => truncate(String(node.attrs.html ?? '').replace(/<[^>]+>/g, ' ')),\n extensions: [HtmlBlock],\n },\n { type: 'section', icon: LayoutIcon, inspector: ContainerInspector, preview: noPreview },\n { type: 'columnsColumn', icon: PanelLeftIcon, inspector: ContainerInspector, preview: noPreview },\n { type: 'twoColumns', icon: Columns2Icon, inspector: ColumnsInspector, preview: noPreview },\n { type: 'threeColumns', icon: Columns3Icon, inspector: ColumnsInspector, preview: noPreview },\n { type: 'fourColumns', icon: Columns4Icon, inspector: ColumnsInspector, preview: noPreview },\n { type: 'bulletList', icon: ListIcon },\n { type: 'orderedList', icon: ListOrderedIcon },\n { type: 'blockquote', icon: TextQuoteIcon },\n { type: 'codeBlock', icon: CodeIcon },\n { type: 'table', icon: TableIcon },\n];\n","import type { JSONContent } from '@tiptap/core';\n\n/**\n * Small helpers to build email JSON (the editor's document format).\n * Handy to write palette items, templates or starter documents.\n */\n\ntype Attrs = Record<string, unknown>;\n\nexport const text = (value: string, marks?: JSONContent['marks']): JSONContent => ({\n type: 'text',\n text: value,\n ...(marks ? { marks } : {}),\n});\n\nexport const paragraph = (value: string | JSONContent[] = '', attrs: Attrs = {}): JSONContent => ({\n type: 'paragraph',\n attrs,\n content: typeof value === 'string' ? (value ? [text(value)] : []) : value,\n});\n\nexport const heading = (level: 1 | 2 | 3, value: string, attrs: Attrs = {}): JSONContent => ({\n type: 'heading',\n attrs: { level, ...attrs },\n content: [text(value)],\n});\n\nexport const button = (label: string, attrs: Attrs = {}): JSONContent => ({\n type: 'button',\n attrs: { href: 'https://example.com', alignment: 'center', ...attrs },\n content: [text(label)],\n});\n\nexport const image = (src: string, attrs: Attrs = {}): JSONContent => ({\n type: 'image',\n attrs: { src, alt: '', alignment: 'center', ...attrs },\n});\n\nexport const column = (...content: JSONContent[]): JSONContent => ({\n type: 'columnsColumn',\n content: content.length ? content : [paragraph()],\n});\n\n/** Sets a column's width, in percent of its row. */\nexport const sized = (col: JSONContent, width: number): JSONContent => ({\n ...col,\n attrs: { ...col.attrs, style: `width:${width}%` },\n});\n\nexport const columns = (count: 2 | 3 | 4, cols?: JSONContent[], attrs?: Attrs): JSONContent => ({\n type: ({ 2: 'twoColumns', 3: 'threeColumns', 4: 'fourColumns' } as const)[count],\n ...(attrs ? { attrs } : {}),\n content: cols ?? Array.from({ length: count }, () => column()),\n});\n\nexport const section = (style: string, ...content: JSONContent[]): JSONContent => ({\n type: 'section',\n attrs: { style },\n content,\n});\n\n/** Longhand paddings keep the inspector's per-side controls accurate. */\nexport const padding = (y: number, x = y) =>\n `padding-top:${y}px;padding-right:${x}px;padding-bottom:${y}px;padding-left:${x}px`;\n\nexport const link = (href: string) => [{ type: 'link', attrs: { href } }];\n\nexport const placeholderImage = (w: number, h: number, label = 'Image') =>\n `https://placehold.co/${w}x${h}/e2e8f0/64748b/png?text=${encodeURIComponent(label)}`;\n\n/** Wraps blocks into a full document. */\nexport const doc = (...content: JSONContent[]): JSONContent => ({ type: 'doc', content });\n","import {\n Columns2Icon,\n Columns3Icon,\n Columns4Icon,\n Heading1Icon,\n ImageIcon,\n LayoutIcon,\n ListIcon,\n MinusIcon,\n MousePointerClickIcon,\n PanelTopIcon,\n SquareCodeIcon,\n TextQuoteIcon,\n TypeIcon,\n} from '@react-email/editor/ui';\nimport type { JSONContent } from '@tiptap/core';\nimport { OneColumnIcon, SocialIcon, SpacerTileIcon } from '../components/icons';\nimport { button, columns, heading, image, link, padding, paragraph, placeholderImage, section, text } from '../core/content';\nimport type { I18n } from '../i18n';\nimport type { PaletteGroup, PaletteItem } from './types';\n\n/** A text menu (Home · Shop · Blog · Contact), shared by the palette and the header template. */\nexport const menuParagraph = ({ t }: I18n, alignment = 'center'): JSONContent =>\n paragraph(\n [\n text(t.content.menuHome, link('https://example.com')),\n text(' · '),\n text(t.content.menuShop, link('https://example.com/shop')),\n text(' · '),\n text(t.content.menuBlog, link('https://example.com/blog')),\n text(' · '),\n text(t.content.menuContact, link('https://example.com/contact')),\n ],\n { alignment },\n );\n\nexport const defaultPaletteGroups: PaletteGroup[] = [\n { id: 'layout', title: ({ t }) => t.sidebar.layoutTitle },\n { id: 'content', title: ({ t }) => t.sidebar.contentTitle },\n];\n\nexport const defaultPalette: PaletteItem[] = [\n // Layout\n {\n id: 'section',\n group: 'layout',\n label: ({ t }) => t.palette.oneColumn,\n icon: <OneColumnIcon />,\n content: () => [section(padding(16), paragraph())],\n },\n { id: 'columns-2', group: 'layout', label: ({ t }) => t.palette.twoColumns, icon: <Columns2Icon size={22} />, content: () => [columns(2)] },\n { id: 'columns-3', group: 'layout', label: ({ t }) => t.palette.threeColumns, icon: <Columns3Icon size={22} />, content: () => [columns(3)] },\n { id: 'columns-4', group: 'layout', label: ({ t }) => t.palette.fourColumns, icon: <Columns4Icon size={22} />, content: () => [columns(4)] },\n // Content\n { id: 'heading', group: 'content', label: ({ t }) => t.palette.heading, icon: <Heading1Icon size={22} />, content: ({ t }) => [heading(2, t.content.heading)] },\n { id: 'text', group: 'content', label: ({ t }) => t.palette.text, icon: <TypeIcon size={22} />, content: ({ t }) => [paragraph(t.content.text)] },\n { id: 'button', group: 'content', label: ({ t }) => t.palette.button, icon: <MousePointerClickIcon size={22} />, content: ({ t }) => [button(t.content.button)] },\n {\n id: 'image',\n group: 'content',\n label: ({ t }) => t.palette.image,\n icon: <ImageIcon size={22} />,\n content: ({ t }) => [image(placeholderImage(600, 300, t.content.image))],\n },\n { id: 'divider', group: 'content', label: ({ t }) => t.palette.divider, icon: <MinusIcon size={22} />, content: () => [{ type: 'horizontalRule' }] },\n {\n id: 'spacer',\n group: 'content',\n label: ({ t }) => t.palette.spacer,\n icon: <SpacerTileIcon />,\n content: () => [{ type: 'spacer', attrs: { height: 32 } }],\n },\n { id: 'social', group: 'content', label: ({ t }) => t.palette.social, icon: <SocialIcon />, content: () => [{ type: 'socialLinks' }] },\n { id: 'menu', group: 'content', label: ({ t }) => t.palette.menu, icon: <PanelTopIcon size={22} />, content: (i18n) => [menuParagraph(i18n)] },\n {\n id: 'list',\n group: 'content',\n label: ({ t }) => t.palette.list,\n icon: <ListIcon size={22} />,\n content: ({ t }) => [\n {\n type: 'bulletList',\n content: t.content.listItems.map((item) => ({ type: 'listItem', content: [paragraph(item)] })),\n },\n ],\n },\n {\n id: 'quote',\n group: 'content',\n label: ({ t }) => t.palette.quote,\n icon: <TextQuoteIcon size={22} />,\n content: ({ t }) => [{ type: 'blockquote', content: [paragraph(t.content.quote)] }],\n },\n {\n id: 'html',\n group: 'content',\n label: ({ t }) => t.palette.html,\n icon: <SquareCodeIcon size={22} />,\n content: ({ t }) => [{ type: 'htmlBlock', attrs: { html: t.content.html } }],\n },\n {\n id: 'card',\n group: 'content',\n label: ({ t }) => t.palette.card,\n icon: <LayoutIcon size={22} />,\n content: ({ t }) => [\n section(`${padding(24)};background-color:#f1f5f9;border-radius:12px`, heading(3, t.content.cardTitle), paragraph(t.content.cardText)),\n ],\n },\n];\n","import type { JSONContent } from '@tiptap/core';\nimport { button, column, columns, heading, image, link, padding, paragraph, placeholderImage, section, sized, text } from '../core/content';\nimport type { I18n } from '../i18n';\nimport { menuParagraph } from './default-palette';\nimport type { TemplateItem } from './types';\n\n/** Abstract wireframe used as the card preview of the built-in templates. */\nexport function TemplateThumbnail({ variant }: { variant: string }) {\n return (\n <span className={`bree-block-thumb bree-thumb-${variant}`} aria-hidden>\n <i />\n <i />\n <i />\n </span>\n );\n}\n\nexport const defaultTemplates: TemplateItem[] = [\n {\n id: 'header',\n label: ({ t }) => t.templates.header,\n description: ({ t }) => t.templates.headerDescription,\n thumbnail: <TemplateThumbnail variant=\"header\" />,\n content: (i18n) => [\n columns(2, [\n sized(column(image(placeholderImage(140, 40, i18n.t.content.logo), { alignment: 'left', width: '140' })), 33),\n sized(column(menuParagraph(i18n, 'right')), 67),\n ]),\n ],\n },\n {\n id: 'hero',\n label: ({ t }) => t.templates.hero,\n description: ({ t }) => t.templates.heroDescription,\n thumbnail: <TemplateThumbnail variant=\"hero\" />,\n content: ({ t }) => [\n section(\n `${padding(40, 24)};background-color:#eef2ff;border-radius:12px`,\n heading(1, t.content.heroTitle, { alignment: 'center' }),\n paragraph(t.content.heroText, { alignment: 'center' }),\n button(t.content.heroButton, { style: `background-color:#4f46e5;color:#ffffff;${padding(12, 24)};border-radius:8px` }),\n ),\n ],\n },\n {\n id: 'products',\n label: ({ t }) => t.templates.products,\n description: ({ t }) => t.templates.productsDescription,\n thumbnail: <TemplateThumbnail variant=\"products\" />,\n content: ({ t }) => [\n columns(\n 2,\n [t.content.productA, t.content.productB].map((name) =>\n column(\n image(placeholderImage(280, 200, name)),\n heading(3, name, { alignment: 'center' }),\n paragraph(t.content.productText, { alignment: 'center' }),\n button(t.content.productButton),\n ),\n ),\n { cellspacing: 16 },\n ),\n ],\n },\n {\n id: 'features',\n label: ({ t }) => t.templates.features,\n description: ({ t }) => t.templates.featuresDescription,\n thumbnail: <TemplateThumbnail variant=\"features\" />,\n content: ({ t }) => [\n columns(\n 3,\n t.content.features.map((title) =>\n column(heading(3, title, { alignment: 'center' }), paragraph(t.content.featureText, { alignment: 'center' })),\n ),\n ),\n ],\n },\n {\n id: 'testimonial',\n label: ({ t }) => t.templates.testimonial,\n description: ({ t }) => t.templates.testimonialDescription,\n thumbnail: <TemplateThumbnail variant=\"testimonial\" />,\n content: ({ t }) => [\n section(\n `${padding(24)};background-color:#f8fafc;border-radius:12px`,\n { type: 'blockquote', content: [paragraph(t.content.testimonialQuote)] },\n paragraph(t.content.testimonialAuthor, { alignment: 'right', style: 'color:#64748b' }),\n ),\n ],\n },\n {\n id: 'footer',\n label: ({ t }) => t.templates.footer,\n description: ({ t }) => t.templates.footerDescription,\n thumbnail: <TemplateThumbnail variant=\"footer\" />,\n content: ({ t }) => [\n { type: 'horizontalRule' },\n { type: 'socialLinks' },\n paragraph(t.content.footerAddress, { alignment: 'center', style: 'color:#94a3b8;font-size:12px' }),\n paragraph([text(t.content.unsubscribe, link('https://example.com/unsubscribe'))], {\n alignment: 'center',\n style: 'font-size:12px',\n }),\n ],\n },\n];\n\nconst template = (id: string, i18n: I18n) => defaultTemplates.find((item) => item.id === id)?.content(i18n) ?? [];\n\n/** The demo email: header, hero, products and footer. */\nexport function createStarterDocument(i18n: I18n): JSONContent {\n const spacer = { type: 'spacer', attrs: { height: 16 } };\n return {\n type: 'doc',\n content: [\n ...template('header', i18n),\n spacer,\n ...template('hero', i18n),\n spacer,\n heading(2, i18n.t.content.starterTitle, { alignment: 'center' }),\n ...template('products', i18n),\n spacer,\n ...template('footer', i18n),\n ],\n };\n}\n","import type { Editor, Extensions, JSONContent } from '@tiptap/core';\nimport { Placeholder } from '@tiptap/extension-placeholder';\nimport { EditorContext, useEditor } from '@tiptap/react';\nimport { composeReactEmail } from '@react-email/editor/core';\nimport { StarterKit } from '@react-email/editor/extensions';\nimport { EmailTheming, extendTheme, useEditorImage, type EditorThemeInput } from '@react-email/editor/plugins';\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from 'react';\nimport { cx, type StyleProps } from './core/cx';\nimport { appendBlocks } from './core/dnd';\nimport { EmailButton } from './core/paste';\nimport { createPasteHandler } from './core/paste-handler';\nimport { SelectAllFix } from './core/select-all';\nimport { defaultFonts, type FontOption } from './core/fonts';\nimport { createDragSession, createHoverStore, type DragSession, type HoverStore } from './core/stores';\nimport { en, resolveLabel, resolveMessages, type I18n, type Messages, type PartialMessages } from './i18n';\nimport { defaultNodes } from './registry/default-nodes';\nimport { defaultPalette, defaultPaletteGroups } from './registry/default-palette';\nimport { createStarterDocument, defaultTemplates } from './registry/default-templates';\nimport type { NodeDefinition, PaletteGroup, PaletteItem, TemplateItem } from './registry/types';\n\nexport interface EmailSettings {\n /** Subject line. Not part of the rendered HTML: send it with your email provider. */\n subject?: string;\n /** Inbox preview line (shown after the subject). */\n previewText: string;\n}\n\n/** What the editor saves and loads: the document plus email-level settings. */\nexport interface EmailValue {\n doc: JSONContent;\n settings: EmailSettings;\n}\n\nexport type Device = 'desktop' | 'mobile';\n\nexport interface EmailExport {\n html: string;\n text: string;\n unformattedHtml: string;\n}\n\n/** Imperative API exposed through `ref` (and given to `onReady`). */\nexport interface EmailEditorHandle {\n /** The underlying Tiptap editor. */\n editor: Editor | null;\n getValue: () => EmailValue;\n setValue: (value: EmailValue | JSONContent) => void;\n getJSON: () => JSONContent;\n /** Renders the email (HTML, plain text and unformatted HTML). */\n exportEmail: () => Promise<EmailExport>;\n getHtml: () => Promise<string>;\n getText: () => Promise<string>;\n /** Appends blocks at the end of the email. */\n insertBlocks: (content: JSONContent[]) => void;\n}\n\nexport interface EmailEditorContextValue extends I18n {\n editor: Editor;\n handle: EmailEditorHandle;\n /** Node definitions, by type. */\n nodes: ReadonlyMap<string, NodeDefinition>;\n nodeLabel: (type: string) => string;\n palette: PaletteItem[];\n paletteGroups: PaletteGroup[];\n templates: TemplateItem[];\n /** Fonts offered by the font pickers. */\n fonts: FontOption[];\n starterDocument: (i18n: I18n) => JSONContent;\n uploadImage: (file: File) => Promise<{ url: string }>;\n dragSession: DragSession;\n hoverStore: HoverStore;\n device: Device;\n setDevice: (device: Device) => void;\n layersOpen: boolean;\n setLayersOpen: (open: boolean) => void;\n settings: EmailSettings;\n updateSettings: (patch: Partial<EmailSettings>) => void;\n}\n\nconst EmailEditorContext = createContext<EmailEditorContextValue | null>(null);\n\n/** Everything the editor components share: editor, i18n, registries, UI state. */\nexport function useEmailEditor(): EmailEditorContextValue {\n const value = useContext(EmailEditorContext);\n if (!value) throw new Error('useEmailEditor must be used inside <EditorRoot> or <BetterEmailEditor>.');\n return value;\n}\n\n/** Like `useEmailEditor`, but returns null outside an editor. */\nexport function useOptionalEmailEditor(): EmailEditorContextValue | null {\n return useContext(EmailEditorContext);\n}\n\n/** UI strings, falling back to English outside an editor (lets form fields work standalone). */\nexport function useMessages(): Messages {\n return useContext(EmailEditorContext)?.t ?? en;\n}\n\n/** Current locale and messages. */\nexport function useI18n(): I18n {\n const { locale, t } = useEmailEditor();\n return useMemo(() => ({ locale, t }), [locale, t]);\n}\n\nexport interface EditorRootProps extends StyleProps {\n /** Initial content, read on mount. Use the ref's `setValue` to replace it later. */\n defaultValue?: EmailValue | JSONContent;\n /** Called on every document or settings change. */\n onChange?: (value: EmailValue) => void;\n /** Called once the editor is created. */\n onReady?: (handle: EmailEditorHandle) => void;\n /** \"en\" (default) or \"fr\". Any other value falls back to English unless `messages` covers it. */\n locale?: string;\n /** Overrides some or all UI strings. */\n messages?: PartialMessages;\n /** Node definitions (labels, icons, properties panels, custom extensions). Read on mount for extensions. */\n nodes?: NodeDefinition[];\n /** Tiles of the \"Content\" tab. */\n palette?: PaletteItem[];\n paletteGroups?: PaletteGroup[];\n /** Prebuilt rows of the \"Blocks\" tab. */\n templates?: TemplateItem[];\n /** Fonts offered by the font pickers (Body tab and typography). Default: fonts installed with the main browsers. */\n fonts?: FontOption[];\n /** Content loaded by the top bar's \"Template\" button. */\n starterDocument?: (i18n: I18n) => JSONContent;\n /** Extra Tiptap extensions, read on mount. */\n extensions?: Extensions;\n /** Email theme used for new documents, read on mount. */\n theme?: EditorThemeInput;\n /** Stores an uploaded or pasted image and returns its public URL. Defaults to an inline data URL. */\n uploadImage?: (file: File) => Promise<{ url: string }>;\n editable?: boolean;\n /** Canvas width, controlled. */\n device?: Device;\n defaultDevice?: Device;\n onDeviceChange?: (device: Device) => void;\n /** Layers panel visibility, controlled. */\n layersOpen?: boolean;\n defaultLayersOpen?: boolean;\n onLayersOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n}\n\nexport const defaultTheme: EditorThemeInput = extendTheme('basic', {\n body: { backgroundColor: '#eef1f5', padding: '32px 16px' },\n container: { backgroundColor: '#ffffff', padding: '24px', borderRadius: '12px' },\n});\n\n/** Inlines the file as a data URL. Replace with your own storage (S3, Cloudinary…). */\nexport const readFileAsDataUrl = (file: File) =>\n new Promise<{ url: string }>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve({ url: String(reader.result) });\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n\nconst EMPTY_DOC: JSONContent = { type: 'doc', content: [{ type: 'paragraph' }] };\n\nfunction isEmailValue(value: unknown): value is EmailValue {\n return typeof value === 'object' && value !== null && 'doc' in value;\n}\n\nfunction normalize(value: EmailValue | JSONContent | undefined): EmailValue {\n const empty: EmailSettings = { subject: '', previewText: '' };\n if (!value) return { doc: EMPTY_DOC, settings: empty };\n if (isEmailValue(value)) return { doc: value.doc, settings: { ...empty, ...value.settings, previewText: value.settings?.previewText ?? '' } };\n return { doc: value, settings: empty };\n}\n\nfunction useControllable<T>(value: T | undefined, defaultValue: T, onChange?: (value: T) => void) {\n const [inner, setInner] = useState(defaultValue);\n const current = value !== undefined ? value : inner;\n const set = useCallback(\n (next: T) => {\n if (value === undefined) setInner(next);\n onChange?.(next);\n },\n [value, onChange],\n );\n return [current, set] as const;\n}\n\n/**\n * Creates the editor and provides it to every component inside: `Canvas`,\n * `TopBar`, `LayersPanel`, `Sidebar`… Lay them out however you like.\n */\nexport const EditorRoot = forwardRef<EmailEditorHandle, EditorRootProps>(function EditorRoot(\n {\n defaultValue,\n onChange,\n onReady,\n locale = 'en',\n messages,\n nodes = defaultNodes,\n palette = defaultPalette,\n paletteGroups = defaultPaletteGroups,\n templates = defaultTemplates,\n fonts = defaultFonts,\n starterDocument = createStarterDocument,\n extensions: extraExtensions,\n theme = defaultTheme,\n uploadImage = readFileAsDataUrl,\n editable = true,\n device: deviceProp,\n defaultDevice = 'desktop',\n onDeviceChange,\n layersOpen: layersOpenProp,\n defaultLayersOpen = true,\n onLayersOpenChange,\n className,\n style,\n children,\n },\n ref,\n) {\n const t = useMemo<Messages>(() => resolveMessages(locale, messages), [locale, messages]);\n\n const [initial] = useState(() => normalize(defaultValue));\n const [settings, setSettings] = useState<EmailSettings>(initial.settings);\n // Settings only change through updateSettings / setValue, which keep this ref in sync.\n const settingsRef = useRef(settings);\n\n // Latest props, read by long-lived callbacks (editor events, placeholder, uploads).\n const tRef = useRef(t);\n const onChangeRef = useRef(onChange);\n const onReadyRef = useRef(onReady);\n const uploadRef = useRef(uploadImage);\n useLayoutEffect(() => {\n tRef.current = t;\n onChangeRef.current = onChange;\n onReadyRef.current = onReady;\n uploadRef.current = uploadImage;\n });\n\n const [device, setDevice] = useControllable(deviceProp, defaultDevice, onDeviceChange);\n const [layersOpen, setLayersOpen] = useControllable(layersOpenProp, defaultLayersOpen, onLayersOpenChange);\n const [stores] = useState(() => ({ dragSession: createDragSession(), hoverStore: createHoverStore() }));\n\n const upload = useCallback((file: File) => uploadRef.current(file), []);\n const imageExtension = useEditorImage({ uploadImage: upload });\n\n // Built once: Tiptap re-creates the editor (and loses history) when extensions change.\n const [extensions] = useState<Extensions>(() => [\n // Button is swapped for a copy/paste-safe version (see core/paste.ts).\n StarterKit.configure({ TiptapStarterKit: { dropcursor: false }, Button: false }),\n EmailButton,\n SelectAllFix,\n Placeholder.configure({\n placeholder: ({ node }) => (node.type.name === 'heading' ? tRef.current.placeholder.heading : tRef.current.placeholder.paragraph),\n includeChildren: true,\n }),\n EmailTheming.configure({ theme }),\n ...nodes.flatMap((node) => node.extensions ?? []),\n ...(extraExtensions ?? []),\n imageExtension,\n ]);\n\n const editor = useEditor(\n {\n extensions,\n content: initial.doc,\n editable,\n immediatelyRender: false,\n editorProps: { handlePaste: createPasteHandler(extensions) },\n },\n [],\n );\n\n useEffect(() => {\n editor?.setEditable(editable);\n }, [editor, editable]);\n\n const getValue = useCallback(\n (): EmailValue => ({ doc: editor?.getJSON() ?? EMPTY_DOC, settings: settingsRef.current }),\n [editor],\n );\n\n const updateSettings = useCallback(\n (patch: Partial<EmailSettings>) => {\n const next = { ...settingsRef.current, ...patch };\n settingsRef.current = next;\n setSettings(next);\n if (editor) onChangeRef.current?.({ doc: editor.getJSON(), settings: next });\n },\n [editor],\n );\n\n const handle = useMemo<EmailEditorHandle>(() => {\n const exportEmail = async (): Promise<EmailExport> => {\n if (!editor) return { html: '', text: '', unformattedHtml: '' };\n return composeReactEmail({ editor, preview: settingsRef.current.previewText || undefined });\n };\n return {\n editor,\n getValue,\n getJSON: () => editor?.getJSON() ?? EMPTY_DOC,\n setValue: (value) => {\n const next = normalize(value);\n settingsRef.current = next.settings;\n setSettings(next.settings);\n editor?.commands.setContent(next.doc, { emitUpdate: true });\n },\n exportEmail,\n getHtml: async () => (await exportEmail()).html,\n getText: async () => (await exportEmail()).text,\n insertBlocks: (content) => {\n if (editor) appendBlocks(editor, content);\n },\n };\n }, [editor, getValue]);\n\n useImperativeHandle(ref, () => handle, [handle]);\n\n useEffect(() => {\n if (!editor) return;\n onReadyRef.current?.(handle);\n const onUpdate = () => onChangeRef.current?.(getValue());\n editor.on('update', onUpdate);\n return () => {\n editor.off('update', onUpdate);\n };\n }, [editor, handle, getValue]);\n\n const nodeMap = useMemo(() => new Map(nodes.map((node) => [node.type, node])), [nodes]);\n\n const value = useMemo<EmailEditorContextValue | null>(() => {\n if (!editor) return null;\n const i18n = { locale, t };\n return {\n ...i18n,\n editor,\n handle,\n nodes: nodeMap,\n nodeLabel: (type) => {\n const label = nodeMap.get(type)?.label;\n return label ? resolveLabel(label, i18n) : (t.nodes[type] ?? type);\n },\n palette,\n paletteGroups,\n templates,\n fonts,\n starterDocument,\n uploadImage: upload,\n ...stores,\n device,\n setDevice,\n layersOpen,\n setLayersOpen,\n settings,\n updateSettings,\n };\n }, [editor, locale, t, handle, nodeMap, palette, paletteGroups, templates, fonts, starterDocument, upload, stores, device, setDevice, layersOpen, setLayersOpen, settings, updateSettings]);\n\n const tiptapContext = useMemo(() => ({ editor }), [editor]);\n\n // The empty-zone hint is drawn by CSS (::after), so its text travels as a custom property.\n const rootStyle = { '--bree-empty-zone-label': JSON.stringify(t.canvas.emptyZone), ...style } as CSSProperties;\n\n return (\n <div className={cx('bree bree-root', className)} style={rootStyle} lang={locale}>\n {value && (\n <EditorContext.Provider value={tiptapContext}>\n <EmailEditorContext.Provider value={value}>{children}</EmailEditorContext.Provider>\n </EditorContext.Provider>\n )}\n </div>\n );\n});\n","import { useEditorState } from '@tiptap/react';\r\nimport type { Editor } from '@tiptap/core';\r\nimport { NodeSelection } from '@tiptap/pm/state';\r\nimport { EditorFocusScope, PlusIcon } from '@react-email/editor/ui';\r\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore, type DragEvent as ReactDragEvent } from 'react';\r\nimport { useEmailEditor } from '../context';\r\nimport { cx } from '../core/cx';\r\nimport type { Messages } from '../i18n';\r\nimport {\r\n applyDrop,\r\n BLOCK_CONTAINERS,\r\n COLUMN_PARENTS,\r\n type BlockUnit,\r\n deleteUnit,\r\n DND_MIME,\r\n type DropTarget,\r\n duplicateUnit,\r\n findDropTarget,\r\n isFixedUnit,\r\n parentUnit,\r\n payloadFragment,\r\n selectedUnit,\r\n selectUnit,\r\n unitAt,\r\n} from '../core/dnd';\r\nimport { handleCanvasPaste } from '../core/paste';\r\nimport { CopyIcon, GripIcon, ParentIcon, TrashIcon } from './icons';\r\n\r\ninterface Box {\r\n top: number;\r\n left: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\nfunction toLocal(host: HTMLElement, rect: { top: number; left: number; width: number; height?: number }): Box {\r\n const hostRect = host.getBoundingClientRect();\r\n return {\r\n top: rect.top - hostRect.top + host.scrollTop,\r\n left: rect.left - hostRect.left + host.scrollLeft,\r\n width: rect.width,\r\n height: rect.height ?? 0,\r\n };\r\n}\r\n\r\nfunction unitBox(editor: Editor, host: HTMLElement, unit: BlockUnit | null): Box | null {\r\n if (!unit) return null;\r\n const dom = editor.view.nodeDOM(unit.pos);\r\n if (!(dom instanceof HTMLElement)) return null;\r\n return toLocal(host, dom.getBoundingClientRect());\r\n}\r\n\r\n/** The block under the pointer: what the hover frame shows and what a click selects. */\r\nfunction unitAtPoint(editor: Editor, x: number, y: number): BlockUnit | null {\r\n const coords = editor.view.posAtCoords({ left: x, top: y });\r\n return coords && coords.inside >= 0 ? unitAt(editor.state.doc, coords.inside) : null;\r\n}\r\n\r\n/** Layout blocks: clicking their padding/gaps selects them rather than placing a caret. */\r\nfunction isStructuralUnit(unit: BlockUnit) {\r\n const type = unit.node.type.name;\r\n return BLOCK_CONTAINERS.has(type) || COLUMN_PARENTS.has(type);\r\n}\r\n\r\n/**\r\n * Everything drawn on top of the canvas: hover outline, selection frame with\r\n * its toolbar, and the drop indicator. Also owns the drag & drop listeners for\r\n * the canvas so ProseMirror never sees our custom drags. Rendered by `Canvas`.\r\n */\r\nexport function CanvasOverlay({ editor, host }: { editor: Editor; host: HTMLElement }) {\r\n const { dragSession, hoverStore, nodeLabel, t } = useEmailEditor();\r\n // Read from listeners attached once per editor/host.\r\n const labelRef = useRef(nodeLabel);\r\n useLayoutEffect(() => {\r\n labelRef.current = nodeLabel;\r\n });\r\n // Hover lives in a shared store so the layers panel can drive it too.\r\n const hoverPos = useSyncExternalStore(hoverStore.subscribe, hoverStore.get);\r\n const hoverNode = hoverPos !== null ? editor.state.doc.nodeAt(hoverPos) : null;\r\n const hover: BlockUnit | null = hoverPos !== null && hoverNode ? { pos: hoverPos, node: hoverNode } : null;\r\n const [drop, setDrop] = useState<DropTarget | null>(null);\r\n const [dragging, setDragging] = useState<number | null>(null);\r\n const [, setLayoutTick] = useState(0);\r\n const relayout = useCallback(() => setLayoutTick((tick) => tick + 1), []);\r\n\r\n // Selection (re-rendered on every selection / focus change).\r\n const selection = useEditorState({\r\n editor,\r\n selector: ({ editor: ed }) => {\r\n if (!ed?.isFocused) return null;\r\n const unit = selectedUnit(ed);\r\n return unit ? `${unit.pos}:${unit.node.type.name}:${ed.state.doc.content.size}` : null;\r\n },\r\n });\r\n const selected = selection ? selectedUnit(editor) : null;\r\n\r\n // Keep frames glued to content when layout changes (typing, images loading, resizing).\r\n useEffect(() => {\r\n const onUpdate = () => relayout();\r\n // Positions shift on edits: drop a possibly stale hover.\r\n const onDocChange = () => {\r\n hoverStore.set(null);\r\n relayout();\r\n };\r\n editor.on('update', onDocChange);\r\n const observer = new ResizeObserver(onUpdate);\r\n observer.observe(editor.view.dom);\r\n host.addEventListener('load', onUpdate, true);\r\n window.addEventListener('resize', onUpdate);\r\n return () => {\r\n editor.off('update', onDocChange);\r\n observer.disconnect();\r\n host.removeEventListener('load', onUpdate, true);\r\n window.removeEventListener('resize', onUpdate);\r\n };\r\n }, [editor, host, relayout, hoverStore]);\r\n\r\n // Hover tracking.\r\n useEffect(() => {\r\n let frame = 0;\r\n const onMove = (event: MouseEvent) => {\r\n if (dragSession.get()) return;\r\n if ((event.target as HTMLElement).closest('.bree-ov-toolbar, .bree-ov-handle, .bree-ov-tag')) return;\r\n cancelAnimationFrame(frame);\r\n frame = requestAnimationFrame(() => {\r\n hoverStore.set(unitAtPoint(editor, event.clientX, event.clientY)?.pos ?? null);\r\n });\r\n };\r\n const onLeave = () => hoverStore.set(null);\r\n host.addEventListener('mousemove', onMove);\r\n host.addEventListener('mouseleave', onLeave);\r\n return () => {\r\n cancelAnimationFrame(frame);\r\n host.removeEventListener('mousemove', onMove);\r\n host.removeEventListener('mouseleave', onLeave);\r\n };\r\n }, [editor, host, dragSession, hoverStore]);\r\n\r\n // Clicks follow what the hover frame shows:\r\n // - empty canvas around the email -> deselect (back to the palette);\r\n // - a structural area (column gap, section/column padding) -> select that\r\n // row/section/column instead of letting ProseMirror drop the caret into\r\n // the nearest text.\r\n // Capture phase, so it runs before ProseMirror's own mousedown handler.\r\n useEffect(() => {\r\n const onDown = (event: MouseEvent) => {\r\n if (event.button !== 0 || event.shiftKey || event.metaKey || event.ctrlKey) return;\r\n if ((event.target as HTMLElement).closest('.bree-ov-layer, .bree-canvas-header')) return;\r\n const background = [host, editor.view.dom, editor.view.dom.parentElement];\r\n if (background.includes(event.target as HTMLElement)) {\r\n event.preventDefault();\r\n const active = document.activeElement;\r\n if (active instanceof HTMLElement) active.blur();\r\n editor.commands.blur();\r\n return;\r\n }\r\n const unit = unitAtPoint(editor, event.clientX, event.clientY);\r\n if (unit && isStructuralUnit(unit)) {\r\n event.preventDefault();\r\n selectUnit(editor, unit);\r\n return;\r\n }\r\n // A block can stay node-selected after the editor lost focus (deselect,\r\n // or a document starting with an image). Clicking it again changes\r\n // nothing for ProseMirror, so it never writes the selection back to the\r\n // DOM and Chrome's own caret wins: it lands in the next text, e.g. the\r\n // hidden empty paragraph after a lone image. Focusing first puts the node\r\n // selection in the DOM, and Chrome keeps a selection clicked from inside.\r\n if (!editor.isFocused && editor.state.selection instanceof NodeSelection) editor.view.focus();\r\n };\r\n const onPaste = (event: ClipboardEvent) => {\r\n if (editor.view.dom.contains(event.target as Node)) handleCanvasPaste(editor, event);\r\n };\r\n host.addEventListener('mousedown', onDown, true);\r\n host.addEventListener('paste', onPaste, true);\r\n return () => {\r\n host.removeEventListener('mousedown', onDown, true);\r\n host.removeEventListener('paste', onPaste, true);\r\n };\r\n }, [editor, host]);\r\n\r\n // Drag & drop: capture-phase listeners so ProseMirror's own handlers stay out of it.\r\n useEffect(() => {\r\n let frame = 0;\r\n let lastFragmentKey: unknown = null;\r\n let fragment: ReturnType<typeof payloadFragment> = null;\r\n\r\n const compute = (event: DragEvent) => {\r\n const payload = dragSession.get();\r\n if (!payload) return null;\r\n if (lastFragmentKey !== payload) {\r\n lastFragmentKey = payload;\r\n fragment = payloadFragment(editor.view, payload);\r\n }\r\n if (!fragment) return null;\r\n const exclude =\r\n payload.kind === 'move'\r\n ? { from: payload.pos, to: payload.pos + (editor.state.doc.nodeAt(payload.pos)?.nodeSize ?? 0) }\r\n : undefined;\r\n return findDropTarget(editor.view, event.clientX, event.clientY, fragment, exclude);\r\n };\r\n\r\n const onDragOver = (event: DragEvent) => {\r\n const payload = dragSession.get();\r\n if (!payload) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (event.dataTransfer) event.dataTransfer.dropEffect = payload.kind === 'move' ? 'move' : 'copy';\r\n cancelAnimationFrame(frame);\r\n frame = requestAnimationFrame(() => setDrop(compute(event)));\r\n };\r\n const onDrop = (event: DragEvent) => {\r\n const payload = dragSession.get();\r\n if (!payload) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n cancelAnimationFrame(frame);\r\n const target = compute(event);\r\n if (target) applyDrop(editor, payload, target);\r\n // ProseMirror may have started a native node drag (images); its dragend\r\n // never fires once the source node moved, so clear it here.\r\n editor.view.dragging = null;\r\n dragSession.end();\r\n setDrop(null);\r\n setDragging(null);\r\n hoverStore.set(null);\r\n };\r\n const onDragLeave = (event: DragEvent) => {\r\n if (!dragSession.get()) return;\r\n if (!host.contains(event.relatedTarget as Node | null)) {\r\n cancelAnimationFrame(frame);\r\n setDrop(null);\r\n }\r\n };\r\n const onDragEnd = () => {\r\n cancelAnimationFrame(frame);\r\n dragSession.end();\r\n setDrop(null);\r\n setDragging(null);\r\n hoverStore.set(null);\r\n };\r\n // Images are draggable ProseMirror nodes: route their native drag through\r\n // our session so they get the same drop indicator as the handle.\r\n const onDragStart = (event: DragEvent) => {\r\n const target = event.target as HTMLElement;\r\n if (dragSession.get() || target.tagName !== 'IMG' || !editor.view.dom.contains(target)) return;\r\n const pos = editor.view.posAtDOM(target, 0);\r\n const unit = unitAt(editor.state.doc, pos);\r\n if (!unit || isFixedUnit(unit)) return;\r\n dragSession.start({ kind: 'move', pos: unit.pos, label: labelRef.current(unit.node.type.name) });\r\n requestAnimationFrame(() => setDragging(unit.pos));\r\n };\r\n const onKeyDown = (event: KeyboardEvent) => {\r\n if (event.key !== 'Escape' || !editor.isFocused) return;\r\n const current = selectedUnit(editor);\r\n const parent = current ? parentUnit(editor.state.doc, current) : null;\r\n event.preventDefault();\r\n if (parent) {\r\n selectUnit(editor, parent);\r\n } else {\r\n const active = document.activeElement;\r\n if (active instanceof HTMLElement) active.blur();\r\n editor.commands.blur();\r\n }\r\n };\r\n // Text drags stay native: only payloads registered in dragSession are handled here.\r\n host.addEventListener('dragstart', onDragStart, true);\r\n host.addEventListener('keydown', onKeyDown, true);\r\n host.addEventListener('dragover', onDragOver, true);\r\n host.addEventListener('drop', onDrop, true);\r\n host.addEventListener('dragleave', onDragLeave, true);\r\n document.addEventListener('dragend', onDragEnd);\r\n return () => {\r\n cancelAnimationFrame(frame);\r\n host.removeEventListener('dragstart', onDragStart, true);\r\n host.removeEventListener('keydown', onKeyDown, true);\r\n host.removeEventListener('dragover', onDragOver, true);\r\n host.removeEventListener('drop', onDrop, true);\r\n host.removeEventListener('dragleave', onDragLeave, true);\r\n document.removeEventListener('dragend', onDragEnd);\r\n };\r\n }, [editor, host, dragSession, hoverStore]);\r\n\r\n const startMove = (event: ReactDragEvent, unit: BlockUnit) => {\r\n const dom = editor.view.nodeDOM(unit.pos);\r\n dragSession.start({ kind: 'move', pos: unit.pos, label: nodeLabel(unit.node.type.name) });\r\n event.dataTransfer.setData(DND_MIME, 'move');\r\n event.dataTransfer.effectAllowed = 'move';\r\n if (dom instanceof HTMLElement) {\r\n const rect = dom.getBoundingClientRect();\r\n event.dataTransfer.setDragImage(dom, Math.min(24, rect.width / 2), Math.min(24, rect.height / 2));\r\n }\r\n // Never unmount the drag source during dragstart (Chromium cancels the\r\n // drag); restyle it on the next frame instead.\r\n requestAnimationFrame(() => setDragging(unit.pos));\r\n };\r\n\r\n const isDragging = dragging !== null;\r\n const hoverBox = hover && hover.pos !== selected?.pos ? unitBox(editor, host, hover) : null;\r\n const selectedBox = unitBox(editor, host, selected);\r\n const sourceBox = isDragging ? unitBox(editor, host, unitAt(editor.state.doc, dragging)) : null;\r\n const parent = selected ? parentUnit(editor.state.doc, selected) : null;\r\n\r\n return (\r\n <div className=\"bree-ov-layer\">\r\n {hoverBox && hover && (\r\n <div className={cx('bree-ov-frame bree-ov-hover', isDragging && 'bree-ov-ghost')} style={hoverBox}>\r\n <button\r\n type=\"button\"\r\n className=\"bree-ov-tag\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n selectUnit(editor, hover);\r\n }}\r\n >\r\n {nodeLabel(hover.node.type.name)}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {selectedBox && selected && (\r\n <div className={cx('bree-ov-frame bree-ov-selected', isDragging && 'bree-ov-ghost')} style={selectedBox}>\r\n <span className=\"bree-ov-tag bree-ov-tag-selected\">{nodeLabel(selected.node.type.name)}</span>\r\n {!isFixedUnit(selected) && (\r\n // Focusable and registered as a focus scope: pressing it keeps the\r\n // editor \"focused\" (so the selection, and this handle, survive), and\r\n // no preventDefault on mousedown, which would cancel the native drag.\r\n <EditorFocusScope>\r\n <span\r\n className=\"bree-ov-handle\"\r\n role=\"button\"\r\n tabIndex={-1}\r\n draggable\r\n title={t.canvas.move}\r\n aria-label={t.canvas.moveLabel(nodeLabel(selected.node.type.name))}\r\n onDragStart={(e) => startMove(e, selected)}\r\n >\r\n <GripIcon />\r\n </span>\r\n </EditorFocusScope>\r\n )}\r\n <EditorFocusScope>\r\n <div className=\"bree-ov-toolbar\" onMouseDown={(e) => e.preventDefault()}>\r\n {parent && (\r\n <button type=\"button\" className=\"bree-ov-tool\" title={t.canvas.selectParent(nodeLabel(parent.node.type.name))} onClick={() => selectUnit(editor, parent)}>\r\n <ParentIcon />\r\n </button>\r\n )}\r\n {!isFixedUnit(selected) && (\r\n <>\r\n <button type=\"button\" className=\"bree-ov-tool\" title={t.canvas.duplicate} onClick={() => duplicateUnit(editor, selected)}>\r\n <CopyIcon />\r\n </button>\r\n <button type=\"button\" className=\"bree-ov-tool bree-ov-danger\" title={t.canvas.delete} onClick={() => deleteUnit(editor, selected)}>\r\n <TrashIcon />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n </EditorFocusScope>\r\n </div>\r\n )}\r\n\r\n {sourceBox && <div className=\"bree-ov-frame bree-ov-source\" style={sourceBox} />}\r\n\r\n {drop && <DropIndicator host={host} target={drop} label={dragSession.get()?.label ?? ''} messages={t} />}\r\n </div>\r\n );\r\n}\r\n\r\nfunction DropIndicator({ host, target, label, messages }: { host: HTMLElement; target: DropTarget; label: string; messages: Messages }) {\r\n if (target.emptyZone) {\r\n const zone = toLocal(host, target.emptyZone);\r\n return (\r\n <div className=\"bree-ov-dropzone\" style={zone}>\r\n <span>\r\n <PlusIcon size={14} /> {messages.canvas.dropLabel(label)}\r\n </span>\r\n </div>\r\n );\r\n }\r\n if (!target.line) return null;\r\n const line = toLocal(host, { ...target.line, height: 0 });\r\n return (\r\n <div className=\"bree-ov-dropline\" style={{ top: line.top, left: line.left, width: line.width }}>\r\n <span className=\"bree-ov-dropline-label\">{messages.canvas.dropHere}</span>\r\n </div>\r\n );\r\n}\r\n","import { useId } from 'react';\nimport { useEmailEditor } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\n\nexport type EmailHeaderProps = StyleProps;\n\n/** Card with the subject line and the preview text, as an inbox shows them. */\nexport function EmailHeader({ className, style }: EmailHeaderProps) {\n const { settings, updateSettings, t } = useEmailEditor();\n const h = t.emailHeader;\n const id = useId();\n return (\n <div className={cx('bree-email-header', className)} style={style}>\n <div className=\"bree-email-header-row\">\n <label htmlFor={`${id}-subject`}>{h.subject}</label>\n <input\n id={`${id}-subject`}\n className=\"bree-email-header-subject\"\n value={settings.subject ?? ''}\n placeholder={h.subjectPlaceholder}\n onChange={(e) => updateSettings({ subject: e.target.value })}\n />\n </div>\n <div className=\"bree-email-header-row\">\n <label htmlFor={`${id}-preview`}>{h.previewText}</label>\n <input\n id={`${id}-preview`}\n value={settings.previewText}\n placeholder={h.previewTextPlaceholder}\n onChange={(e) => updateSettings({ previewText: e.target.value })}\n />\n </div>\n </div>\n );\n}\n","import type { Editor } from '@tiptap/core';\nimport { EditorContent } from '@tiptap/react';\nimport { BubbleMenu, defaultSlashCommands, SlashCommand, type SlashCommandItem } from '@react-email/editor/ui';\nimport { useEffect, useMemo, useState, type CSSProperties, type ReactNode } from 'react';\nimport { useEmailEditor } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { CanvasOverlay } from './CanvasOverlay';\nimport { EmailHeader } from './EmailHeader';\n\nexport interface CanvasProps extends StyleProps {\n /** Hover / selection frames, block toolbar and drag & drop. Default: true. */\n overlay?: boolean;\n /** The package's floating text menu (bold, link…). Default: true. */\n bubbleMenu?: boolean;\n /** \"/\" command menu. `true` (default), `false`, or your own items. */\n slashCommands?: boolean | SlashCommandItem[];\n /** Subject and preview text fields above the email. Default: false. */\n header?: boolean;\n /** Extra content rendered inside the canvas scroll area. */\n children?: ReactNode;\n}\n\ninterface HeaderBox {\n top: number;\n left: number;\n width: number;\n radius: string;\n}\n\n/**\n * Places the header card on top of the email container, so both read as one\n * card. The container makes room for it with a top margin\n * (`--bree-email-header-height`); everything is measured from the DOM, so it\n * follows any theme width, padding or radius and the device toggle.\n */\nfunction useHeaderBox(editor: Editor, host: HTMLElement | null, header: HTMLElement | null): HeaderBox | null {\n const [box, setBox] = useState<HeaderBox | null>(null);\n useEffect(() => {\n if (!host || !header) return;\n let raf = 0;\n let observed: Element | null = null;\n const read = () => {\n host.style.setProperty('--bree-email-header-height', `${header.offsetHeight}px`);\n const container = editor.view.dom.querySelector(':scope > .node-container');\n if (container !== observed) {\n if (observed) resize.unobserve(observed);\n if (container) resize.observe(container);\n observed = container;\n }\n if (!(container instanceof HTMLElement)) {\n setBox(null);\n return;\n }\n const hostRect = host.getBoundingClientRect();\n const rect = container.getBoundingClientRect();\n const next = {\n top: rect.top - hostRect.top + host.scrollTop - header.offsetHeight,\n left: rect.left - hostRect.left + host.scrollLeft,\n width: rect.width,\n // Top corners are squared off in the canvas (see styles.css): the bottom ones keep the theme's radius.\n radius: getComputedStyle(container).borderBottomLeftRadius,\n };\n setBox((prev) =>\n prev && prev.top === next.top && prev.left === next.left && prev.width === next.width && prev.radius === next.radius ? prev : next,\n );\n };\n // Theme styles land after the transaction: read on the next frame.\n const schedule = () => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(read);\n };\n const resize = new ResizeObserver(schedule);\n resize.observe(host);\n resize.observe(header);\n read();\n editor.on('update', schedule);\n return () => {\n cancelAnimationFrame(raf);\n resize.disconnect();\n editor.off('update', schedule);\n host.style.removeProperty('--bree-email-header-height');\n };\n }, [editor, host, header]);\n return header ? box : null;\n}\n\n/** The editable email. Scrolls on its own: give it a height through its parent or `style`. */\nexport function Canvas({ overlay = true, bubbleMenu = true, slashCommands = true, header = false, className, style, children }: CanvasProps) {\n const { editor, device, t } = useEmailEditor();\n const [host, setHost] = useState<HTMLDivElement | null>(null);\n const [headerEl, setHeaderEl] = useState<HTMLDivElement | null>(null);\n const box = useHeaderBox(editor, host, header ? headerEl : null);\n\n const slashItems = useMemo(() => {\n if (Array.isArray(slashCommands)) return slashCommands;\n return defaultSlashCommands.map((item) => ({ ...item, ...t.slashCommands[item.title] }));\n }, [slashCommands, t]);\n\n return (\n <div ref={setHost} className={cx('bree-canvas', className)} style={style} data-device={device} data-email-header={header || undefined}>\n {header && (\n <div\n ref={setHeaderEl}\n className=\"bree-canvas-header\"\n data-placed={box ? '' : undefined}\n style={box ? { position: 'absolute', top: box.top, left: box.left, width: box.width, '--bree-email-header-radius': box.radius } as CSSProperties : undefined}\n >\n <EmailHeader />\n </div>\n )}\n <EditorContent editor={editor} className=\"bree-canvas-content\" />\n {bubbleMenu && (\n <>\n <BubbleMenu hideWhenActiveNodes={['button', 'horizontalRule']} hideWhenActiveMarks={['link']} />\n <BubbleMenu.LinkDefault />\n <BubbleMenu.ButtonDefault />\n <BubbleMenu.ImageDefault />\n </>\n )}\n {slashCommands !== false && <SlashCommand items={slashItems} />}\n {overlay && host && <CanvasOverlay editor={editor} host={host} />}\n {children}\n </div>\n );\n}\n","import type { Fragment, Node as PMNode } from '@tiptap/pm/model';\nimport { BLOCK_CONTAINERS, COLUMN_PARENTS, type DropTarget, findRootContainer, isEmptyParagraph } from './dnd';\n\nexport interface LayerItem {\n /** Stable-ish key built from the child indexes (\"0.2.1\"). */\n key: string;\n pos: number;\n node: PMNode;\n depth: number;\n /** 1-based index among siblings (used to name columns). */\n index: number;\n children: LayerItem[];\n /** Accepts blocks dropped \"inside\" (section, column). */\n accepts: boolean;\n /** Can't be moved (columns are locked in their row). */\n fixed: boolean;\n /** Drop zone holding nothing but its placeholder paragraph. */\n empty: boolean;\n}\n\n/** TrailingNode filler: same rule as the serializer, which drops it on export. */\nfunction isTrailingFiller(parent: PMNode, index: number) {\n const child = parent.child(index);\n return (\n index === parent.childCount - 1 &&\n parent.childCount > 1 &&\n isEmptyParagraph(child) &&\n parent.child(index - 1).type.name !== 'paragraph'\n );\n}\n\nfunction itemsOf(parent: PMNode, parentPos: number, depth: number, path: string): LayerItem[] {\n const items: LayerItem[] = [];\n parent.forEach((child, offset, index) => {\n if (isTrailingFiller(parent, index)) return;\n const pos = parentPos + 1 + offset;\n const type = child.type.name;\n const key = `${path}${index}`;\n const accepts = BLOCK_CONTAINERS.has(type);\n const empty = accepts && child.childCount === 1 && isEmptyParagraph(child.firstChild!);\n const nested = accepts || COLUMN_PARENTS.has(type);\n items.push({\n key,\n pos,\n node: child,\n depth,\n index: index + 1,\n children: nested && !empty ? itemsOf(child, pos, depth + 1, `${key}.`) : [],\n accepts,\n fixed: type === 'columnsColumn',\n empty,\n });\n });\n return items;\n}\n\nexport function buildLayers(doc: PMNode): LayerItem[] {\n const root = findRootContainer(doc);\n return root ? itemsOf(root.node, root.pos, 0, '') : [];\n}\n\nexport type LayerZone = 'before' | 'after' | 'inside';\n\n/** Which part of a row the pointer is over, given what the row can accept. */\nexport function zoneFor(item: LayerItem, ratio: number): LayerZone {\n if (item.fixed) return 'inside';\n if (item.accepts) return ratio < 0.25 ? 'before' : ratio > 0.75 ? 'after' : 'inside';\n return ratio < 0.5 ? 'before' : 'after';\n}\n\n/** Translates a layers-panel drop into a document position, validated by the schema. */\nexport function layerDropTarget(\n doc: PMNode,\n item: LayerItem,\n zone: LayerZone,\n fragment: Fragment,\n exclude?: { from: number; to: number },\n): DropTarget | null {\n let pos: number;\n let replaceTo: number | undefined;\n\n if (zone === 'inside') {\n if (!item.accepts) return null;\n if (item.empty) {\n pos = item.pos + 1;\n replaceTo = pos + item.node.firstChild!.nodeSize;\n } else {\n pos = item.pos + item.node.nodeSize - 1;\n }\n } else {\n if (item.fixed) return null;\n pos = zone === 'before' ? item.pos : item.pos + item.node.nodeSize;\n }\n\n // A block can't be dropped into itself, and dropping next to itself is a no-op.\n if (exclude && pos >= exclude.from && pos <= exclude.to) return null;\n\n const $pos = doc.resolve(pos);\n const index = $pos.index();\n const ok = $pos.parent.canReplace(index, replaceTo !== undefined ? index + 1 : index, fragment);\n return ok ? { pos, replaceTo } : null;\n}\n","import { useEditorState } from '@tiptap/react';\r\nimport { EditorFocusScope, LayoutIcon, XIcon } from '@react-email/editor/ui';\r\nimport { useEffect, useMemo, useRef, useState, useSyncExternalStore, type DragEvent } from 'react';\r\nimport { useEmailEditor } from '../context';\r\nimport { cx, type StyleProps } from '../core/cx';\r\nimport { applyDrop, DND_MIME, payloadFragment, selectedUnit, selectUnit } from '../core/dnd';\r\nimport { buildLayers, type LayerItem, layerDropTarget, type LayerZone, zoneFor } from '../core/layers';\r\nimport { textPreview } from '../registry/default-nodes';\r\n\r\ninterface DropState {\r\n key: string;\r\n zone: LayerZone;\r\n}\r\n\r\nexport interface LayersPanelProps extends StyleProps {\r\n /** Shows a close button that calls it, e.g. `() => setLayersOpen(false)` when you also render a `LayersToggle`. */\r\n onClose?: () => void;\r\n /** Panel title. Defaults to the localized \"Layers\". */\r\n title?: string;\r\n /** Shows the \"Expand all\" / \"Collapse all\" buttons in the header. Default: true. */\r\n expandCollapseButtons?: boolean;\r\n}\r\n\r\n/** Tree of the email (Photoshop-like layers): select, hover, reorder and nest blocks by drag & drop. */\r\nexport function LayersPanel({ onClose, title, expandCollapseButtons = true, className, style }: LayersPanelProps) {\r\n const { editor, t, locale, nodes, nodeLabel, dragSession, hoverStore } = useEmailEditor();\r\n const itemLabel = (item: LayerItem) =>\r\n item.node.type.name === 'columnsColumn' ? t.layers.column(item.index) : nodeLabel(item.node.type.name);\r\n const itemPreview = (item: LayerItem) => (nodes.get(item.node.type.name)?.preview ?? textPreview)(item.node, { locale, t });\r\n const doc = useEditorState({\r\n editor,\r\n selector: ({ editor: ed }) => ed?.state.doc ?? null,\r\n // ProseMirror docs are immutable: identity is enough (and they're circular).\r\n equalityFn: (a, b) => a === b,\r\n });\r\n const selectedPos = useEditorState({\r\n editor,\r\n selector: ({ editor: ed }) => (ed?.isFocused ? (selectedUnit(ed)?.pos ?? null) : null),\r\n });\r\n const hoverPos = useSyncExternalStore(hoverStore.subscribe, hoverStore.get);\r\n const layers = useMemo(() => (doc ? buildLayers(doc) : []), [doc]);\r\n const [collapsed, setCollapsed] = useState<Set<string>>(() => new Set());\r\n const [drop, setDrop] = useState<DropState | null>(null);\r\n const listRef = useRef<HTMLDivElement>(null);\r\n\r\n // Keep the selected layer visible.\r\n useEffect(() => {\r\n if (selectedPos === null) return;\r\n listRef.current?.querySelector('[aria-selected=\"true\"]')?.scrollIntoView({ block: 'nearest' });\r\n }, [selectedPos]);\r\n\r\n const toggle = (key: string) =>\r\n setCollapsed((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(key)) next.delete(key);\r\n else next.add(key);\r\n return next;\r\n });\r\n\r\n const select = (item: LayerItem) => {\r\n selectUnit(editor, { pos: item.pos, node: item.node });\r\n const dom = editor.view.nodeDOM(item.pos);\r\n if (dom instanceof HTMLElement) dom.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\r\n };\r\n\r\n const resolveDrop = (event: DragEvent, item: LayerItem) => {\r\n const payload = dragSession.get();\r\n if (!payload) return null;\r\n const fragment = payloadFragment(editor.view, payload);\r\n if (!fragment) return null;\r\n const rect = event.currentTarget.getBoundingClientRect();\r\n const zone = zoneFor(item, (event.clientY - rect.top) / rect.height);\r\n const moving = payload.kind === 'move' ? editor.state.doc.nodeAt(payload.pos) : null;\r\n const exclude = payload.kind === 'move' && moving ? { from: payload.pos, to: payload.pos + moving.nodeSize } : undefined;\r\n const target = layerDropTarget(editor.state.doc, item, zone, fragment, exclude);\r\n return target ? { zone, target, payload } : null;\r\n };\r\n\r\n const finishDrag = () => {\r\n dragSession.end();\r\n setDrop(null);\r\n };\r\n\r\n const renderItems = (items: LayerItem[]) =>\r\n items.map((item) => {\r\n const Icon = nodes.get(item.node.type.name)?.icon ?? LayoutIcon;\r\n const hasChildren = item.children.length > 0;\r\n const isCollapsed = collapsed.has(item.key);\r\n const preview = itemPreview(item);\r\n const dropZone = drop?.key === item.key ? drop.zone : null;\r\n return (\r\n <div key={item.key} role=\"none\">\r\n <div\r\n role=\"treeitem\"\r\n tabIndex={selectedPos === item.pos || (selectedPos === null && item.key === '0') ? 0 : -1}\r\n aria-level={item.depth + 1}\r\n aria-selected={selectedPos === item.pos}\r\n aria-expanded={hasChildren ? !isCollapsed : undefined}\r\n className={cx(\r\n 'bree-layer',\r\n selectedPos === item.pos && 'bree-selected',\r\n hoverPos === item.pos && 'bree-hovered',\r\n dropZone && `bree-drop-${dropZone}`,\r\n item.fixed && 'bree-fixed',\r\n )}\r\n style={{ paddingLeft: 6 + item.depth * 16 }}\r\n draggable={!item.fixed}\r\n title={item.fixed ? t.layers.fixedHint : t.layers.itemHint}\r\n onClick={() => select(item)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n select(item);\r\n } else if ((e.key === 'ArrowLeft' && hasChildren && !isCollapsed) || (e.key === 'ArrowRight' && isCollapsed)) {\r\n toggle(item.key);\r\n } else if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n const rows = [...(listRef.current?.querySelectorAll<HTMLElement>('[role=\"treeitem\"]') ?? [])];\r\n const next = rows[rows.indexOf(e.currentTarget) + (e.key === 'ArrowDown' ? 1 : -1)];\r\n next?.focus();\r\n }\r\n }}\r\n onMouseEnter={() => hoverStore.set(item.pos)}\r\n onMouseLeave={() => hoverStore.set(null)}\r\n onDragStart={(e) => {\r\n e.stopPropagation();\r\n dragSession.start({ kind: 'move', pos: item.pos, label: itemLabel(item) });\r\n e.dataTransfer.setData(DND_MIME, 'move');\r\n e.dataTransfer.effectAllowed = 'move';\r\n }}\r\n onDragEnd={finishDrag}\r\n onDragOver={(e) => {\r\n const result = resolveDrop(e, item);\r\n if (!result) {\r\n if (drop?.key === item.key) setDrop(null);\r\n return;\r\n }\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = result.payload.kind === 'move' ? 'move' : 'copy';\r\n if (drop?.key !== item.key || drop.zone !== result.zone) setDrop({ key: item.key, zone: result.zone });\r\n }}\r\n onDrop={(e) => {\r\n const result = resolveDrop(e, item);\r\n e.preventDefault();\r\n if (result) applyDrop(editor, result.payload, result.target);\r\n finishDrag();\r\n }}\r\n >\r\n {hasChildren ? (\r\n <button\r\n type=\"button\"\r\n className={cx('bree-layer-caret', !isCollapsed && 'bree-open')}\r\n aria-label={isCollapsed ? t.layers.expand : t.layers.collapse}\r\n tabIndex={-1}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggle(item.key);\r\n }}\r\n >\r\n ›\r\n </button>\r\n ) : (\r\n <span className=\"bree-layer-caret-spacer\" />\r\n )}\r\n <span className=\"bree-layer-icon\">\r\n <Icon size={14} />\r\n </span>\r\n <span className=\"bree-layer-label\">{itemLabel(item)}</span>\r\n {preview && <span className=\"bree-layer-preview\">{preview}</span>}\r\n </div>\r\n {item.empty && (\r\n <div className=\"bree-layer-empty\" style={{ paddingLeft: 6 + (item.depth + 1) * 16 + 18 }}>\r\n {t.layers.emptyZone}\r\n </div>\r\n )}\r\n {hasChildren && !isCollapsed && <div role=\"group\">{renderItems(item.children)}</div>}\r\n </div>\r\n );\r\n });\r\n\r\n return (\r\n <EditorFocusScope>\r\n <aside\r\n className={cx('bree-layers', className)}\r\n style={style}\r\n aria-label={title ?? t.layers.title}\r\n tabIndex={-1}\r\n onDragLeave={(e) => !e.currentTarget.contains(e.relatedTarget as Node) && setDrop(null)}\r\n >\r\n <header className=\"bree-layers-header\">\r\n <h2>{title ?? t.layers.title}</h2>\r\n <div className=\"bree-layers-actions\">\r\n {expandCollapseButtons && (\r\n <>\r\n <button type=\"button\" className=\"bree-icon-button bree-small\" title={t.layers.expandAll} onClick={() => setCollapsed(new Set())}>\r\n ⊞\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"bree-icon-button bree-small\"\r\n title={t.layers.collapseAll}\r\n onClick={() => {\r\n const keys = new Set<string>();\r\n const walk = (items: LayerItem[]) =>\r\n items.forEach((i) => {\r\n if (i.children.length) keys.add(i.key);\r\n walk(i.children);\r\n });\r\n walk(layers);\r\n setCollapsed(keys);\r\n }}\r\n >\r\n ⊟\r\n </button>\r\n </>\r\n )}\r\n {onClose && (\r\n <button type=\"button\" className=\"bree-icon-button bree-small\" title={t.layers.close} onClick={onClose}>\r\n <XIcon size={14} />\r\n </button>\r\n )}\r\n </div>\r\n </header>\r\n <div className=\"bree-layers-list\" role=\"tree\" aria-label={t.layers.tree} ref={listRef}>\r\n {layers.length ? renderItems(layers) : <p className=\"bree-hint\">{t.layers.emptyEmail}</p>}\r\n </div>\r\n </aside>\r\n </EditorFocusScope>\r\n );\r\n}\r\n","import { cx } from '../../core/cx';\nimport type { InspectorProps } from '../../registry/types';\nimport { BoxGroup, SpacingGroup, TypographyGroup } from './groups';\n\n/** Text-like blocks (paragraph, list, quote…) and any node without its own inspector. */\nexport function DefaultInspector({ ctx, className, style }: InspectorProps) {\n return (\n <div className={cx('bree-inspector', className)} style={style}>\n <TypographyGroup ctx={ctx} alignment={String(ctx.getAttr('alignment') ?? 'left')} setAlignment={(v) => ctx.setAttr('alignment', v)} />\n <SpacingGroup ctx={ctx} />\n <BoxGroup ctx={ctx} />\n </div>\n );\n}\n","import { Inspector, XIcon } from '@react-email/editor/ui';\nimport type { ReactNode } from 'react';\nimport { useEmailEditor } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\n\nexport interface PropertiesPanelProps extends StyleProps {\n title: string;\n children: ReactNode;\n /** Shows the hierarchy (Email / Row / Column / Text…) under the header. Default: true. */\n breadcrumb?: boolean;\n}\n\n/** Deselects everything: the sidebar goes back to the content panel. */\nexport function useDeselect() {\n const { editor } = useEmailEditor();\n return () => {\n const active = document.activeElement;\n if (active instanceof HTMLElement) active.blur();\n editor.commands.blur();\n };\n}\n\n/** Sidebar screen shown when something is selected: header, breadcrumb and the inspector below. */\nexport function PropertiesPanel({ title, children, breadcrumb = true, className, style }: PropertiesPanelProps) {\n const { t, nodeLabel } = useEmailEditor();\n const deselect = useDeselect();\n return (\n <div className={cx('bree-properties', className)} style={style}>\n <header className=\"bree-properties-header\">\n <div>\n <span className=\"bree-eyebrow\">{t.sidebar.propertiesEyebrow}</span>\n <h2>{title}</h2>\n </div>\n <button type=\"button\" className=\"bree-icon-button\" title={t.sidebar.closeProperties} onClick={deselect}>\n <XIcon size={16} />\n </button>\n </header>\n {breadcrumb && (\n <Inspector.Breadcrumb>\n {(segments) =>\n segments.length > 1 && (\n <nav className=\"bree-breadcrumb\" aria-label={t.sidebar.breadcrumb}>\n {segments.map((segment, i) => (\n <span key={`${segment.node.nodeType}-${segment.node.nodePos.pos}`} className=\"bree-crumb\">\n {i > 0 && <span className=\"bree-crumb-sep\">/</span>}\n <button type=\"button\" disabled={i === segments.length - 1} onClick={segment.focus}>\n {nodeLabel(segment.node.nodeType)}\n </button>\n </span>\n ))}\n </nav>\n )\n }\n </Inspector.Breadcrumb>\n )}\n <div className=\"bree-panel-scroll\">{children}</div>\n </div>\n );\n}\n","import type { InspectorNodeContext } from '@react-email/editor/ui';\nimport { useEmailEditor } from '../context';\nimport type { StyleProps } from '../core/cx';\nimport { DefaultInspector } from './inspectors/DefaultInspector';\nimport { PropertiesPanel } from './PropertiesPanel';\n\nexport interface BlockPropertiesProps extends StyleProps {\n ctx: InspectorNodeContext;\n}\n\n/** Properties of the selected block: picks the inspector registered for its node type. */\nexport function BlockProperties({ ctx, className, style }: BlockPropertiesProps) {\n const { nodes, nodeLabel } = useEmailEditor();\n const Inspector = nodes.get(ctx.nodeType)?.inspector ?? DefaultInspector;\n return (\n <PropertiesPanel title={nodeLabel(ctx.nodeType)} className={className} style={style}>\n {/* Keyed so local state (drafts, open groups) resets when the selection changes. */}\n <Inspector key={`${ctx.nodeType}-${ctx.nodePos.pos}`} ctx={ctx} />\n </PropertiesPanel>\n );\n}\n","import type { JSONContent } from '@tiptap/core';\nimport type { DragEvent } from 'react';\nimport { useEmailEditor } from '../context';\nimport { appendBlocks, DND_MIME } from '../core/dnd';\n\n/**\n * Makes any element a source of new blocks: drag it onto the canvas or the\n * layers panel, or click it to append the blocks at the end of the email.\n *\n * ```tsx\n * const drag = useDraggableBlock('Promo', () => [paragraph('-20% today')]);\n * return <button {...drag}>Promo</button>;\n * ```\n */\nexport function useDraggableBlock(label: string, content: () => JSONContent[]) {\n const { editor, dragSession } = useEmailEditor();\n return {\n draggable: true,\n onDragStart: (event: DragEvent) => {\n dragSession.start({ kind: 'new', label, content });\n event.dataTransfer.setData(DND_MIME, label);\n event.dataTransfer.effectAllowed = 'copy';\n },\n onDragEnd: () => dragSession.end(),\n onClick: () => appendBlocks(editor, content()),\n };\n}\n","import { useEmailEditor, useI18n } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { resolveLabel } from '../i18n';\nimport { TemplateThumbnail } from '../registry/default-templates';\nimport type { TemplateItem } from '../registry/types';\nimport { useDraggableBlock } from './useDraggableBlock';\n\nexport interface TemplateCardProps extends StyleProps {\n template: TemplateItem;\n}\n\n/** One draggable prebuilt row. */\nexport function TemplateCard({ template, className, style }: TemplateCardProps) {\n const i18n = useI18n();\n const label = resolveLabel(template.label, i18n);\n const drag = useDraggableBlock(label, () => template.content(i18n));\n return (\n <button type=\"button\" className={cx('bree-block-card', className)} style={style} {...drag}>\n {template.thumbnail ?? <TemplateThumbnail variant=\"default\" />}\n <span className=\"bree-block-text\">\n <strong>{label}</strong>\n {template.description && <span>{resolveLabel(template.description, i18n)}</span>}\n </span>\n </button>\n );\n}\n\nexport interface BlocksTabProps extends StyleProps {\n /** Defaults to the editor's `templates`. */\n templates?: TemplateItem[];\n}\n\n/** \"Blocks\" tab: prebuilt rows (header, hero, footer…). */\nexport function BlocksTab({ templates, className, style }: BlocksTabProps) {\n const ctx = useEmailEditor();\n return (\n <div className={cx('bree-block-list', className)} style={style}>\n {(templates ?? ctx.templates).map((template) => (\n <TemplateCard key={template.id} template={template} />\n ))}\n </div>\n );\n}\n","import type { Editor } from '@tiptap/core';\nimport { getEmailTheming, setGlobalStyles, type PanelGroup } from '@react-email/editor/plugins';\n\n// The theme's panels have no font input, but any input is turned into CSS:\n// the email font is stored as extra inputs of the \"body\" panel. Quotes get the\n// same font, as the theme gives them their own.\nconst FONT_TARGETS = ['body', 'blockquote'];\n\n/** Font chosen for the whole email, or '' when it uses the theme's (system) font. */\nexport function getEmailFont(editor: Editor): string {\n const { styles } = getEmailTheming(editor);\n const input = styles.flatMap((group) => group.inputs).find((i) => (i.prop as string) === 'fontFamily' && i.classReference === 'body');\n return String(input?.value ?? '');\n}\n\n/** Sets the default font of the email. '' goes back to the theme's font. */\nexport function setEmailFont(editor: Editor, value: string) {\n const { styles } = getEmailTheming(editor);\n const isFont = (input: PanelGroup['inputs'][number]) => (input.prop as string) === 'fontFamily' && FONT_TARGETS.includes(input.classReference ?? '');\n const bodyIndex = Math.max(0, styles.findIndex((group) => group.id === 'body'));\n const next = styles.map((group, index) => {\n const inputs = group.inputs.filter((input) => !isFont(input));\n if (index !== bodyIndex || !value) return { ...group, inputs };\n const fonts = FONT_TARGETS.map((classReference) => ({ label: 'Font', type: 'text' as const, prop: 'fontFamily', classReference, value }));\n return { ...group, inputs: [...inputs, ...fonts] };\n });\n setGlobalStyles(editor, next as PanelGroup[]);\n}\n","import type { InspectorDocumentProps } from '@react-email/editor/ui';\nimport { useEmailEditor } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { getEmailFont, setEmailFont } from '../core/email-font';\nimport { ColorInput, Field, FontInput, Group, NumberInput, TextInput } from './fields';\n\n/** Context given by `Inspector.Document`: global (theme) styles of the email. */\nexport type DocumentContext = Parameters<NonNullable<InspectorDocumentProps['children']>>[0];\n\nexport interface BodyTabProps extends StyleProps {\n ctx: DocumentContext;\n}\n\n/** \"Body\" tab: email-wide settings (background, width, default font and colors, preview text). */\nexport function BodyTab({ ctx, className, style }: BodyTabProps) {\n const { editor, settings, updateSettings, t } = useEmailEditor();\n const b = t.body;\n const { findStyleValue, setGlobalStyle } = ctx;\n return (\n <div className={cx('bree-body-tab', className)} style={style}>\n <Group title={b.general}>\n <Field label={b.previewText} stacked>\n <TextInput value={settings.previewText} onChange={(previewText) => updateSettings({ previewText })} placeholder={b.previewTextPlaceholder} />\n </Field>\n </Group>\n <Group title={b.background}>\n <Field label={b.backgroundColor} stacked>\n <ColorInput value={findStyleValue('body', 'backgroundColor')} onChange={(v) => setGlobalStyle('body', 'backgroundColor', v)} />\n </Field>\n <Field label={b.outerPadding}>\n <NumberInput value={findStyleValue('body', 'padding')} onChange={(v) => setGlobalStyle('body', 'padding', v)} />\n </Field>\n </Group>\n <Group title={b.content}>\n <Field label={b.width}>\n <NumberInput value={findStyleValue('container', 'width')} onChange={(v) => setGlobalStyle('container', 'width', v)} min={320} max={900} />\n </Field>\n <Field label={b.contentColor} stacked>\n <ColorInput value={findStyleValue('container', 'backgroundColor')} onChange={(v) => setGlobalStyle('container', 'backgroundColor', v)} />\n </Field>\n <Field label={b.innerPadding}>\n <NumberInput value={findStyleValue('container', 'padding')} onChange={(v) => setGlobalStyle('container', 'padding', v)} />\n </Field>\n <Field label={b.radius}>\n <NumberInput value={findStyleValue('container', 'borderRadius')} onChange={(v) => setGlobalStyle('container', 'borderRadius', v)} />\n </Field>\n </Group>\n <Group title={b.defaultStyles}>\n <Field label={b.font}>\n <FontInput value={getEmailFont(editor)} emptyLabel={b.fontDefault} onChange={(v) => setEmailFont(editor, v)} />\n </Field>\n <Field label={b.text} stacked>\n <ColorInput value={findStyleValue('paragraph', 'color')} onChange={(v) => setGlobalStyle('paragraph', 'color', v)} />\n </Field>\n <Field label={b.headings} stacked>\n <ColorInput\n value={findStyleValue('h1', 'color')}\n onChange={(v) =>\n ctx.batchSetGlobalStyle((['h1', 'h2', 'h3'] as const).map((classReference) => ({ classReference, property: 'color', value: v })))\n }\n />\n </Field>\n <Field label={b.links} stacked>\n <ColorInput value={findStyleValue('link', 'color')} onChange={(v) => setGlobalStyle('link', 'color', v)} />\n </Field>\n <Field label={b.buttonBackground} stacked>\n <ColorInput value={findStyleValue('button', 'backgroundColor')} onChange={(v) => setGlobalStyle('button', 'backgroundColor', v)} />\n </Field>\n <Field label={b.buttonText} stacked>\n <ColorInput value={findStyleValue('button', 'color')} onChange={(v) => setGlobalStyle('button', 'color', v)} />\n </Field>\n </Group>\n </div>\n );\n}\n","import { useEmailEditor, useI18n } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { resolveLabel } from '../i18n';\nimport type { PaletteGroup, PaletteItem } from '../registry/types';\nimport { useDraggableBlock } from './useDraggableBlock';\n\nexport interface PaletteTileProps extends StyleProps {\n item: PaletteItem;\n}\n\n/** One draggable tile of the palette. */\nexport function PaletteTile({ item, className, style }: PaletteTileProps) {\n const i18n = useI18n();\n const label = resolveLabel(item.label, i18n);\n const drag = useDraggableBlock(label, () => item.content(i18n));\n return (\n <button type=\"button\" className={cx('bree-tile', className)} style={style} title={i18n.t.sidebar.tileTitle(label)} {...drag}>\n <span className=\"bree-tile-icon\">{item.icon}</span>\n <span className=\"bree-tile-label\">{label}</span>\n </button>\n );\n}\n\nexport interface ContentTabProps extends StyleProps {\n /** Defaults to the editor's `palette`. */\n items?: PaletteItem[];\n /** Defaults to the editor's `paletteGroups`; groups found only in items are added at the end. */\n groups?: PaletteGroup[];\n /** Hint under the tiles. `null` hides it. */\n hint?: string | null;\n}\n\n/** \"Content\" tab: layout and content tiles, grouped. */\nexport function ContentTab({ items, groups, hint, className, style }: ContentTabProps) {\n const ctx = useEmailEditor();\n const palette = items ?? ctx.palette;\n const known = groups ?? ctx.paletteGroups;\n const allGroups = [\n ...known,\n ...[...new Set(palette.map((item) => item.group))].filter((id) => !known.some((g) => g.id === id)).map((id) => ({ id, title: id })),\n ];\n return (\n <div className={cx('bree-content-tab', className)} style={style}>\n {allGroups.map((group) => {\n const groupItems = palette.filter((item) => item.group === group.id);\n if (!groupItems.length) return null;\n return (\n <section key={group.id}>\n <h3 className=\"bree-panel-title\">{resolveLabel(group.title, ctx)}</h3>\n <div className=\"bree-tiles\">\n {groupItems.map((item) => (\n <PaletteTile key={item.id} item={item} />\n ))}\n </div>\n </section>\n );\n })}\n {hint !== null && <p className=\"bree-hint\">{hint ?? ctx.t.sidebar.dragHint}</p>}\n </div>\n );\n}\n","import { useState, type ReactNode } from 'react';\nimport { useEmailEditor } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { BlocksTab } from './BlocksTab';\nimport { BodyTab, type DocumentContext } from './BodyTab';\nimport { ContentTab } from './ContentTab';\n\nexport interface ContentPanelTab {\n id: string;\n label: string;\n render: (ctx: DocumentContext) => ReactNode;\n}\n\nexport interface ContentPanelProps extends StyleProps {\n ctx: DocumentContext;\n /**\n * Tabs to show. Built-in ids: \"content\", \"blocks\", \"body\". Pass objects to\n * add your own tabs, e.g. `['content', { id: 'saved', label: 'Saved', render: () => <Saved /> }]`.\n */\n tabs?: Array<'content' | 'blocks' | 'body' | ContentPanelTab>;\n defaultTab?: string;\n}\n\n/** Sidebar screen shown when nothing is selected: tabs Content / Blocks / Body. */\nexport function ContentPanel({ ctx, tabs = ['content', 'blocks', 'body'], defaultTab, className, style }: ContentPanelProps) {\n const { t } = useEmailEditor();\n const builtIn: Record<string, ContentPanelTab> = {\n content: { id: 'content', label: t.sidebar.tabContent, render: () => <ContentTab /> },\n blocks: { id: 'blocks', label: t.sidebar.tabBlocks, render: () => <BlocksTab /> },\n body: { id: 'body', label: t.sidebar.tabBody, render: (doc) => <BodyTab ctx={doc} /> },\n };\n const resolved = tabs.map((tab) => (typeof tab === 'string' ? builtIn[tab] : tab));\n const [current, setCurrent] = useState(defaultTab ?? resolved[0]?.id);\n const active = resolved.find((tab) => tab.id === current) ?? resolved[0];\n\n return (\n <div className={cx('bree-content-panel', className)} style={style}>\n {resolved.length > 1 && (\n <nav className=\"bree-tabs\" role=\"tablist\">\n {resolved.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab.id === active?.id}\n className={cx(tab.id === active?.id && 'bree-active')}\n onClick={() => setCurrent(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </nav>\n )}\n <div className=\"bree-panel-scroll\">{active?.render(ctx)}</div>\n </div>\n );\n}\n","import { BoldIcon, ItalicIcon, StrikethroughIcon, UnderlineIcon, type InspectorTextContext } from '@react-email/editor/ui';\nimport { useMessages } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { ColorInput, Field, Group } from './fields';\nimport { TypographyGroup } from './inspectors/groups';\nimport { PropertiesPanel } from './PropertiesPanel';\n\nexport interface TextPropertiesProps extends StyleProps {\n ctx: InspectorTextContext;\n}\n\n/** Properties of a text selection: marks, typography and link color. */\nexport function TextProperties({ ctx, className, style }: TextPropertiesProps) {\n const t = useMessages();\n const i = t.inspector;\n const marks = [\n { mark: 'bold', Icon: BoldIcon, title: i.bold },\n { mark: 'italic', Icon: ItalicIcon, title: i.italic },\n { mark: 'underline', Icon: UnderlineIcon, title: i.underline },\n { mark: 'strike', Icon: StrikethroughIcon, title: i.strike },\n ];\n return (\n <PropertiesPanel title={t.sidebar.selectedText} className={className} style={style}>\n <Group title={i.formatting}>\n <div className=\"bree-mark-row\">\n {marks.map(({ mark, Icon, title }) => (\n <button\n key={mark}\n type=\"button\"\n title={title}\n aria-pressed={!!ctx.marks[mark]}\n className={cx('bree-mark', ctx.marks[mark] && 'bree-active')}\n onClick={() => ctx.toggleMark(mark)}\n >\n <Icon size={14} />\n </button>\n ))}\n </div>\n </Group>\n <TypographyGroup ctx={ctx} alignment={ctx.alignment} setAlignment={ctx.setAlignment} />\n {ctx.isLinkActive && (\n <Group title={i.link}>\n <Field label={i.url} stacked>\n <span className=\"bree-readonly\">{ctx.linkHref}</span>\n </Field>\n <Field label={i.linkColor} stacked>\n <ColorInput value={ctx.linkColor} presets={ctx.presetColors} onChange={ctx.setLinkColor} />\n </Field>\n </Group>\n )}\n </PropertiesPanel>\n );\n}\n","import { Inspector, type InspectorNodeContext, type InspectorTextContext } from '@react-email/editor/ui';\nimport type { ReactNode } from 'react';\nimport { useEmailEditor } from '../context';\nimport { cx, type StyleProps } from '../core/cx';\nimport { BlockProperties } from './BlockProperties';\nimport type { DocumentContext } from './BodyTab';\nimport { ContentPanel } from './ContentPanel';\nimport { TextProperties } from './TextProperties';\n\nexport interface SidebarProps extends StyleProps {\n /** Screen when nothing is selected. Default: `<ContentPanel />`. */\n renderDocument?: (ctx: DocumentContext) => ReactNode;\n /** Screen when a block is selected. Default: `<BlockProperties />`. */\n renderNode?: (ctx: InspectorNodeContext) => ReactNode;\n /** Screen when text is selected. Default: `<TextProperties />`. */\n renderText?: (ctx: InspectorTextContext) => ReactNode;\n}\n\n/** Right panel: switches between the content panel and the properties of the selection. */\nexport function Sidebar({\n renderDocument = (ctx) => <ContentPanel ctx={ctx} />,\n renderNode = (ctx) => <BlockProperties ctx={ctx} />,\n renderText = (ctx) => <TextProperties ctx={ctx} />,\n className,\n style,\n}: SidebarProps) {\n const { t } = useEmailEditor();\n return (\n <Inspector.Root className={cx('bree-sidebar', className)} style={style} aria-label={t.sidebar.label}>\n <Inspector.Document>{renderDocument}</Inspector.Document>\n <Inspector.Node>{renderNode}</Inspector.Node>\n <Inspector.Text>{renderText}</Inspector.Text>\n </Inspector.Root>\n );\n}\n","import { EditorFocusScope, XIcon } from '@react-email/editor/ui';\r\nimport { useEffect, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { useEmailEditor, type EmailExport } from '../context';\r\nimport { cx, type StyleProps } from '../core/cx';\r\n\r\nexport type PreviewView = 'desktop' | 'mobile' | 'html' | 'text';\r\n\r\n/** Triggers a browser download of `content`. */\r\nexport function download(filename: string, content: string, type: string) {\r\n const url = URL.createObjectURL(new Blob([content], { type }));\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n}\r\n\r\nexport interface PreviewDialogProps extends StyleProps {\r\n onClose: () => void;\r\n /** Tab shown first. Default: \"desktop\". */\r\n defaultView?: PreviewView;\r\n /** Tabs to show. Default: all four. */\r\n views?: PreviewView[];\r\n /** Name of the downloaded file. Default: \"email.html\". */\r\n filename?: string;\r\n}\r\n\r\n/** Modal with the rendered email: desktop / mobile preview, HTML and plain text, copy and download. Render it to open it. */\r\nexport function PreviewDialog({\r\n onClose,\r\n defaultView = 'desktop',\r\n views = ['desktop', 'mobile', 'html', 'text'],\r\n filename = 'email.html',\r\n className,\r\n style,\r\n}: PreviewDialogProps) {\r\n const { handle, settings, t } = useEmailEditor();\r\n const [view, setView] = useState<PreviewView>(defaultView);\r\n const [result, setResult] = useState<EmailExport | null>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n const [copied, setCopied] = useState(false);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n handle\r\n .exportEmail()\r\n .then((r) => !cancelled && setResult(r))\r\n .catch((e: unknown) => !cancelled && setError(e instanceof Error ? e.message : String(e)));\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [handle, settings.previewText]);\r\n\r\n useEffect(() => {\r\n const onKey = (e: KeyboardEvent) => e.key === 'Escape' && onClose();\r\n window.addEventListener('keydown', onKey);\r\n return () => window.removeEventListener('keydown', onKey);\r\n }, [onClose]);\r\n\r\n const copy = async () => {\r\n if (!result) return;\r\n await navigator.clipboard.writeText(view === 'text' ? result.text : result.html);\r\n setCopied(true);\r\n setTimeout(() => setCopied(false), 1500);\r\n };\r\n\r\n const p = t.preview;\r\n // Portaled to <body> so it sits above every stacking context of the host page\r\n // (and of the canvas overlay); `bree` brings the theme variables along.\r\n return createPortal(\r\n <EditorFocusScope>\r\n <div className=\"bree bree-modal-backdrop\" onMouseDown={(e) => e.target === e.currentTarget && onClose()}>\r\n <div className={cx('bree-modal', className)} style={style} role=\"dialog\" aria-modal=\"true\" aria-label={p.dialogLabel}>\r\n <header className=\"bree-modal-header\">\r\n <nav className=\"bree-tabs bree-compact\" role=\"tablist\">\r\n {views.map((id) => (\r\n <button key={id} type=\"button\" role=\"tab\" aria-selected={view === id} className={cx(view === id && 'bree-active')} onClick={() => setView(id)}>\r\n {p[id]}\r\n </button>\r\n ))}\r\n </nav>\r\n <div className=\"bree-modal-actions\">\r\n {result && (view === 'html' || view === 'text') && (\r\n <button type=\"button\" className=\"bree-btn\" onClick={copy}>\r\n {copied ? p.copied : p.copy}\r\n </button>\r\n )}\r\n {result && (\r\n <button type=\"button\" className=\"bree-btn bree-primary\" onClick={() => download(filename, result.unformattedHtml, 'text/html')}>\r\n {p.download}\r\n </button>\r\n )}\r\n <button type=\"button\" className=\"bree-icon-button\" onClick={onClose} title={p.close}>\r\n <XIcon size={18} />\r\n </button>\r\n </div>\r\n </header>\r\n <div className=\"bree-modal-body\">\r\n {error && <p className=\"bree-error\">{p.renderError(error)}</p>}\r\n {!result && !error && <p className=\"bree-loading\">{p.rendering}</p>}\r\n {result && (view === 'desktop' || view === 'mobile') && (\r\n <div className={cx('bree-preview-frame', `bree-preview-${view}`)}>\r\n <iframe title={p.iframeTitle} srcDoc={result.html} sandbox=\"allow-same-origin allow-popups\" />\r\n </div>\r\n )}\r\n {result && view === 'html' && <pre className=\"bree-code\">{result.html}</pre>}\r\n {result && view === 'text' && <pre className=\"bree-code\">{result.text}</pre>}\r\n </div>\r\n </div>\r\n </div>\r\n </EditorFocusScope>,\r\n document.body,\r\n );\r\n}\r\n","import { useEditorState } from '@tiptap/react';\r\nimport { EditorFocusScope } from '@react-email/editor/ui';\r\nimport { useRef, useState, type ReactNode } from 'react';\r\nimport { useEmailEditor } from '../context';\r\nimport { cx, type StyleProps } from '../core/cx';\r\nimport { DesktopIcon, LayersIcon, MobileIcon, RedoIcon, UndoIcon } from './icons';\r\nimport { download, PreviewDialog, type PreviewView } from './PreviewDialog';\r\n\r\n/*\r\n * The top bar and each of its controls. Use `<TopBar />` as is, or compose\r\n * your own bar from the buttons below (they all need to live inside the editor).\r\n */\r\n\r\nexport function LayersToggle({ className, style }: StyleProps) {\r\n const { layersOpen, setLayersOpen, t } = useEmailEditor();\r\n return (\r\n <button\r\n type=\"button\"\r\n className={cx('bree-btn bree-ghost bree-layers-toggle', layersOpen && 'bree-active', className)}\r\n style={style}\r\n aria-pressed={layersOpen}\r\n onClick={() => setLayersOpen(!layersOpen)}\r\n title={t.topBar.toggleLayers}\r\n >\r\n <LayersIcon /> {t.topBar.layers}\r\n </button>\r\n );\r\n}\r\n\r\nexport function UndoRedo({ className, style }: StyleProps) {\r\n const { editor, t } = useEmailEditor();\r\n const history = useEditorState({\r\n editor,\r\n selector: ({ editor: ed }) => ({ undo: !!ed?.can().undo(), redo: !!ed?.can().redo() }),\r\n });\r\n return (\r\n <div className={cx('bree-btn-group', className)} style={style}>\r\n <button type=\"button\" className=\"bree-icon-button\" title={t.topBar.undo} disabled={!history?.undo} onClick={() => editor.chain().focus().undo().run()}>\r\n <UndoIcon />\r\n </button>\r\n <button type=\"button\" className=\"bree-icon-button\" title={t.topBar.redo} disabled={!history?.redo} onClick={() => editor.chain().focus().redo().run()}>\r\n <RedoIcon />\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nexport function DeviceToggle({ className, style }: StyleProps) {\r\n const { device, setDevice, t } = useEmailEditor();\r\n const options = [\r\n { id: 'desktop', label: t.topBar.desktop, Icon: DesktopIcon },\r\n { id: 'mobile', label: t.topBar.mobile, Icon: MobileIcon },\r\n ] as const;\r\n return (\r\n <div className={cx('bree-segmented bree-device-toggle', className)} style={style} role=\"radiogroup\" aria-label={t.topBar.canvasWidth}>\r\n {options.map(({ id, label, Icon }) => (\r\n <button key={id} type=\"button\" role=\"radio\" aria-checked={device === id} className={cx(device === id && 'bree-active')} onClick={() => setDevice(id)} title={label}>\r\n <Icon />\r\n </button>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\n/** Replaces the content with the starter document (after confirmation). */\r\nexport function TemplateButton({ className, style }: StyleProps) {\r\n const { editor, starterDocument, locale, t } = useEmailEditor();\r\n return (\r\n <button\r\n type=\"button\"\r\n className={cx('bree-btn bree-ghost', className)}\r\n style={style}\r\n onClick={() => {\r\n if (confirm(t.topBar.confirmTemplate)) editor.commands.setContent(starterDocument({ locale, t }));\r\n }}\r\n >\r\n {t.topBar.template}\r\n </button>\r\n );\r\n}\r\n\r\n/** Loads a JSON file saved by `ExportJsonButton` (or a bare Tiptap document). */\r\nexport function ImportButton({ className, style }: StyleProps) {\r\n const { handle, t } = useEmailEditor();\r\n const input = useRef<HTMLInputElement>(null);\r\n const importJson = async (file: File) => {\r\n try {\r\n handle.setValue(JSON.parse(await file.text()));\r\n } catch (error) {\r\n alert(t.topBar.invalidFile(error instanceof Error ? error.message : String(error)));\r\n }\r\n };\r\n return (\r\n <>\r\n <button type=\"button\" className={cx('bree-btn bree-ghost', className)} style={style} onClick={() => input.current?.click()}>\r\n {t.topBar.import}\r\n </button>\r\n <input\r\n ref={input}\r\n type=\"file\"\r\n accept=\"application/json,.json\"\r\n hidden\r\n onChange={(e) => {\r\n const file = e.target.files?.[0];\r\n if (file) void importJson(file);\r\n e.target.value = '';\r\n }}\r\n />\r\n </>\r\n );\r\n}\r\n\r\n/** Downloads `{ doc, settings }` as email.json. */\r\nexport function ExportJsonButton({ className, style, filename = 'email.json' }: StyleProps & { filename?: string }) {\r\n const { handle, t } = useEmailEditor();\r\n return (\r\n <button\r\n type=\"button\"\r\n className={cx('bree-btn bree-ghost', className)}\r\n style={style}\r\n onClick={() => download(filename, JSON.stringify(handle.getValue(), null, 2), 'application/json')}\r\n >\r\n {t.topBar.exportJson}\r\n </button>\r\n );\r\n}\r\n\r\nexport interface PreviewButtonProps extends StyleProps {\r\n /** Tab opened in the preview dialog. Default: \"desktop\". */\r\n view?: PreviewView;\r\n variant?: 'default' | 'primary' | 'ghost';\r\n children?: ReactNode;\r\n}\r\n\r\n/** Opens the preview / export dialog. */\r\nexport function PreviewButton({ view = 'desktop', variant = 'default', children, className, style }: PreviewButtonProps) {\r\n const { t } = useEmailEditor();\r\n const [open, setOpen] = useState(false);\r\n return (\r\n <>\r\n <button\r\n type=\"button\"\r\n className={cx('bree-btn', variant !== 'default' && `bree-${variant}`, className)}\r\n style={style}\r\n onClick={() => setOpen(true)}\r\n >\r\n {children ?? t.topBar.preview}\r\n </button>\r\n {open && <PreviewDialog defaultView={view} onClose={() => setOpen(false)} />}\r\n </>\r\n );\r\n}\r\n\r\nexport function ExportHtmlButton(props: StyleProps) {\r\n const { t } = useEmailEditor();\r\n return (\r\n <PreviewButton view=\"html\" variant=\"primary\" {...props}>\r\n {t.topBar.exportHtml}\r\n </PreviewButton>\r\n );\r\n}\r\n\r\nexport interface TopBarProps extends StyleProps {\r\n /** Left side, e.g. your logo. Empty by default. */\r\n brand?: ReactNode;\r\n /** Extra controls placed before the export button. */\r\n actions?: ReactNode;\r\n /** Replaces the default controls (device toggle + export) with your own. */\r\n children?: ReactNode;\r\n}\r\n\r\n/**\r\n * Top bar: device toggle (desktop / mobile) and the export button. Add more\r\n * controls with `actions`, or compose your own bar from `LayersToggle`,\r\n * `UndoRedo`, `TemplateButton`, `ImportButton`, `ExportJsonButton`, `PreviewButton`…\r\n */\r\nexport function TopBar({ brand, actions, children, className, style }: TopBarProps) {\r\n return (\r\n <EditorFocusScope>\r\n <header className={cx('bree-topbar', className)} style={style}>\r\n <div className=\"bree-topbar-start\">{brand}</div>\r\n {children ?? (\r\n <>\r\n <div className=\"bree-topbar-center\">\r\n <DeviceToggle />\r\n </div>\r\n <div className=\"bree-topbar-actions\">\r\n {actions}\r\n <ExportHtmlButton />\r\n </div>\r\n </>\r\n )}\r\n </header>\r\n </EditorFocusScope>\r\n );\r\n}\r\n","import { forwardRef, type ComponentType } from 'react';\r\nimport { EditorRoot, useEmailEditor, type EditorRootProps, type EmailEditorHandle } from '../context';\r\nimport { cx } from '../core/cx';\r\nimport { Canvas, type CanvasProps } from './Canvas';\r\nimport { LayersPanel, type LayersPanelProps } from './LayersPanel';\r\nimport { Sidebar, type SidebarProps } from './Sidebar';\r\nimport { TopBar, type TopBarProps } from './TopBar';\r\n\r\nexport interface BetterEmailEditorComponents {\r\n TopBar?: ComponentType<TopBarProps>;\r\n LayersPanel?: ComponentType<LayersPanelProps>;\r\n Canvas?: ComponentType<CanvasProps>;\r\n Sidebar?: ComponentType<SidebarProps>;\r\n}\r\n\r\nexport interface BetterEmailEditorProps extends Omit<EditorRootProps, 'children'> {\r\n /** Show the top bar. Default: true. */\r\n showTopBar?: boolean;\r\n /** Show the layers panel. Default: true. */\r\n showLayers?: boolean;\r\n /** Show the right sidebar. Default: true. */\r\n showSidebar?: boolean;\r\n /** Show the subject and preview text fields above the email. Default: false. */\r\n showEmailHeader?: boolean;\r\n /** Replace any part with your own component. */\r\n components?: BetterEmailEditorComponents;\r\n /** Props (className, style…) forwarded to each part. */\r\n slotProps?: {\r\n topBar?: TopBarProps;\r\n layersPanel?: LayersPanelProps;\r\n canvas?: CanvasProps;\r\n sidebar?: SidebarProps;\r\n };\r\n}\r\n\r\nfunction DefaultLayout({\r\n showTopBar = true,\r\n showLayers = true,\r\n showSidebar = true,\r\n showEmailHeader = false,\r\n components = {},\r\n slotProps = {},\r\n}: Pick<BetterEmailEditorProps, 'showTopBar' | 'showLayers' | 'showSidebar' | 'showEmailHeader' | 'components' | 'slotProps'>) {\r\n const { layersOpen } = useEmailEditor();\r\n const { TopBar: Top = TopBar, LayersPanel: Layers = LayersPanel, Canvas: Main = Canvas, Sidebar: Side = Sidebar } = components;\r\n const withLayers = showLayers && layersOpen;\r\n return (\r\n <div\r\n className={cx(\r\n 'bree-layout',\r\n showTopBar && 'bree-with-topbar',\r\n withLayers && 'bree-with-layers',\r\n showSidebar && 'bree-with-sidebar',\r\n )}\r\n >\r\n {showTopBar && <Top {...slotProps.topBar} />}\r\n {withLayers && <Layers {...slotProps.layersPanel} />}\r\n <Main header={showEmailHeader} {...slotProps.canvas} />\r\n {showSidebar && <Side {...slotProps.sidebar} />}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * The complete editor in one component: top bar, layers, canvas and sidebar.\r\n * For a custom layout, use `EditorRoot` with the individual components instead.\r\n */\r\nexport const BetterEmailEditor = forwardRef<EmailEditorHandle, BetterEmailEditorProps>(function BetterEmailEditor(\r\n { showTopBar, showLayers, showSidebar, showEmailHeader, components, slotProps, ...rootProps },\r\n ref,\r\n) {\r\n return (\r\n <EditorRoot ref={ref} {...rootProps}>\r\n <DefaultLayout showTopBar={showTopBar} showLayers={showLayers} showSidebar={showSidebar} showEmailHeader={showEmailHeader} components={components} slotProps={slotProps} />\r\n </EditorRoot>\r\n );\r\n});\r\n"],"mappings":"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"}