diff --git a/app/components/email-builder/Canvas.tsx b/app/components/email-builder/Canvas.tsx new file mode 100644 index 0000000..1316f5f --- /dev/null +++ b/app/components/email-builder/Canvas.tsx @@ -0,0 +1,39 @@ +import { EmailTemplate } from "../../lib/email-schema"; + +type Props = { + template: EmailTemplate; + selectedBlockId: string | null; + onSelect: (id: string) => void; +}; + +export function Canvas({ template, selectedBlockId, onSelect }: Props) { + return ( +
+ {template.sections.map((s) => + s.columns.map((c) => + c.blocks.map((b) => ( +
onSelect(b.id)} + className={`border p-2 mb-2 cursor-pointer ${ + b.id === selectedBlockId ? "border-blue-500" : "border-transparent" + }`} + > +
+ {b.props.content} +
+
+ )) + ) + )} +
+ ); +} diff --git a/app/components/email-builder/EmailBuilder.tsx b/app/components/email-builder/EmailBuilder.tsx new file mode 100644 index 0000000..abe3aeb --- /dev/null +++ b/app/components/email-builder/EmailBuilder.tsx @@ -0,0 +1,33 @@ +"use client"; + +import { useState } from "react"; +import { EmailTemplate } from "../../lib/email-schema"; +import { Canvas } from "./Canvas"; +import { Inspector } from "./Inspector"; +import { renderMJML } from "../../lib/render-mjml"; + +type Props = { + value: EmailTemplate; + onChange: (t: EmailTemplate) => void; +}; + +export function EmailBuilder({ value, onChange }: Props) { + const [selected, setSelected] = useState(null); + + const html = renderMJML(value); + + return ( +
+
+ + +

Email Preview

+