fix(composer): keep HTML signature styling in the editor and on send
Rich, table-based identity signatures lost all their inline CSS (background/text colors, fonts, border-radius, bgcolor). The composer embeds the signature into the TipTap editor, and parsing it into the ProseMirror schema flattened it to a generic bordered table. That normalized version was then shown while composing AND delivered to the recipient, even though Identity settings stored and previewed it correctly. Hold the signature as a dedicated, non-editable atom node (SignatureBlock) that keeps the verbatim HTML in an attribute and renders it inside a Shadow Root, mirroring the existing QuotedHtml island. The markup is never parsed into the schema, so the styling survives 1:1 both in the in-editor preview and in the outgoing mail (serializeEditorContent inlines the verbatim HTML, as it already does for quoted originals). The signature stays a single unit: select it and Backspace/Delete to remove it; identity switching still swaps it via the existing data-signature-block markers. Adds unit coverage (parse + serialize round-trip preserves inline styles). Fixes #475 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
committed by
Linus Rath
co-authored by
Claude Opus 4.8
parent
1119d8ed73
commit
198407ebf5
@@ -4,6 +4,8 @@ import { Node as TiptapNode, mergeAttributes } from "@tiptap/core";
|
||||
import { DOMSerializer } from "@tiptap/pm/model";
|
||||
import type { Editor } from "@tiptap/react";
|
||||
|
||||
import { buildSignatureBlock } from "@/components/email/signature-block";
|
||||
|
||||
// Marker attribute that identifies the quoted-original wrapper in serialized
|
||||
// HTML, so parseHTML can recognise it on the way back in.
|
||||
export const QUOTED_HTML_MARKER = "data-quoted-html";
|
||||
@@ -166,6 +168,13 @@ export function serializeEditorContent(editor: Editor): string {
|
||||
parts.push(buildQuotedHtmlBlock((node.attrs.html as string) || ""));
|
||||
return;
|
||||
}
|
||||
if (node.type.name === "signatureBlock") {
|
||||
// Same rationale as quotedHtml: inline the verbatim signature HTML so the
|
||||
// styled signature reaches the recipient (and a saved draft round-trips)
|
||||
// instead of the schema-flattened version.
|
||||
parts.push(buildSignatureBlock((node.attrs.html as string) || ""));
|
||||
return;
|
||||
}
|
||||
const fragment = serializer.serializeNode(node);
|
||||
const tmp = document.createElement("div");
|
||||
tmp.appendChild(fragment);
|
||||
|
||||
Reference in New Issue
Block a user