@singleton-sd/post-kit-editor 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +105 -0
- package/dist/canvas/EditorBlock.d.ts +6 -0
- package/dist/canvas/EditorBlock.js +25 -0
- package/dist/canvas/EditorBlock.js.map +1 -0
- package/dist/canvas/EmailBuilderCanvas.d.ts +7 -0
- package/dist/canvas/EmailBuilderCanvas.js +15 -0
- package/dist/canvas/EmailBuilderCanvas.js.map +1 -0
- package/dist/canvas/blocks/ColumnsContainerEditor.d.ts +2 -0
- package/dist/canvas/blocks/ColumnsContainerEditor.js +47 -0
- package/dist/canvas/blocks/ColumnsContainerEditor.js.map +1 -0
- package/dist/canvas/blocks/ColumnsContainerPropsSchema.d.ts +183 -0
- package/dist/canvas/blocks/ColumnsContainerPropsSchema.js +19 -0
- package/dist/canvas/blocks/ColumnsContainerPropsSchema.js.map +1 -0
- package/dist/canvas/blocks/ContainerEditor.d.ts +2 -0
- package/dist/canvas/blocks/ContainerEditor.js +39 -0
- package/dist/canvas/blocks/ContainerEditor.js.map +1 -0
- package/dist/canvas/blocks/ContainerPropsSchema.d.ts +83 -0
- package/dist/canvas/blocks/ContainerPropsSchema.js +16 -0
- package/dist/canvas/blocks/ContainerPropsSchema.js.map +1 -0
- package/dist/canvas/blocks/EmailLayoutEditor.d.ts +2 -0
- package/dist/canvas/blocks/EmailLayoutEditor.js +80 -0
- package/dist/canvas/blocks/EmailLayoutEditor.js.map +1 -0
- package/dist/canvas/blocks/EmailLayoutPropsSchema.d.ts +28 -0
- package/dist/canvas/blocks/EmailLayoutPropsSchema.js +33 -0
- package/dist/canvas/blocks/EmailLayoutPropsSchema.js.map +1 -0
- package/dist/canvas/editor-context.d.ts +22 -0
- package/dist/canvas/editor-context.js +55 -0
- package/dist/canvas/editor-context.js.map +1 -0
- package/dist/canvas/editor-core.d.ts +2910 -0
- package/dist/canvas/editor-core.js +87 -0
- package/dist/canvas/editor-core.js.map +1 -0
- package/dist/canvas/helpers/AddBlockMenu.d.ts +7 -0
- package/dist/canvas/helpers/AddBlockMenu.js +23 -0
- package/dist/canvas/helpers/AddBlockMenu.js.map +1 -0
- package/dist/canvas/helpers/EditorBlockWrapper.d.ts +5 -0
- package/dist/canvas/helpers/EditorBlockWrapper.js +36 -0
- package/dist/canvas/helpers/EditorBlockWrapper.js.map +1 -0
- package/dist/canvas/helpers/EditorChildrenIds.d.ts +11 -0
- package/dist/canvas/helpers/EditorChildrenIds.js +38 -0
- package/dist/canvas/helpers/EditorChildrenIds.js.map +1 -0
- package/dist/canvas/helpers/block-templates.d.ts +7 -0
- package/dist/canvas/helpers/block-templates.js +87 -0
- package/dist/canvas/helpers/block-templates.js.map +1 -0
- package/dist/email-template-editor.d.ts +11 -0
- package/dist/email-template-editor.js +32 -0
- package/dist/email-template-editor.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/insertion-target.d.ts +18 -0
- package/dist/insertion-target.js +41 -0
- package/dist/insertion-target.js.map +1 -0
- package/dist/metadata/MetadataPanel.d.ts +7 -0
- package/dist/metadata/MetadataPanel.js +56 -0
- package/dist/metadata/MetadataPanel.js.map +1 -0
- package/dist/metadata/insert-at-cursor.d.ts +5 -0
- package/dist/metadata/insert-at-cursor.js +22 -0
- package/dist/metadata/insert-at-cursor.js.map +1 -0
- package/dist/metadata/subject-preview.d.ts +2 -0
- package/dist/metadata/subject-preview.js +12 -0
- package/dist/metadata/subject-preview.js.map +1 -0
- package/dist/metadata/template-key.d.ts +4 -0
- package/dist/metadata/template-key.js +21 -0
- package/dist/metadata/template-key.js.map +1 -0
- package/dist/preview/PreviewDataEditor.d.ts +7 -0
- package/dist/preview/PreviewDataEditor.js +37 -0
- package/dist/preview/PreviewDataEditor.js.map +1 -0
- package/dist/preview/PreviewPane.d.ts +7 -0
- package/dist/preview/PreviewPane.js +39 -0
- package/dist/preview/PreviewPane.js.map +1 -0
- package/dist/preview/preview-frame.d.ts +8 -0
- package/dist/preview/preview-frame.js +41 -0
- package/dist/preview/preview-frame.js.map +1 -0
- package/dist/preview/preview-rows.d.ts +10 -0
- package/dist/preview/preview-rows.js +54 -0
- package/dist/preview/preview-rows.js.map +1 -0
- package/dist/preview/render-template-preview.d.ts +10 -0
- package/dist/preview/render-template-preview.js +27 -0
- package/dist/preview/render-template-preview.js.map +1 -0
- package/dist/serialization.d.ts +15 -0
- package/dist/serialization.js +128 -0
- package/dist/serialization.js.map +1 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/variables/VariableCatalogue.d.ts +7 -0
- package/dist/variables/VariableCatalogue.js +77 -0
- package/dist/variables/VariableCatalogue.js.map +1 -0
- package/dist/variables/clipboard.d.ts +3 -0
- package/dist/variables/clipboard.js +16 -0
- package/dist/variables/clipboard.js.map +1 -0
- package/dist/variables/copy-feedback.d.ts +7 -0
- package/dist/variables/copy-feedback.js +14 -0
- package/dist/variables/copy-feedback.js.map +1 -0
- package/dist/variables/resolve-catalogue.d.ts +2 -0
- package/dist/variables/resolve-catalogue.js +10 -0
- package/dist/variables/resolve-catalogue.js.map +1 -0
- package/dist/working-files.d.ts +6 -0
- package/dist/working-files.js +25 -0
- package/dist/working-files.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.EditorConfigurationSchema = exports.EditorBlockSchema = exports.EditorBlock = void 0;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const zod_1 = require("zod");
|
|
9
|
+
const block_avatar_1 = require("@usewaypoint/block-avatar");
|
|
10
|
+
const block_button_1 = require("@usewaypoint/block-button");
|
|
11
|
+
const block_divider_1 = require("@usewaypoint/block-divider");
|
|
12
|
+
const block_heading_1 = require("@usewaypoint/block-heading");
|
|
13
|
+
const block_html_1 = require("@usewaypoint/block-html");
|
|
14
|
+
const block_image_1 = require("@usewaypoint/block-image");
|
|
15
|
+
const block_spacer_1 = require("@usewaypoint/block-spacer");
|
|
16
|
+
const block_text_1 = require("@usewaypoint/block-text");
|
|
17
|
+
const document_core_1 = require("@usewaypoint/document-core");
|
|
18
|
+
const ColumnsContainerEditor_1 = __importDefault(require("./blocks/ColumnsContainerEditor"));
|
|
19
|
+
const ColumnsContainerPropsSchema_1 = __importDefault(require("./blocks/ColumnsContainerPropsSchema"));
|
|
20
|
+
const ContainerEditor_1 = __importDefault(require("./blocks/ContainerEditor"));
|
|
21
|
+
const ContainerPropsSchema_1 = __importDefault(require("./blocks/ContainerPropsSchema"));
|
|
22
|
+
const EmailLayoutEditor_1 = __importDefault(require("./blocks/EmailLayoutEditor"));
|
|
23
|
+
const EmailLayoutPropsSchema_1 = __importDefault(require("./blocks/EmailLayoutPropsSchema"));
|
|
24
|
+
const EditorBlockWrapper_1 = __importDefault(require("./helpers/EditorBlockWrapper"));
|
|
25
|
+
const EDITOR_DICTIONARY = (0, document_core_1.buildBlockConfigurationDictionary)({
|
|
26
|
+
Avatar: {
|
|
27
|
+
schema: block_avatar_1.AvatarPropsSchema,
|
|
28
|
+
Component: (props) => ((0, jsx_runtime_1.jsx)(EditorBlockWrapper_1.default, { children: (0, jsx_runtime_1.jsx)(block_avatar_1.Avatar, { ...props }) })),
|
|
29
|
+
},
|
|
30
|
+
Button: {
|
|
31
|
+
schema: block_button_1.ButtonPropsSchema,
|
|
32
|
+
Component: (props) => ((0, jsx_runtime_1.jsx)(EditorBlockWrapper_1.default, { children: (0, jsx_runtime_1.jsx)(block_button_1.Button, { ...props }) })),
|
|
33
|
+
},
|
|
34
|
+
Container: {
|
|
35
|
+
schema: ContainerPropsSchema_1.default,
|
|
36
|
+
Component: (props) => ((0, jsx_runtime_1.jsx)(EditorBlockWrapper_1.default, { children: (0, jsx_runtime_1.jsx)(ContainerEditor_1.default, { ...props }) })),
|
|
37
|
+
},
|
|
38
|
+
ColumnsContainer: {
|
|
39
|
+
schema: ColumnsContainerPropsSchema_1.default,
|
|
40
|
+
Component: (props) => ((0, jsx_runtime_1.jsx)(EditorBlockWrapper_1.default, { children: (0, jsx_runtime_1.jsx)(ColumnsContainerEditor_1.default, { ...props }) })),
|
|
41
|
+
},
|
|
42
|
+
Heading: {
|
|
43
|
+
schema: block_heading_1.HeadingPropsSchema,
|
|
44
|
+
Component: (props) => ((0, jsx_runtime_1.jsx)(EditorBlockWrapper_1.default, { children: (0, jsx_runtime_1.jsx)(block_heading_1.Heading, { ...props }) })),
|
|
45
|
+
},
|
|
46
|
+
Html: {
|
|
47
|
+
schema: block_html_1.HtmlPropsSchema,
|
|
48
|
+
Component: (props) => ((0, jsx_runtime_1.jsx)(EditorBlockWrapper_1.default, { children: (0, jsx_runtime_1.jsx)(block_html_1.Html, { ...props }) })),
|
|
49
|
+
},
|
|
50
|
+
Image: {
|
|
51
|
+
schema: block_image_1.ImagePropsSchema,
|
|
52
|
+
Component: (data) => {
|
|
53
|
+
if (!data.props?.url) {
|
|
54
|
+
return ((0, jsx_runtime_1.jsx)(EditorBlockWrapper_1.default, { children: (0, jsx_runtime_1.jsx)("div", { "data-testid": "pk-editor-image-empty", "aria-hidden": true, style: {
|
|
55
|
+
backgroundColor: '#F8F8F8',
|
|
56
|
+
color: '#AAAAAA',
|
|
57
|
+
fontSize: '14px',
|
|
58
|
+
lineHeight: '400px',
|
|
59
|
+
textAlign: 'center',
|
|
60
|
+
width: '100%',
|
|
61
|
+
minHeight: '120px',
|
|
62
|
+
}, children: "Image" }) }));
|
|
63
|
+
}
|
|
64
|
+
return ((0, jsx_runtime_1.jsx)(EditorBlockWrapper_1.default, { children: (0, jsx_runtime_1.jsx)(block_image_1.Image, { ...data }) }));
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
Text: {
|
|
68
|
+
schema: block_text_1.TextPropsSchema,
|
|
69
|
+
Component: (props) => ((0, jsx_runtime_1.jsx)(EditorBlockWrapper_1.default, { children: (0, jsx_runtime_1.jsx)(block_text_1.Text, { ...props }) })),
|
|
70
|
+
},
|
|
71
|
+
EmailLayout: {
|
|
72
|
+
schema: EmailLayoutPropsSchema_1.default,
|
|
73
|
+
Component: (props) => (0, jsx_runtime_1.jsx)(EmailLayoutEditor_1.default, { ...props }),
|
|
74
|
+
},
|
|
75
|
+
Spacer: {
|
|
76
|
+
schema: block_spacer_1.SpacerPropsSchema,
|
|
77
|
+
Component: (props) => ((0, jsx_runtime_1.jsx)(EditorBlockWrapper_1.default, { children: (0, jsx_runtime_1.jsx)(block_spacer_1.Spacer, { ...props }) })),
|
|
78
|
+
},
|
|
79
|
+
Divider: {
|
|
80
|
+
schema: block_divider_1.DividerPropsSchema,
|
|
81
|
+
Component: (props) => ((0, jsx_runtime_1.jsx)(EditorBlockWrapper_1.default, { children: (0, jsx_runtime_1.jsx)(block_divider_1.Divider, { ...props }) })),
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
exports.EditorBlock = (0, document_core_1.buildBlockComponent)(EDITOR_DICTIONARY);
|
|
85
|
+
exports.EditorBlockSchema = (0, document_core_1.buildBlockConfigurationSchema)(EDITOR_DICTIONARY);
|
|
86
|
+
exports.EditorConfigurationSchema = zod_1.z.record(zod_1.z.string(), exports.EditorBlockSchema);
|
|
87
|
+
//# sourceMappingURL=editor-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-core.js","sourceRoot":"","sources":["../../src/canvas/editor-core.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TEditorBlock } from '../editor-core';
|
|
2
|
+
type AddBlockButtonProps = {
|
|
3
|
+
placeholder?: boolean;
|
|
4
|
+
onSelect: (block: TEditorBlock) => void;
|
|
5
|
+
};
|
|
6
|
+
export default function AddBlockButton({ onSelect, placeholder, }: AddBlockButtonProps): JSX.Element;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = AddBlockButton;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const email_template_editor_1 = require("../../email-template-editor");
|
|
7
|
+
const block_templates_1 = require("./block-templates");
|
|
8
|
+
function AddBlockButton({ onSelect, placeholder, }) {
|
|
9
|
+
const [open, setOpen] = (0, react_1.useState)(false);
|
|
10
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: `${email_template_editor_1.EDITOR_CLASS_PREFIX}add-block`, style: { position: 'relative', padding: '4px 0' }, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", className: `${email_template_editor_1.EDITOR_CLASS_PREFIX}add-block-trigger`, onClick: () => setOpen((value) => !value), children: placeholder ? '+ Add block' : '+' }), open ? ((0, jsx_runtime_1.jsx)("div", { className: `${email_template_editor_1.EDITOR_CLASS_PREFIX}add-block-menu`, style: {
|
|
11
|
+
position: 'absolute',
|
|
12
|
+
zIndex: 10,
|
|
13
|
+
background: '#fff',
|
|
14
|
+
border: '1px solid #ccc',
|
|
15
|
+
borderRadius: '4px',
|
|
16
|
+
padding: '4px',
|
|
17
|
+
minWidth: '140px',
|
|
18
|
+
}, children: block_templates_1.BLOCK_TEMPLATES.map((template) => ((0, jsx_runtime_1.jsx)("button", { type: "button", className: `${email_template_editor_1.EDITOR_CLASS_PREFIX}add-block-option`, style: { display: 'block', width: '100%', textAlign: 'left', padding: '4px 8px' }, onClick: () => {
|
|
19
|
+
onSelect(template.block());
|
|
20
|
+
setOpen(false);
|
|
21
|
+
}, children: template.label }, template.label))) })) : null] }));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=AddBlockMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AddBlockMenu.js","sourceRoot":"","sources":["../../../src/canvas/helpers/AddBlockMenu.tsx"],"names":[],"mappings":";;AAYA,iCAiDC;;AA7DD,iCAAwC;AAExC,uEAAkE;AAGlE,uDAAoD;AAOpD,SAAwB,cAAc,CAAC,EACrC,QAAQ,EACR,WAAW,GACS;IACpB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAExC,OAAO,CACL,iCACE,SAAS,EAAE,GAAG,2CAAmB,WAAW,EAC5C,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,aAEjD,mCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,GAAG,2CAAmB,mBAAmB,EACpD,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,YAExC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,GAC3B,EACR,IAAI,CAAC,CAAC,CAAC,CACN,gCACE,SAAS,EAAE,GAAG,2CAAmB,gBAAgB,EACjD,KAAK,EAAE;oBACL,QAAQ,EAAE,UAAU;oBACpB,MAAM,EAAE,EAAE;oBACV,UAAU,EAAE,MAAM;oBAClB,MAAM,EAAE,gBAAgB;oBACxB,YAAY,EAAE,KAAK;oBACnB,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,OAAO;iBAClB,YAEA,iCAAe,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CACjC,mCAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,GAAG,2CAAmB,kBAAkB,EACnD,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,EACjF,OAAO,EAAE,GAAG,EAAE;wBACZ,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;wBAC3B,OAAO,CAAC,KAAK,CAAC,CAAC;oBACjB,CAAC,YAEA,QAAQ,CAAC,KAAK,IATV,QAAQ,CAAC,KAAK,CAUZ,CACV,CAAC,GACE,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = EditorBlockWrapper;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const EditorBlock_1 = require("../EditorBlock");
|
|
7
|
+
const editor_context_1 = require("../editor-context");
|
|
8
|
+
function EditorBlockWrapper({ children }) {
|
|
9
|
+
const selectedBlockId = (0, editor_context_1.useSelectedBlockId)();
|
|
10
|
+
const setSelectedBlockId = (0, editor_context_1.useSetSelectedBlockId)();
|
|
11
|
+
const [mouseInside, setMouseInside] = (0, react_1.useState)(false);
|
|
12
|
+
const blockId = (0, EditorBlock_1.useCurrentBlockId)();
|
|
13
|
+
let outline;
|
|
14
|
+
if (selectedBlockId === blockId) {
|
|
15
|
+
outline = '2px solid rgba(0,121,204, 1)';
|
|
16
|
+
}
|
|
17
|
+
else if (mouseInside) {
|
|
18
|
+
outline = '2px solid rgba(0,121,204, 0.3)';
|
|
19
|
+
}
|
|
20
|
+
return ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
21
|
+
position: 'relative',
|
|
22
|
+
maxWidth: '100%',
|
|
23
|
+
outlineOffset: '-1px',
|
|
24
|
+
outline,
|
|
25
|
+
}, onMouseEnter: (event) => {
|
|
26
|
+
setMouseInside(true);
|
|
27
|
+
event.stopPropagation();
|
|
28
|
+
}, onMouseLeave: () => {
|
|
29
|
+
setMouseInside(false);
|
|
30
|
+
}, onClick: (event) => {
|
|
31
|
+
setSelectedBlockId(blockId);
|
|
32
|
+
event.stopPropagation();
|
|
33
|
+
event.preventDefault();
|
|
34
|
+
}, children: children }));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=EditorBlockWrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditorBlockWrapper.js","sourceRoot":"","sources":["../../../src/canvas/helpers/EditorBlockWrapper.tsx"],"names":[],"mappings":";;AASA,qCAqCC;;AA9CD,iCAA4D;AAE5D,gDAAmD;AACnD,sDAA8E;AAM9E,SAAwB,kBAAkB,CAAC,EAAE,QAAQ,EAA2B;IAC9E,MAAM,eAAe,GAAG,IAAA,mCAAkB,GAAE,CAAC;IAC7C,MAAM,kBAAkB,GAAG,IAAA,sCAAqB,GAAE,CAAC;IACnD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,IAAA,+BAAiB,GAAE,CAAC;IAEpC,IAAI,OAAiC,CAAC;IACtC,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;QAChC,OAAO,GAAG,8BAA8B,CAAC;IAC3C,CAAC;SAAM,IAAI,WAAW,EAAE,CAAC;QACvB,OAAO,GAAG,gCAAgC,CAAC;IAC7C,CAAC;IAED,OAAO,CACL,gCACE,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,MAAM;YAChB,aAAa,EAAE,MAAM;YACrB,OAAO;SACR,EACD,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE;YACtB,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,KAAK,CAAC,eAAe,EAAE,CAAC;QAC1B,CAAC,EACD,YAAY,EAAE,GAAG,EAAE;YACjB,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC,EACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5B,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC,YAEA,QAAQ,GACL,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TEditorBlock } from '../editor-core';
|
|
2
|
+
export type EditorChildrenChange = {
|
|
3
|
+
blockId: string;
|
|
4
|
+
block: TEditorBlock;
|
|
5
|
+
childrenIds: string[];
|
|
6
|
+
};
|
|
7
|
+
export type EditorChildrenIdsProps = {
|
|
8
|
+
childrenIds: string[] | null | undefined;
|
|
9
|
+
onChange: (val: EditorChildrenChange) => void;
|
|
10
|
+
};
|
|
11
|
+
export default function EditorChildrenIds({ childrenIds, onChange, }: EditorChildrenIdsProps): JSX.Element;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.default = EditorChildrenIds;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const react_1 = require("react");
|
|
9
|
+
const EditorBlock_1 = require("../EditorBlock");
|
|
10
|
+
const AddBlockMenu_1 = __importDefault(require("./AddBlockMenu"));
|
|
11
|
+
function generateId() {
|
|
12
|
+
return `block-${Date.now()}`;
|
|
13
|
+
}
|
|
14
|
+
function EditorChildrenIds({ childrenIds, onChange, }) {
|
|
15
|
+
const appendBlock = (block) => {
|
|
16
|
+
const blockId = generateId();
|
|
17
|
+
onChange({
|
|
18
|
+
blockId,
|
|
19
|
+
block,
|
|
20
|
+
childrenIds: [...(childrenIds || []), blockId],
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
const insertBlock = (block, index) => {
|
|
24
|
+
const blockId = generateId();
|
|
25
|
+
const nextChildrenIds = [...(childrenIds || [])];
|
|
26
|
+
nextChildrenIds.splice(index, 0, blockId);
|
|
27
|
+
onChange({
|
|
28
|
+
blockId,
|
|
29
|
+
block,
|
|
30
|
+
childrenIds: nextChildrenIds,
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
if (!childrenIds || childrenIds.length === 0) {
|
|
34
|
+
return (0, jsx_runtime_1.jsx)(AddBlockMenu_1.default, { placeholder: true, onSelect: appendBlock });
|
|
35
|
+
}
|
|
36
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [childrenIds.map((childId, index) => ((0, jsx_runtime_1.jsxs)(react_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(AddBlockMenu_1.default, { onSelect: (block) => insertBlock(block, index) }), (0, jsx_runtime_1.jsx)(EditorBlock_1.EditorBlock, { id: childId })] }, childId))), (0, jsx_runtime_1.jsx)(AddBlockMenu_1.default, { onSelect: appendBlock })] }));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=EditorChildrenIds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditorChildrenIds.js","sourceRoot":"","sources":["../../../src/canvas/helpers/EditorChildrenIds.tsx"],"names":[],"mappings":";;;;;AAsBA,oCAuCC;;AA7DD,iCAAwC;AAExC,gDAA6C;AAG7C,kEAA4C;AAQ5C,SAAS,UAAU;IACjB,OAAO,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAC/B,CAAC;AAOD,SAAwB,iBAAiB,CAAC,EACxC,WAAW,EACX,QAAQ,GACe;IACvB,MAAM,WAAW,GAAG,CAAC,KAAmB,EAAE,EAAE;QAC1C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,QAAQ,CAAC;YACP,OAAO;YACP,KAAK;YACL,WAAW,EAAE,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC;SAC/C,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,KAAmB,EAAE,KAAa,EAAE,EAAE;QACzD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAC7B,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC;QACjD,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1C,QAAQ,CAAC;YACP,OAAO;YACP,KAAK;YACL,WAAW,EAAE,eAAe;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO,uBAAC,sBAAc,IAAC,WAAW,QAAC,QAAQ,EAAE,WAAW,GAAI,CAAC;IAC/D,CAAC;IAED,OAAO,CACL,6DACG,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CACnC,wBAAC,gBAAQ,eACP,uBAAC,sBAAc,IAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAI,EAClE,uBAAC,yBAAW,IAAC,EAAE,EAAE,OAAO,GAAI,KAFf,OAAO,CAGX,CACZ,CAAC,EACF,uBAAC,sBAAc,IAAC,QAAQ,EAAE,WAAW,GAAI,IACxC,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BLOCK_TEMPLATES = void 0;
|
|
4
|
+
exports.BLOCK_TEMPLATES = [
|
|
5
|
+
{
|
|
6
|
+
label: 'Heading',
|
|
7
|
+
block: () => ({
|
|
8
|
+
type: 'Heading',
|
|
9
|
+
data: {
|
|
10
|
+
props: { text: 'Hello friend' },
|
|
11
|
+
style: {
|
|
12
|
+
padding: { top: 16, bottom: 16, left: 24, right: 24 },
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
}),
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
label: 'Text',
|
|
19
|
+
block: () => ({
|
|
20
|
+
type: 'Text',
|
|
21
|
+
data: {
|
|
22
|
+
props: { text: 'My new text block' },
|
|
23
|
+
style: {
|
|
24
|
+
padding: { top: 16, bottom: 16, left: 24, right: 24 },
|
|
25
|
+
fontWeight: 'normal',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
}),
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
label: 'Button',
|
|
32
|
+
block: () => ({
|
|
33
|
+
type: 'Button',
|
|
34
|
+
data: {
|
|
35
|
+
props: {
|
|
36
|
+
text: 'Button',
|
|
37
|
+
url: 'https://example.com',
|
|
38
|
+
},
|
|
39
|
+
style: { padding: { top: 16, bottom: 16, left: 24, right: 24 } },
|
|
40
|
+
},
|
|
41
|
+
}),
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
label: 'Image',
|
|
45
|
+
block: () => ({
|
|
46
|
+
type: 'Image',
|
|
47
|
+
data: {
|
|
48
|
+
props: {
|
|
49
|
+
url: 'https://placehold.co/600x400',
|
|
50
|
+
alt: 'Sample image',
|
|
51
|
+
contentAlignment: 'middle',
|
|
52
|
+
linkHref: null,
|
|
53
|
+
},
|
|
54
|
+
style: { padding: { top: 16, bottom: 16, left: 24, right: 24 } },
|
|
55
|
+
},
|
|
56
|
+
}),
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
label: 'Divider',
|
|
60
|
+
block: () => ({
|
|
61
|
+
type: 'Divider',
|
|
62
|
+
data: {
|
|
63
|
+
style: { padding: { top: 16, right: 0, bottom: 16, left: 0 } },
|
|
64
|
+
props: {
|
|
65
|
+
lineColor: '#CCCCCC',
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
}),
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
label: 'Spacer',
|
|
72
|
+
block: () => ({
|
|
73
|
+
type: 'Spacer',
|
|
74
|
+
data: {},
|
|
75
|
+
}),
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
label: 'Container',
|
|
79
|
+
block: () => ({
|
|
80
|
+
type: 'Container',
|
|
81
|
+
data: {
|
|
82
|
+
style: { padding: { top: 16, bottom: 16, left: 24, right: 24 } },
|
|
83
|
+
},
|
|
84
|
+
}),
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
//# sourceMappingURL=block-templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-templates.js","sourceRoot":"","sources":["../../../src/canvas/helpers/block-templates.ts"],"names":[],"mappings":";;;AAOa,QAAA,eAAe,GAAoB;IAC9C;QACE,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,IAAI,EAAE,SAAS;YACf,IAAI,EAAE;gBACJ,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;gBAC/B,KAAK,EAAE;oBACL,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;iBACtD;aACF;SACF,CAAC;KACH;IACD;QACE,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE;gBACJ,KAAK,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;gBACpC,KAAK,EAAE;oBACL,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;oBACrD,UAAU,EAAE,QAAQ;iBACrB;aACF;SACF,CAAC;KACH;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,GAAG,EAAE,qBAAqB;iBAC3B;gBACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;aACjE;SACF,CAAC;KACH;IACD;QACE,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,IAAI,EAAE,OAAO;YACb,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL,GAAG,EAAE,8BAA8B;oBACnC,GAAG,EAAE,cAAc;oBACnB,gBAAgB,EAAE,QAAQ;oBAC1B,QAAQ,EAAE,IAAI;iBACf;gBACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;aACjE;SACF,CAAC;KACH;IACD;QACE,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,IAAI,EAAE,SAAS;YACf,IAAI,EAAE;gBACJ,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;gBAC9D,KAAK,EAAE;oBACL,SAAS,EAAE,SAAS;iBACrB;aACF;SACF,CAAC;KACH;IACD;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,EAAE;SACT,CAAC;KACH;IACD;QACE,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE;gBACJ,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;aACjE;SACF,CAAC;KACH;CACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TemplateSourceFiles, TemplateVariable } from './types';
|
|
2
|
+
export declare const EDITOR_CLASS_PREFIX = "pk-editor-";
|
|
3
|
+
export interface EmailTemplateEditorProps {
|
|
4
|
+
template: TemplateSourceFiles;
|
|
5
|
+
availableVariables?: TemplateVariable[];
|
|
6
|
+
onSave: (files: TemplateSourceFiles) => Promise<void> | void;
|
|
7
|
+
onSendTest?: (files: TemplateSourceFiles, recipient: string) => Promise<void> | void;
|
|
8
|
+
onPreviewRendered?: (html: string) => void;
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function EmailTemplateEditor({ template, availableVariables, onPreviewRendered, className, }: EmailTemplateEditorProps): JSX.Element;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EDITOR_CLASS_PREFIX = void 0;
|
|
4
|
+
exports.EmailTemplateEditor = EmailTemplateEditor;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const EmailBuilderCanvas_1 = require("./canvas/EmailBuilderCanvas");
|
|
8
|
+
const insertion_target_1 = require("./insertion-target");
|
|
9
|
+
const MetadataPanel_1 = require("./metadata/MetadataPanel");
|
|
10
|
+
const PreviewDataEditor_1 = require("./preview/PreviewDataEditor");
|
|
11
|
+
const PreviewPane_1 = require("./preview/PreviewPane");
|
|
12
|
+
const VariableCatalogue_1 = require("./variables/VariableCatalogue");
|
|
13
|
+
const working_files_1 = require("./working-files");
|
|
14
|
+
exports.EDITOR_CLASS_PREFIX = 'pk-editor-';
|
|
15
|
+
function EmailTemplateEditor({ template, availableVariables, onPreviewRendered, className, }) {
|
|
16
|
+
const [workingFiles, setWorkingFiles] = (0, react_1.useState)(template);
|
|
17
|
+
const handleDocumentChange = (0, react_1.useCallback)((document) => {
|
|
18
|
+
setWorkingFiles((current) => (0, working_files_1.withDocument)(current, document));
|
|
19
|
+
}, []);
|
|
20
|
+
const handleMetadataChange = (0, react_1.useCallback)((metadata) => {
|
|
21
|
+
setWorkingFiles((current) => (0, working_files_1.withMetadata)(current, metadata));
|
|
22
|
+
}, []);
|
|
23
|
+
const handleMetadataVariablesChange = (0, react_1.useCallback)((variables) => {
|
|
24
|
+
setWorkingFiles((current) => (0, working_files_1.withMetadataVariables)(current, variables));
|
|
25
|
+
}, []);
|
|
26
|
+
const handlePreviewDataChange = (0, react_1.useCallback)((previewData) => {
|
|
27
|
+
setWorkingFiles((current) => (0, working_files_1.withPreviewData)(current, previewData));
|
|
28
|
+
}, []);
|
|
29
|
+
const rootClassName = [`${exports.EDITOR_CLASS_PREFIX}root`, className].filter(Boolean).join(' ');
|
|
30
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: rootClassName, "data-testid": `${exports.EDITOR_CLASS_PREFIX}root`, children: (0, jsx_runtime_1.jsx)(insertion_target_1.InsertionTargetProvider, { children: (0, jsx_runtime_1.jsxs)("div", { className: `${exports.EDITOR_CLASS_PREFIX}layout`, "data-testid": `${exports.EDITOR_CLASS_PREFIX}layout`, children: [(0, jsx_runtime_1.jsxs)("aside", { className: `${exports.EDITOR_CLASS_PREFIX}sidebar`, children: [(0, jsx_runtime_1.jsx)(MetadataPanel_1.MetadataPanel, { metadata: workingFiles.metadata, previewData: workingFiles.previewData, onChange: handleMetadataChange }), (0, jsx_runtime_1.jsx)(VariableCatalogue_1.VariableCatalogue, { availableVariables: availableVariables, metadataVariables: workingFiles.metadata.variables, onMetadataVariablesChange: handleMetadataVariablesChange }), (0, jsx_runtime_1.jsx)(PreviewDataEditor_1.PreviewDataEditor, { declaredVariables: workingFiles.metadata.variables, previewData: workingFiles.previewData, onChange: handlePreviewDataChange })] }), (0, jsx_runtime_1.jsxs)("div", { className: `${exports.EDITOR_CLASS_PREFIX}main`, children: [(0, jsx_runtime_1.jsx)(EmailBuilderCanvas_1.EmailBuilderCanvas, { document: workingFiles.templateJson, onChange: handleDocumentChange }), (0, jsx_runtime_1.jsx)(PreviewPane_1.PreviewPane, { files: workingFiles, onPreviewRendered: onPreviewRendered })] })] }) }) }));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=email-template-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-template-editor.js","sourceRoot":"","sources":["../src/email-template-editor.tsx"],"names":[],"mappings":";;;AAmDA,kDA6DC;;AA9GD,iCAAqD;AAErD,oEAAiE;AACjE,yDAA6D;AAC7D,4DAAyD;AACzD,mEAAgE;AAChE,uDAAoD;AAGpD,qEAAkE;AAClE,mDAKyB;AAQZ,QAAA,mBAAmB,GAAG,YAAY,CAAC;AA0BhD,SAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,kBAAkB,EAClB,iBAAiB,EACjB,SAAS,GACgB;IACzB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,gBAAQ,EAAsB,QAAQ,CAAC,CAAC;IAEhF,MAAM,oBAAoB,GAAG,IAAA,mBAAW,EAAC,CAAC,QAA8B,EAAE,EAAE;QAC1E,eAAe,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAA,4BAAY,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,oBAAoB,GAAG,IAAA,mBAAW,EAAC,CAAC,QAAgC,EAAE,EAAE;QAC5E,eAAe,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAA,4BAAY,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,6BAA6B,GAAG,IAAA,mBAAW,EAAC,CAAC,SAAmB,EAAE,EAAE;QACxE,eAAe,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAA,qCAAqB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1E,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,uBAAuB,GAAG,IAAA,mBAAW,EAAC,CAAC,WAAgC,EAAE,EAAE;QAC/E,eAAe,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAA,+BAAe,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IACtE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,CAAC,GAAG,2BAAmB,MAAM,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE1F,OAAO,CACL,gCAAK,SAAS,EAAE,aAAa,iBAAe,GAAG,2BAAmB,MAAM,YACtE,uBAAC,0CAAuB,cACtB,iCACE,SAAS,EAAE,GAAG,2BAAmB,QAAQ,iBAC5B,GAAG,2BAAmB,QAAQ,aAE3C,mCAAO,SAAS,EAAE,GAAG,2BAAmB,SAAS,aAC/C,uBAAC,6BAAa,IACZ,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAC/B,WAAW,EAAE,YAAY,CAAC,WAAW,EACrC,QAAQ,EAAE,oBAAoB,GAC9B,EACF,uBAAC,qCAAiB,IAChB,kBAAkB,EAAE,kBAAkB,EACtC,iBAAiB,EAAE,YAAY,CAAC,QAAQ,CAAC,SAAS,EAClD,yBAAyB,EAAE,6BAA6B,GACxD,EACF,uBAAC,qCAAiB,IAChB,iBAAiB,EAAE,YAAY,CAAC,QAAQ,CAAC,SAAS,EAClD,WAAW,EAAE,YAAY,CAAC,WAAW,EACrC,QAAQ,EAAE,uBAAuB,GACjC,IACI,EACR,iCAAK,SAAS,EAAE,GAAG,2BAAmB,MAAM,aAC1C,uBAAC,uCAAkB,IACjB,QAAQ,EAAE,YAAY,CAAC,YAAY,EACnC,QAAQ,EAAE,oBAAoB,GAC9B,EACF,uBAAC,yBAAW,IAAC,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,GAAI,IACtE,IACF,GACkB,GACtB,CACP,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { type TemplateSourceFiles, type TemplateVariable, type EmailBuilderDocument, } from './types';
|
|
2
|
+
export { EDITOR_CLASS_PREFIX, EmailTemplateEditor, type EmailTemplateEditorProps, } from './email-template-editor';
|
|
3
|
+
export { EmailBuilderCanvas, type EmailBuilderCanvasProps } from './canvas/EmailBuilderCanvas';
|
|
4
|
+
export { loadTemplateSource, serializeTemplateSource, TemplateSourceError } from './serialization';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TemplateSourceError = exports.serializeTemplateSource = exports.loadTemplateSource = exports.EmailBuilderCanvas = exports.EmailTemplateEditor = exports.EDITOR_CLASS_PREFIX = void 0;
|
|
4
|
+
var email_template_editor_1 = require("./email-template-editor");
|
|
5
|
+
Object.defineProperty(exports, "EDITOR_CLASS_PREFIX", { enumerable: true, get: function () { return email_template_editor_1.EDITOR_CLASS_PREFIX; } });
|
|
6
|
+
Object.defineProperty(exports, "EmailTemplateEditor", { enumerable: true, get: function () { return email_template_editor_1.EmailTemplateEditor; } });
|
|
7
|
+
var EmailBuilderCanvas_1 = require("./canvas/EmailBuilderCanvas");
|
|
8
|
+
Object.defineProperty(exports, "EmailBuilderCanvas", { enumerable: true, get: function () { return EmailBuilderCanvas_1.EmailBuilderCanvas; } });
|
|
9
|
+
var serialization_1 = require("./serialization");
|
|
10
|
+
Object.defineProperty(exports, "loadTemplateSource", { enumerable: true, get: function () { return serialization_1.loadTemplateSource; } });
|
|
11
|
+
Object.defineProperty(exports, "serializeTemplateSource", { enumerable: true, get: function () { return serialization_1.serializeTemplateSource; } });
|
|
12
|
+
Object.defineProperty(exports, "TemplateSourceError", { enumerable: true, get: function () { return serialization_1.TemplateSourceError; } });
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAKA,iEAIiC;AAH/B,4HAAA,mBAAmB,OAAA;AACnB,4HAAA,mBAAmB,OAAA;AAGrB,kEAA+F;AAAtF,wHAAA,kBAAkB,OAAA;AAC3B,iDAAmG;AAA1F,mHAAA,kBAAkB,OAAA;AAAE,wHAAA,uBAAuB,OAAA;AAAE,oHAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface InsertionTarget {
|
|
3
|
+
insert: (text: string) => void;
|
|
4
|
+
label: string;
|
|
5
|
+
}
|
|
6
|
+
interface InsertionTargetContextValue {
|
|
7
|
+
target: InsertionTarget | null;
|
|
8
|
+
setTarget: React.Dispatch<React.SetStateAction<InsertionTarget | null>>;
|
|
9
|
+
}
|
|
10
|
+
export declare function InsertionTargetProvider({ children }: {
|
|
11
|
+
children: React.ReactNode;
|
|
12
|
+
}): JSX.Element;
|
|
13
|
+
export declare function useInsertionTarget(): InsertionTargetContextValue;
|
|
14
|
+
export declare function useRegisterInsertionTarget(label: string, insert: (text: string) => void): {
|
|
15
|
+
onFocus: () => void;
|
|
16
|
+
onBlur: () => void;
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InsertionTargetProvider = InsertionTargetProvider;
|
|
4
|
+
exports.useInsertionTarget = useInsertionTarget;
|
|
5
|
+
exports.useRegisterInsertionTarget = useRegisterInsertionTarget;
|
|
6
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
const react_1 = require("react");
|
|
8
|
+
const InsertionTargetContext = (0, react_1.createContext)(null);
|
|
9
|
+
function InsertionTargetProvider({ children }) {
|
|
10
|
+
const [target, setTarget] = (0, react_1.useState)(null);
|
|
11
|
+
const value = (0, react_1.useMemo)(() => ({ target, setTarget }), [target]);
|
|
12
|
+
return ((0, jsx_runtime_1.jsx)(InsertionTargetContext.Provider, { value: value, children: children }));
|
|
13
|
+
}
|
|
14
|
+
function useInsertionTarget() {
|
|
15
|
+
const ctx = (0, react_1.useContext)(InsertionTargetContext);
|
|
16
|
+
if (!ctx) {
|
|
17
|
+
throw new Error('useInsertionTarget must be used within InsertionTargetProvider');
|
|
18
|
+
}
|
|
19
|
+
return ctx;
|
|
20
|
+
}
|
|
21
|
+
function useRegisterInsertionTarget(label, insert) {
|
|
22
|
+
const { setTarget } = useInsertionTarget();
|
|
23
|
+
const insertRef = (0, react_1.useRef)(insert);
|
|
24
|
+
insertRef.current = insert;
|
|
25
|
+
const registrationRef = (0, react_1.useRef)(null);
|
|
26
|
+
const stableInsert = (0, react_1.useCallback)((text) => {
|
|
27
|
+
insertRef.current(text);
|
|
28
|
+
}, []);
|
|
29
|
+
const onFocus = (0, react_1.useCallback)(() => {
|
|
30
|
+
const next = { label, insert: stableInsert };
|
|
31
|
+
registrationRef.current = next;
|
|
32
|
+
setTarget(next);
|
|
33
|
+
}, [label, setTarget, stableInsert]);
|
|
34
|
+
const onBlur = (0, react_1.useCallback)(() => {
|
|
35
|
+
const registration = registrationRef.current;
|
|
36
|
+
registrationRef.current = null;
|
|
37
|
+
setTarget((current) => (current === registration ? null : current));
|
|
38
|
+
}, [setTarget]);
|
|
39
|
+
return { onFocus, onBlur };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=insertion-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insertion-target.js","sourceRoot":"","sources":["../src/insertion-target.tsx"],"names":[],"mappings":";;AAgBA,0DAMC;AAED,gDAMC;AAMD,gEAgCC;;AApED,iCAAiG;AAcjG,MAAM,sBAAsB,GAAG,IAAA,qBAAa,EAAqC,IAAI,CAAC,CAAC;AAEvF,SAAgB,uBAAuB,CAAC,EAAE,QAAQ,EAAiC;IACjF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAyB,IAAI,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,OAAO,CACL,uBAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAmC,CAC5F,CAAC;AACJ,CAAC;AAED,SAAgB,kBAAkB;IAChC,MAAM,GAAG,GAAG,IAAA,kBAAU,EAAC,sBAAsB,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAMD,SAAgB,0BAA0B,CACxC,KAAa,EACb,MAA8B;IAK9B,MAAM,EAAE,SAAS,EAAE,GAAG,kBAAkB,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAA,cAAM,EAAC,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC3B,MAAM,eAAe,GAAG,IAAA,cAAM,EAA2D,IAAI,CAAC,CAAC;IAE/F,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,CAAC,IAAY,EAAE,EAAE;QAChD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAC/B,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QAC7C,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QAC/B,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IAErC,MAAM,MAAM,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAC9B,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QAI/B,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TemplatePreviewData, TemplateSourceMetadata } from '@singleton-sd/post-kit-types';
|
|
2
|
+
export interface MetadataPanelProps {
|
|
3
|
+
metadata: TemplateSourceMetadata;
|
|
4
|
+
previewData: TemplatePreviewData;
|
|
5
|
+
onChange: (metadata: TemplateSourceMetadata) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function MetadataPanel({ metadata, previewData, onChange, }: MetadataPanelProps): JSX.Element;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MetadataPanel = MetadataPanel;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const email_template_editor_1 = require("../email-template-editor");
|
|
7
|
+
const insertion_target_1 = require("../insertion-target");
|
|
8
|
+
const insert_at_cursor_1 = require("./insert-at-cursor");
|
|
9
|
+
const subject_preview_1 = require("./subject-preview");
|
|
10
|
+
const template_key_1 = require("./template-key");
|
|
11
|
+
function MetadataPanel({ metadata, previewData, onChange, }) {
|
|
12
|
+
const [keyError, setKeyError] = (0, react_1.useState)(null);
|
|
13
|
+
const subjectRef = (0, react_1.useRef)(null);
|
|
14
|
+
const patch = (0, react_1.useCallback)((partial) => {
|
|
15
|
+
onChange({ ...metadata, ...partial });
|
|
16
|
+
}, [metadata, onChange]);
|
|
17
|
+
const handleKeyChange = (0, react_1.useCallback)((event) => {
|
|
18
|
+
const next = event.target.value;
|
|
19
|
+
const error = (0, template_key_1.templateKeyInputError)(next);
|
|
20
|
+
if (!(0, template_key_1.isAcceptableTemplateKeyInput)(next)) {
|
|
21
|
+
setKeyError(error);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
setKeyError(null);
|
|
25
|
+
patch({ key: next });
|
|
26
|
+
}, [patch]);
|
|
27
|
+
const insertIntoSubject = (0, react_1.useCallback)((text) => {
|
|
28
|
+
const el = subjectRef.current;
|
|
29
|
+
const start = el?.selectionStart ?? metadata.subject.length;
|
|
30
|
+
const end = el?.selectionEnd ?? start;
|
|
31
|
+
const { value, caret } = (0, insert_at_cursor_1.insertAtCursor)(metadata.subject, start, end, text);
|
|
32
|
+
patch({ subject: value });
|
|
33
|
+
if (typeof requestAnimationFrame === 'function') {
|
|
34
|
+
requestAnimationFrame(() => {
|
|
35
|
+
const input = subjectRef.current;
|
|
36
|
+
if (input) {
|
|
37
|
+
input.focus();
|
|
38
|
+
input.setSelectionRange(caret, caret);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}, [metadata.subject, patch]);
|
|
43
|
+
const subjectFocus = (0, insertion_target_1.useRegisterInsertionTarget)('subject field', insertIntoSubject);
|
|
44
|
+
const subjectPreview = (0, subject_preview_1.previewSubject)(metadata.subject, previewData);
|
|
45
|
+
const p = email_template_editor_1.EDITOR_CLASS_PREFIX;
|
|
46
|
+
return ((0, jsx_runtime_1.jsxs)("section", { className: `${p}metadata`, "data-testid": `${p}metadata`, children: [(0, jsx_runtime_1.jsx)("h2", { className: `${p}metadata-heading`, children: "Template metadata" }), (0, jsx_runtime_1.jsxs)("div", { className: `${p}metadata-field`, children: [(0, jsx_runtime_1.jsx)("label", { className: `${p}metadata-label`, htmlFor: `${p}meta-key`, children: "Key" }), (0, jsx_runtime_1.jsx)("input", { id: `${p}meta-key`, className: `${p}metadata-input`, type: "text", value: metadata.key, onChange: handleKeyChange, autoComplete: "off", spellCheck: false, "data-testid": `${p}meta-key` }), keyError ? ((0, jsx_runtime_1.jsx)("p", { className: `${p}metadata-error`, "data-testid": `${p}meta-key-error`, role: "status", children: keyError })) : null] }), (0, jsx_runtime_1.jsxs)("div", { className: `${p}metadata-field`, children: [(0, jsx_runtime_1.jsx)("label", { className: `${p}metadata-label`, htmlFor: `${p}meta-name`, children: "Name" }), (0, jsx_runtime_1.jsx)("input", { id: `${p}meta-name`, className: `${p}metadata-input`, type: "text", value: metadata.name, onChange: (event) => patch({ name: event.target.value }), "data-testid": `${p}meta-name` })] }), (0, jsx_runtime_1.jsxs)("div", { className: `${p}metadata-field`, children: [(0, jsx_runtime_1.jsx)("label", { className: `${p}metadata-label`, htmlFor: `${p}meta-description`, children: "Description" }), (0, jsx_runtime_1.jsx)("textarea", { id: `${p}meta-description`, className: `${p}metadata-textarea`, value: metadata.description ?? '', onChange: (event) => {
|
|
47
|
+
const description = event.target.value;
|
|
48
|
+
if (description === '') {
|
|
49
|
+
const { description: _removed, ...rest } = metadata;
|
|
50
|
+
onChange(rest);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
patch({ description });
|
|
54
|
+
}, rows: 3, "data-testid": `${p}meta-description` })] }), (0, jsx_runtime_1.jsxs)("div", { className: `${p}metadata-field`, children: [(0, jsx_runtime_1.jsx)("label", { className: `${p}metadata-label`, htmlFor: `${p}meta-subject`, children: "Subject" }), (0, jsx_runtime_1.jsx)("input", { id: `${p}meta-subject`, ref: subjectRef, className: `${p}metadata-input`, type: "text", value: metadata.subject, onChange: (event) => patch({ subject: event.target.value }), onFocus: subjectFocus.onFocus, onBlur: subjectFocus.onBlur, "data-testid": `${p}meta-subject` }), (0, jsx_runtime_1.jsxs)("p", { className: `${p}metadata-subject-preview`, "data-testid": `${p}meta-subject-preview`, children: ["Preview: ", subjectPreview] })] }), (0, jsx_runtime_1.jsxs)("div", { className: `${p}metadata-field`, children: [(0, jsx_runtime_1.jsx)("span", { className: `${p}metadata-label`, children: "Schema version" }), (0, jsx_runtime_1.jsx)("span", { className: `${p}metadata-readonly`, "data-testid": `${p}meta-schema-version`, children: metadata.schemaVersion })] })] }));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=MetadataPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetadataPanel.js","sourceRoot":"","sources":["../../src/metadata/MetadataPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.insertAtCursor = insertAtCursor;
|
|
4
|
+
exports.variablePlaceholder = variablePlaceholder;
|
|
5
|
+
function insertAtCursor(value, selectionStart, selectionEnd, insertion) {
|
|
6
|
+
const start = clampIndex(selectionStart, value.length);
|
|
7
|
+
const end = clampIndex(selectionEnd, value.length);
|
|
8
|
+
const from = Math.min(start, end);
|
|
9
|
+
const to = Math.max(start, end);
|
|
10
|
+
const next = value.slice(0, from) + insertion + value.slice(to);
|
|
11
|
+
return { value: next, caret: from + insertion.length };
|
|
12
|
+
}
|
|
13
|
+
function clampIndex(index, length) {
|
|
14
|
+
if (!Number.isFinite(index)) {
|
|
15
|
+
return length;
|
|
16
|
+
}
|
|
17
|
+
return Math.max(0, Math.min(Math.trunc(index), length));
|
|
18
|
+
}
|
|
19
|
+
function variablePlaceholder(name) {
|
|
20
|
+
return `{{${name}}}`;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=insert-at-cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert-at-cursor.js","sourceRoot":"","sources":["../../src/metadata/insert-at-cursor.ts"],"names":[],"mappings":";;AAIA,wCAYC;AAUD,kDAEC;AAxBD,SAAgB,cAAc,CAC5B,KAAa,EACb,cAAsB,EACtB,YAAoB,EACpB,SAAiB;IAEjB,MAAM,KAAK,GAAG,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,UAAU,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,MAAc;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC1D,CAAC;AAGD,SAAgB,mBAAmB,CAAC,IAAY;IAC9C,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.previewSubject = previewSubject;
|
|
4
|
+
function previewSubject(subject, previewData) {
|
|
5
|
+
return subject.replace(/\{\{\s*([a-zA-Z0-9_.-]+)\s*\}\}/g, (match, name) => {
|
|
6
|
+
if (Object.prototype.hasOwnProperty.call(previewData, name)) {
|
|
7
|
+
return previewData[name] ?? match;
|
|
8
|
+
}
|
|
9
|
+
return match;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=subject-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject-preview.js","sourceRoot":"","sources":["../../src/metadata/subject-preview.ts"],"names":[],"mappings":";;AAOA,wCAOC;AAPD,SAAgB,cAAc,CAAC,OAAe,EAAE,WAAgC;IAC9E,OAAO,OAAO,CAAC,OAAO,CAAC,kCAAkC,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QACjF,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC;YAC5D,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;QACpC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
|