@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.
Files changed (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +105 -0
  3. package/dist/canvas/EditorBlock.d.ts +6 -0
  4. package/dist/canvas/EditorBlock.js +25 -0
  5. package/dist/canvas/EditorBlock.js.map +1 -0
  6. package/dist/canvas/EmailBuilderCanvas.d.ts +7 -0
  7. package/dist/canvas/EmailBuilderCanvas.js +15 -0
  8. package/dist/canvas/EmailBuilderCanvas.js.map +1 -0
  9. package/dist/canvas/blocks/ColumnsContainerEditor.d.ts +2 -0
  10. package/dist/canvas/blocks/ColumnsContainerEditor.js +47 -0
  11. package/dist/canvas/blocks/ColumnsContainerEditor.js.map +1 -0
  12. package/dist/canvas/blocks/ColumnsContainerPropsSchema.d.ts +183 -0
  13. package/dist/canvas/blocks/ColumnsContainerPropsSchema.js +19 -0
  14. package/dist/canvas/blocks/ColumnsContainerPropsSchema.js.map +1 -0
  15. package/dist/canvas/blocks/ContainerEditor.d.ts +2 -0
  16. package/dist/canvas/blocks/ContainerEditor.js +39 -0
  17. package/dist/canvas/blocks/ContainerEditor.js.map +1 -0
  18. package/dist/canvas/blocks/ContainerPropsSchema.d.ts +83 -0
  19. package/dist/canvas/blocks/ContainerPropsSchema.js +16 -0
  20. package/dist/canvas/blocks/ContainerPropsSchema.js.map +1 -0
  21. package/dist/canvas/blocks/EmailLayoutEditor.d.ts +2 -0
  22. package/dist/canvas/blocks/EmailLayoutEditor.js +80 -0
  23. package/dist/canvas/blocks/EmailLayoutEditor.js.map +1 -0
  24. package/dist/canvas/blocks/EmailLayoutPropsSchema.d.ts +28 -0
  25. package/dist/canvas/blocks/EmailLayoutPropsSchema.js +33 -0
  26. package/dist/canvas/blocks/EmailLayoutPropsSchema.js.map +1 -0
  27. package/dist/canvas/editor-context.d.ts +22 -0
  28. package/dist/canvas/editor-context.js +55 -0
  29. package/dist/canvas/editor-context.js.map +1 -0
  30. package/dist/canvas/editor-core.d.ts +2910 -0
  31. package/dist/canvas/editor-core.js +87 -0
  32. package/dist/canvas/editor-core.js.map +1 -0
  33. package/dist/canvas/helpers/AddBlockMenu.d.ts +7 -0
  34. package/dist/canvas/helpers/AddBlockMenu.js +23 -0
  35. package/dist/canvas/helpers/AddBlockMenu.js.map +1 -0
  36. package/dist/canvas/helpers/EditorBlockWrapper.d.ts +5 -0
  37. package/dist/canvas/helpers/EditorBlockWrapper.js +36 -0
  38. package/dist/canvas/helpers/EditorBlockWrapper.js.map +1 -0
  39. package/dist/canvas/helpers/EditorChildrenIds.d.ts +11 -0
  40. package/dist/canvas/helpers/EditorChildrenIds.js +38 -0
  41. package/dist/canvas/helpers/EditorChildrenIds.js.map +1 -0
  42. package/dist/canvas/helpers/block-templates.d.ts +7 -0
  43. package/dist/canvas/helpers/block-templates.js +87 -0
  44. package/dist/canvas/helpers/block-templates.js.map +1 -0
  45. package/dist/email-template-editor.d.ts +11 -0
  46. package/dist/email-template-editor.js +32 -0
  47. package/dist/email-template-editor.js.map +1 -0
  48. package/dist/index.d.ts +4 -0
  49. package/dist/index.js +13 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/insertion-target.d.ts +18 -0
  52. package/dist/insertion-target.js +41 -0
  53. package/dist/insertion-target.js.map +1 -0
  54. package/dist/metadata/MetadataPanel.d.ts +7 -0
  55. package/dist/metadata/MetadataPanel.js +56 -0
  56. package/dist/metadata/MetadataPanel.js.map +1 -0
  57. package/dist/metadata/insert-at-cursor.d.ts +5 -0
  58. package/dist/metadata/insert-at-cursor.js +22 -0
  59. package/dist/metadata/insert-at-cursor.js.map +1 -0
  60. package/dist/metadata/subject-preview.d.ts +2 -0
  61. package/dist/metadata/subject-preview.js +12 -0
  62. package/dist/metadata/subject-preview.js.map +1 -0
  63. package/dist/metadata/template-key.d.ts +4 -0
  64. package/dist/metadata/template-key.js +21 -0
  65. package/dist/metadata/template-key.js.map +1 -0
  66. package/dist/preview/PreviewDataEditor.d.ts +7 -0
  67. package/dist/preview/PreviewDataEditor.js +37 -0
  68. package/dist/preview/PreviewDataEditor.js.map +1 -0
  69. package/dist/preview/PreviewPane.d.ts +7 -0
  70. package/dist/preview/PreviewPane.js +39 -0
  71. package/dist/preview/PreviewPane.js.map +1 -0
  72. package/dist/preview/preview-frame.d.ts +8 -0
  73. package/dist/preview/preview-frame.js +41 -0
  74. package/dist/preview/preview-frame.js.map +1 -0
  75. package/dist/preview/preview-rows.d.ts +10 -0
  76. package/dist/preview/preview-rows.js +54 -0
  77. package/dist/preview/preview-rows.js.map +1 -0
  78. package/dist/preview/render-template-preview.d.ts +10 -0
  79. package/dist/preview/render-template-preview.js +27 -0
  80. package/dist/preview/render-template-preview.js.map +1 -0
  81. package/dist/serialization.d.ts +15 -0
  82. package/dist/serialization.js +128 -0
  83. package/dist/serialization.js.map +1 -0
  84. package/dist/types.d.ts +14 -0
  85. package/dist/types.js +3 -0
  86. package/dist/types.js.map +1 -0
  87. package/dist/variables/VariableCatalogue.d.ts +7 -0
  88. package/dist/variables/VariableCatalogue.js +77 -0
  89. package/dist/variables/VariableCatalogue.js.map +1 -0
  90. package/dist/variables/clipboard.d.ts +3 -0
  91. package/dist/variables/clipboard.js +16 -0
  92. package/dist/variables/clipboard.js.map +1 -0
  93. package/dist/variables/copy-feedback.d.ts +7 -0
  94. package/dist/variables/copy-feedback.js +14 -0
  95. package/dist/variables/copy-feedback.js.map +1 -0
  96. package/dist/variables/resolve-catalogue.d.ts +2 -0
  97. package/dist/variables/resolve-catalogue.js +10 -0
  98. package/dist/variables/resolve-catalogue.js.map +1 -0
  99. package/dist/working-files.d.ts +6 -0
  100. package/dist/working-files.js +25 -0
  101. package/dist/working-files.js.map +1 -0
  102. 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,5 @@
1
+ type EditorBlockWrapperProps = {
2
+ children: JSX.Element;
3
+ };
4
+ export default function EditorBlockWrapper({ children }: EditorBlockWrapperProps): JSX.Element;
5
+ export {};
@@ -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,7 @@
1
+ import type { TEditorBlock } from '../editor-core';
2
+ type BlockTemplate = {
3
+ label: string;
4
+ block: () => TEditorBlock;
5
+ };
6
+ export declare const BLOCK_TEMPLATES: BlockTemplate[];
7
+ export {};
@@ -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"}
@@ -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,5 @@
1
+ export declare function insertAtCursor(value: string, selectionStart: number, selectionEnd: number, insertion: string): {
2
+ value: string;
3
+ caret: number;
4
+ };
5
+ export declare function variablePlaceholder(name: string): string;
@@ -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,2 @@
1
+ import type { TemplatePreviewData } from '@singleton-sd/post-kit-types';
2
+ export declare function previewSubject(subject: string, previewData: TemplatePreviewData): string;
@@ -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"}