@singleton-sd/post-kit-editor 0.5.0 → 0.6.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 (39) hide show
  1. package/README.md +16 -0
  2. package/dist/EditorErrorBoundary.d.ts +15 -0
  3. package/dist/EditorErrorBoundary.js +32 -0
  4. package/dist/EditorErrorBoundary.js.map +1 -0
  5. package/dist/canvas/EmailBuilderCanvas.js +2 -2
  6. package/dist/canvas/EmailBuilderCanvas.js.map +1 -1
  7. package/dist/editor-shell-states.d.ts +8 -0
  8. package/dist/editor-shell-states.js +15 -0
  9. package/dist/editor-shell-states.js.map +1 -0
  10. package/dist/email-template-editor.d.ts +5 -1
  11. package/dist/email-template-editor.js +43 -7
  12. package/dist/email-template-editor.js.map +1 -1
  13. package/dist/index.d.ts +1 -0
  14. package/dist/index.js +4 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/metadata/MetadataPanel.d.ts +3 -1
  17. package/dist/metadata/MetadataPanel.js +15 -3
  18. package/dist/metadata/MetadataPanel.js.map +1 -1
  19. package/dist/preview/PreviewDataEditor.d.ts +3 -1
  20. package/dist/preview/PreviewDataEditor.js +9 -2
  21. package/dist/preview/PreviewDataEditor.js.map +1 -1
  22. package/dist/preview/PreviewPane.d.ts +3 -1
  23. package/dist/preview/PreviewPane.js +5 -1
  24. package/dist/preview/PreviewPane.js.map +1 -1
  25. package/dist/save-send/SaveSendBar.d.ts +3 -1
  26. package/dist/save-send/SaveSendBar.js +8 -3
  27. package/dist/save-send/SaveSendBar.js.map +1 -1
  28. package/dist/validation/ValidationSummary.d.ts +5 -0
  29. package/dist/validation/ValidationSummary.js +29 -0
  30. package/dist/validation/ValidationSummary.js.map +1 -0
  31. package/dist/validation/extract-placeholders.d.ts +2 -0
  32. package/dist/validation/extract-placeholders.js +49 -0
  33. package/dist/validation/extract-placeholders.js.map +1 -0
  34. package/dist/validation/validate.d.ts +17 -0
  35. package/dist/validation/validate.js +154 -0
  36. package/dist/validation/validate.js.map +1 -0
  37. package/dist/variables/VariableCatalogue.js +1 -1
  38. package/dist/variables/VariableCatalogue.js.map +1 -1
  39. package/package.json +1 -1
package/README.md CHANGED
@@ -88,6 +88,22 @@ trusted server (typically `@singleton-sd/post-kit-client` server-side).
88
88
  Optional `onDirtyChange` fires when working state diverges from the seeded
89
89
  `template` prop and resets after a successful save.
90
90
 
91
+ ## Validation and accessibility
92
+
93
+ `validateTemplate(files)` (also exported) checks required metadata, key charset,
94
+ undeclared / unused variables, preview coverage, and optional `render-failed`
95
+ from the preview pane (passed through so the compiler is not invoked twice).
96
+ Error-severity issues disable Save and Send-test; warnings never block.
97
+
98
+ Optional props:
99
+
100
+ - `onValidationChange` — current `ValidationIssue[]` whenever it changes
101
+ - `loading` — non-interactive loading shell while the host fetches files
102
+ - `loadError` — non-interactive error shell with the host’s message
103
+
104
+ Inline field errors use `aria-describedby`. The validation summary is an
105
+ `aria-live` region; each entry focuses the responsible control.
106
+
91
107
  ## Preview data (synthetic only)
92
108
 
93
109
  `preview.json` is edited in the preview-data panel and used to render the
@@ -0,0 +1,15 @@
1
+ import { Component, type ErrorInfo, type ReactNode } from 'react';
2
+ export interface EditorErrorBoundaryProps {
3
+ children: ReactNode;
4
+ }
5
+ interface EditorErrorBoundaryState {
6
+ error: Error | null;
7
+ }
8
+ export declare class EditorErrorBoundary extends Component<EditorErrorBoundaryProps, EditorErrorBoundaryState> {
9
+ state: EditorErrorBoundaryState;
10
+ static getDerivedStateFromError(error: Error): EditorErrorBoundaryState;
11
+ componentDidCatch(error: Error, info: ErrorInfo): void;
12
+ private handleRetry;
13
+ render(): ReactNode;
14
+ }
15
+ export {};
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EditorErrorBoundary = void 0;
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
+ class EditorErrorBoundary extends react_1.Component {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.state = { error: null };
11
+ this.handleRetry = () => {
12
+ this.setState({ error: null });
13
+ };
14
+ }
15
+ static getDerivedStateFromError(error) {
16
+ return { error };
17
+ }
18
+ componentDidCatch(error, info) {
19
+ if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {
20
+ console.error('post-kit-editor render failure', error, info.componentStack);
21
+ }
22
+ }
23
+ render() {
24
+ const p = email_template_editor_1.EDITOR_CLASS_PREFIX;
25
+ if (this.state.error) {
26
+ return ((0, jsx_runtime_1.jsxs)("div", { className: `${p}fatal-error`, "data-testid": `${p}fatal-error`, role: "alert", children: [(0, jsx_runtime_1.jsx)("h2", { className: `${p}fatal-error-heading`, children: "Editor failed to render" }), (0, jsx_runtime_1.jsx)("p", { className: `${p}fatal-error-message`, children: this.state.error.message }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: `${p}fatal-error-retry`, "data-testid": `${p}fatal-error-retry`, onClick: this.handleRetry, children: "Retry" })] }));
27
+ }
28
+ return this.props.children;
29
+ }
30
+ }
31
+ exports.EditorErrorBoundary = EditorErrorBoundary;
32
+ //# sourceMappingURL=EditorErrorBoundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditorErrorBoundary.js","sourceRoot":"","sources":["../src/EditorErrorBoundary.tsx"],"names":[],"mappings":";;;;AAAA,iCAAyE;AAEzE,mEAA8D;AAc9D,MAAa,mBAAoB,SAAQ,iBAGxC;IAHD;;QAIE,UAAK,GAA6B,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAa1C,gBAAW,GAAG,GAAS,EAAE;YAC/B,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC;IAsBJ,CAAC;IAnCC,MAAM,CAAC,wBAAwB,CAAC,KAAY;QAC1C,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,iBAAiB,CAAC,KAAY,EAAE,IAAe;QAE7C,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YACtE,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAMD,MAAM;QACJ,MAAM,CAAC,GAAG,2CAAmB,CAAC;QAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CACL,iCAAK,SAAS,EAAE,GAAG,CAAC,aAAa,iBAAe,GAAG,CAAC,aAAa,EAAE,IAAI,EAAC,OAAO,aAC7E,+BAAI,SAAS,EAAE,GAAG,CAAC,qBAAqB,wCAA8B,EACtE,8BAAG,SAAS,EAAE,GAAG,CAAC,qBAAqB,YAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAK,EACvE,mCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,GAAG,CAAC,mBAAmB,iBACrB,GAAG,CAAC,mBAAmB,EACpC,OAAO,EAAE,IAAI,CAAC,WAAW,sBAGlB,IACL,CACP,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;CACF;AAzCD,kDAyCC"}
@@ -8,8 +8,8 @@ const EditorBlock_1 = require("./EditorBlock");
8
8
  const email_builder_1 = require("@usewaypoint/email-builder");
9
9
  function EmailBuilderCanvas({ document, onChange, readOnly = false, }) {
10
10
  if (readOnly) {
11
- return ((0, jsx_runtime_1.jsx)("div", { className: `${email_template_editor_1.EDITOR_CLASS_PREFIX}canvas`, "data-testid": `${email_template_editor_1.EDITOR_CLASS_PREFIX}canvas`, children: (0, jsx_runtime_1.jsx)(email_builder_1.Reader, { document: document, rootBlockId: "root" }) }));
11
+ return ((0, jsx_runtime_1.jsx)("div", { id: `${email_template_editor_1.EDITOR_CLASS_PREFIX}canvas`, className: `${email_template_editor_1.EDITOR_CLASS_PREFIX}canvas`, "data-testid": `${email_template_editor_1.EDITOR_CLASS_PREFIX}canvas`, role: "region", tabIndex: -1, "aria-label": "Email document canvas", children: (0, jsx_runtime_1.jsx)(email_builder_1.Reader, { document: document, rootBlockId: "root" }) }));
12
12
  }
13
- return ((0, jsx_runtime_1.jsx)(editor_context_1.CanvasEditorProvider, { document: document, onChange: onChange, children: (0, jsx_runtime_1.jsx)("div", { className: `${email_template_editor_1.EDITOR_CLASS_PREFIX}canvas`, "data-testid": `${email_template_editor_1.EDITOR_CLASS_PREFIX}canvas`, children: (0, jsx_runtime_1.jsx)(EditorBlock_1.EditorBlock, { id: "root" }) }) }));
13
+ return ((0, jsx_runtime_1.jsx)(editor_context_1.CanvasEditorProvider, { document: document, onChange: onChange, children: (0, jsx_runtime_1.jsx)("div", { id: `${email_template_editor_1.EDITOR_CLASS_PREFIX}canvas`, className: `${email_template_editor_1.EDITOR_CLASS_PREFIX}canvas`, "data-testid": `${email_template_editor_1.EDITOR_CLASS_PREFIX}canvas`, role: "region", tabIndex: -1, "aria-label": "Email document canvas", children: (0, jsx_runtime_1.jsx)(EditorBlock_1.EditorBlock, { id: "root" }) }) }));
14
14
  }
15
15
  //# sourceMappingURL=EmailBuilderCanvas.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmailBuilderCanvas.js","sourceRoot":"","sources":["../../src/canvas/EmailBuilderCanvas.tsx"],"names":[],"mappings":";;AAcA,gDAoBC;;AA/BD,oEAA+D;AAC/D,qDAAwD;AACxD,+CAA4C;AAC5C,8DAAoD;AAQpD,SAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,QAAQ,GAAG,KAAK,GACQ;IACxB,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CACL,gCAAK,SAAS,EAAE,GAAG,2CAAmB,QAAQ,iBAAe,GAAG,2CAAmB,QAAQ,YACzF,uBAAC,sBAAM,IAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAC,MAAM,GAAG,GAC7C,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,uBAAC,qCAAoB,IAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,YAC1D,gCAAK,SAAS,EAAE,GAAG,2CAAmB,QAAQ,iBAAe,GAAG,2CAAmB,QAAQ,YACzF,uBAAC,yBAAW,IAAC,EAAE,EAAC,MAAM,GAAG,GACrB,GACe,CACxB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"EmailBuilderCanvas.js","sourceRoot":"","sources":["../../src/canvas/EmailBuilderCanvas.tsx"],"names":[],"mappings":";;AAcA,gDAkCC;;AA7CD,oEAA+D;AAC/D,qDAAwD;AACxD,+CAA4C;AAC5C,8DAAoD;AAQpD,SAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,QAAQ,GAAG,KAAK,GACQ;IACxB,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CACL,gCACE,EAAE,EAAE,GAAG,2CAAmB,QAAQ,EAClC,SAAS,EAAE,GAAG,2CAAmB,QAAQ,iBAC5B,GAAG,2CAAmB,QAAQ,EAC3C,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,CAAC,gBACD,uBAAuB,YAElC,uBAAC,sBAAM,IAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAC,MAAM,GAAG,GAC7C,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,uBAAC,qCAAoB,IAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,YAC1D,gCACE,EAAE,EAAE,GAAG,2CAAmB,QAAQ,EAClC,SAAS,EAAE,GAAG,2CAAmB,QAAQ,iBAC5B,GAAG,2CAAmB,QAAQ,EAC3C,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,CAAC,gBACD,uBAAuB,YAElC,uBAAC,yBAAW,IAAC,EAAE,EAAC,MAAM,GAAG,GACrB,GACe,CACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface EditorLoadingStateProps {
2
+ message?: string;
3
+ }
4
+ export declare function EditorLoadingState({ message, }: EditorLoadingStateProps): JSX.Element;
5
+ export interface EditorLoadErrorStateProps {
6
+ message: string;
7
+ }
8
+ export declare function EditorLoadErrorState({ message }: EditorLoadErrorStateProps): JSX.Element;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EditorLoadingState = EditorLoadingState;
4
+ exports.EditorLoadErrorState = EditorLoadErrorState;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const email_template_editor_1 = require("./email-template-editor");
7
+ function EditorLoadingState({ message = 'Loading template…', }) {
8
+ const p = email_template_editor_1.EDITOR_CLASS_PREFIX;
9
+ return ((0, jsx_runtime_1.jsx)("div", { className: `${p}loading`, "data-testid": `${p}loading`, role: "status", "aria-busy": "true", "aria-live": "polite", children: (0, jsx_runtime_1.jsx)("p", { className: `${p}loading-message`, children: message }) }));
10
+ }
11
+ function EditorLoadErrorState({ message }) {
12
+ const p = email_template_editor_1.EDITOR_CLASS_PREFIX;
13
+ return ((0, jsx_runtime_1.jsxs)("div", { className: `${p}load-error`, "data-testid": `${p}load-error`, role: "alert", children: [(0, jsx_runtime_1.jsx)("h2", { className: `${p}load-error-heading`, children: "Could not load template" }), (0, jsx_runtime_1.jsx)("p", { className: `${p}load-error-message`, children: message })] }));
14
+ }
15
+ //# sourceMappingURL=editor-shell-states.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-shell-states.js","sourceRoot":"","sources":["../src/editor-shell-states.tsx"],"names":[],"mappings":";;AAUA,gDAeC;AAOD,oDAQC;;AAtCD,mEAA8D;AAQ9D,SAAgB,kBAAkB,CAAC,EACjC,OAAO,GAAG,mBAAmB,GACL;IACxB,MAAM,CAAC,GAAG,2CAAmB,CAAC;IAC9B,OAAO,CACL,gCACE,SAAS,EAAE,GAAG,CAAC,SAAS,iBACX,GAAG,CAAC,SAAS,EAC1B,IAAI,EAAC,QAAQ,eACH,MAAM,eACN,QAAQ,YAElB,8BAAG,SAAS,EAAE,GAAG,CAAC,iBAAiB,YAAG,OAAO,GAAK,GAC9C,CACP,CAAC;AACJ,CAAC;AAOD,SAAgB,oBAAoB,CAAC,EAAE,OAAO,EAA6B;IACzE,MAAM,CAAC,GAAG,2CAAmB,CAAC;IAC9B,OAAO,CACL,iCAAK,SAAS,EAAE,GAAG,CAAC,YAAY,iBAAe,GAAG,CAAC,YAAY,EAAE,IAAI,EAAC,OAAO,aAC3E,+BAAI,SAAS,EAAE,GAAG,CAAC,oBAAoB,wCAA8B,EACrE,8BAAG,SAAS,EAAE,GAAG,CAAC,oBAAoB,YAAG,OAAO,GAAK,IACjD,CACP,CAAC;AACJ,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { type SaveResult, type SendTestResult, type SerializedTemplateSource } from './save-send/types';
2
2
  import type { TemplateSourceFiles, TemplateVariable } from './types';
3
+ import { type ValidationIssue } from './validation/validate';
3
4
  export declare const EDITOR_CLASS_PREFIX = "pk-editor-";
4
5
  export interface EmailTemplateEditorProps {
5
6
  template: TemplateSourceFiles;
@@ -7,7 +8,10 @@ export interface EmailTemplateEditorProps {
7
8
  onSave: (serialized: SerializedTemplateSource, files: TemplateSourceFiles) => Promise<SaveResult | void> | SaveResult | void;
8
9
  onSendTest?: (serialized: SerializedTemplateSource, files: TemplateSourceFiles, recipient: string) => Promise<SendTestResult | void> | SendTestResult | void;
9
10
  onDirtyChange?: (dirty: boolean) => void;
11
+ onValidationChange?: (issues: ValidationIssue[]) => void;
10
12
  onPreviewRendered?: (html: string) => void;
13
+ loading?: boolean;
14
+ loadError?: string;
11
15
  className?: string;
12
16
  }
13
- export declare function EmailTemplateEditor({ template, availableVariables, onSave, onSendTest, onDirtyChange, onPreviewRendered, className, }: EmailTemplateEditorProps): JSX.Element;
17
+ export declare function EmailTemplateEditor(props: EmailTemplateEditorProps): JSX.Element;
@@ -5,6 +5,8 @@ exports.EmailTemplateEditor = EmailTemplateEditor;
5
5
  const jsx_runtime_1 = require("react/jsx-runtime");
6
6
  const react_1 = require("react");
7
7
  const EmailBuilderCanvas_1 = require("./canvas/EmailBuilderCanvas");
8
+ const EditorErrorBoundary_1 = require("./EditorErrorBoundary");
9
+ const editor_shell_states_1 = require("./editor-shell-states");
8
10
  const insertion_target_1 = require("./insertion-target");
9
11
  const MetadataPanel_1 = require("./metadata/MetadataPanel");
10
12
  const PreviewDataEditor_1 = require("./preview/PreviewDataEditor");
@@ -12,17 +14,33 @@ const PreviewPane_1 = require("./preview/PreviewPane");
12
14
  const dirty_1 = require("./save-send/dirty");
13
15
  const SaveSendBar_1 = require("./save-send/SaveSendBar");
14
16
  const types_1 = require("./save-send/types");
17
+ const ValidationSummary_1 = require("./validation/ValidationSummary");
18
+ const validate_1 = require("./validation/validate");
15
19
  const VariableCatalogue_1 = require("./variables/VariableCatalogue");
16
20
  const working_files_1 = require("./working-files");
17
21
  exports.EDITOR_CLASS_PREFIX = 'pk-editor-';
18
- function EmailTemplateEditor({ template, availableVariables, onSave, onSendTest, onDirtyChange, onPreviewRendered, className, }) {
22
+ function EmailTemplateEditor(props) {
23
+ const rootClassName = [`${exports.EDITOR_CLASS_PREFIX}root`, props.className].filter(Boolean).join(' ');
24
+ if (props.loading) {
25
+ return ((0, jsx_runtime_1.jsx)("div", { className: rootClassName, "data-testid": `${exports.EDITOR_CLASS_PREFIX}root`, children: (0, jsx_runtime_1.jsx)(editor_shell_states_1.EditorLoadingState, {}) }));
26
+ }
27
+ if (props.loadError) {
28
+ return ((0, jsx_runtime_1.jsx)("div", { className: rootClassName, "data-testid": `${exports.EDITOR_CLASS_PREFIX}root`, children: (0, jsx_runtime_1.jsx)(editor_shell_states_1.EditorLoadErrorState, { message: props.loadError }) }));
29
+ }
30
+ return ((0, jsx_runtime_1.jsx)("div", { className: rootClassName, "data-testid": `${exports.EDITOR_CLASS_PREFIX}root`, children: (0, jsx_runtime_1.jsx)(EditorErrorBoundary_1.EditorErrorBoundary, { children: (0, jsx_runtime_1.jsx)(EmailTemplateEditorInner, { ...props }) }) }));
31
+ }
32
+ function EmailTemplateEditorInner({ template, availableVariables, onSave, onSendTest, onDirtyChange, onValidationChange, onPreviewRendered, }) {
19
33
  const [workingFiles, setWorkingFiles] = (0, react_1.useState)(template);
20
34
  const [seedFiles, setSeedFiles] = (0, react_1.useState)(template);
21
35
  const [saveFeedback, setSaveFeedback] = (0, react_1.useState)({ status: 'idle' });
22
36
  const [sendFeedback, setSendFeedback] = (0, react_1.useState)({ status: 'idle' });
37
+ const [previewResult, setPreviewResult] = (0, react_1.useState)(null);
23
38
  const onDirtyChangeRef = (0, react_1.useRef)(onDirtyChange);
24
39
  onDirtyChangeRef.current = onDirtyChange;
40
+ const onValidationChangeRef = (0, react_1.useRef)(onValidationChange);
41
+ onValidationChangeRef.current = onValidationChange;
25
42
  const lastDirtyRef = (0, react_1.useRef)(null);
43
+ const lastIssuesKeyRef = (0, react_1.useRef)(null);
26
44
  const templateGenerationRef = (0, react_1.useRef)(0);
27
45
  const seedFilesRef = (0, react_1.useRef)(seedFiles);
28
46
  seedFilesRef.current = seedFiles;
@@ -33,6 +51,7 @@ function EmailTemplateEditor({ template, availableVariables, onSave, onSendTest,
33
51
  templateGenerationRef.current += 1;
34
52
  setSaveFeedback({ status: 'idle' });
35
53
  setSendFeedback({ status: 'idle' });
54
+ setPreviewResult(null);
36
55
  setWorkingFiles(template);
37
56
  setSeedFiles(template);
38
57
  }, [template]);
@@ -44,6 +63,24 @@ function EmailTemplateEditor({ template, availableVariables, onSave, onSendTest,
44
63
  lastDirtyRef.current = dirty;
45
64
  onDirtyChangeRef.current?.(dirty);
46
65
  }, [seedFiles, workingFiles]);
66
+ const issues = (0, validate_1.validateTemplate)(workingFiles, {
67
+ renderError: previewResult && !previewResult.ok ? previewResult.error : null,
68
+ });
69
+ (0, react_1.useEffect)(() => {
70
+ const key = JSON.stringify(issues);
71
+ if (lastIssuesKeyRef.current === key) {
72
+ return;
73
+ }
74
+ lastIssuesKeyRef.current = key;
75
+ onValidationChangeRef.current?.(issues);
76
+ }, [issues]);
77
+ const previewPending = previewResult === null;
78
+ const validationBlocked = (0, validate_1.hasValidationErrors)(issues) || previewPending;
79
+ const validationBlockedReason = previewPending
80
+ ? 'Wait for the preview to finish before saving or sending a test.'
81
+ : 'Fix validation errors before saving or sending a test.';
82
+ const metadataIssues = issues.filter((i) => i.field === 'metadata' || i.field === 'subject');
83
+ const previewDataIssues = issues.filter((i) => i.field === 'previewData');
47
84
  const handleDocumentChange = (0, react_1.useCallback)((document) => {
48
85
  setWorkingFiles((current) => (0, working_files_1.withDocument)(current, document));
49
86
  }, []);
@@ -58,7 +95,7 @@ function EmailTemplateEditor({ template, availableVariables, onSave, onSendTest,
58
95
  }, []);
59
96
  const busy = saveFeedback.status === 'pending' || sendFeedback.status === 'pending';
60
97
  const handleSave = (0, react_1.useCallback)(() => {
61
- if (busy) {
98
+ if (busy || validationBlocked) {
62
99
  return;
63
100
  }
64
101
  let payload;
@@ -90,9 +127,9 @@ function EmailTemplateEditor({ template, availableVariables, onSave, onSendTest,
90
127
  });
91
128
  }
92
129
  })();
93
- }, [busy, onSave, workingFiles]);
130
+ }, [busy, onSave, validationBlocked, workingFiles]);
94
131
  const handleSendTest = (0, react_1.useCallback)((recipient) => {
95
- if (busy || !onSendTest) {
132
+ if (busy || validationBlocked || !onSendTest) {
96
133
  return;
97
134
  }
98
135
  let payload;
@@ -123,8 +160,7 @@ function EmailTemplateEditor({ template, availableVariables, onSave, onSendTest,
123
160
  });
124
161
  }
125
162
  })();
126
- }, [busy, onSendTest, workingFiles]);
127
- const rootClassName = [`${exports.EDITOR_CLASS_PREFIX}root`, className].filter(Boolean).join(' ');
128
- 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)(SaveSendBar_1.SaveSendBar, { saveFeedback: saveFeedback, sendFeedback: sendFeedback, busy: busy, showSendTest: typeof onSendTest === 'function', onSave: handleSave, onSendTest: handleSendTest }), (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 })] })] }) }) }));
163
+ }, [busy, onSendTest, validationBlocked, workingFiles]);
164
+ return ((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`, "aria-label": "Template settings", children: [(0, jsx_runtime_1.jsx)(SaveSendBar_1.SaveSendBar, { saveFeedback: saveFeedback, sendFeedback: sendFeedback, busy: busy, validationBlocked: validationBlocked, validationBlockedReason: validationBlockedReason, showSendTest: typeof onSendTest === 'function', onSave: handleSave, onSendTest: handleSendTest }), (0, jsx_runtime_1.jsx)(ValidationSummary_1.ValidationSummary, { issues: issues }), (0, jsx_runtime_1.jsx)(MetadataPanel_1.MetadataPanel, { metadata: workingFiles.metadata, previewData: workingFiles.previewData, onChange: handleMetadataChange, issues: metadataIssues }), (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, issues: previewDataIssues })] }), (0, jsx_runtime_1.jsxs)("div", { className: `${exports.EDITOR_CLASS_PREFIX}main`, "aria-label": "Template canvas and preview", 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, onPreviewResultChange: setPreviewResult })] })] }) }));
129
165
  }
130
166
  //# sourceMappingURL=email-template-editor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"email-template-editor.js","sourceRoot":"","sources":["../src/email-template-editor.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"email-template-editor.js","sourceRoot":"","sources":["../src/email-template-editor.tsx"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,3 +3,4 @@ export { EDITOR_CLASS_PREFIX, EmailTemplateEditor, type EmailTemplateEditorProps
3
3
  export { EmailBuilderCanvas, type EmailBuilderCanvasProps } from './canvas/EmailBuilderCanvas';
4
4
  export { loadTemplateSource, serializeTemplateSource, TemplateSourceError } from './serialization';
5
5
  export type { SerializedTemplateSource, SaveResult, SendTestResult } from './save-send/types';
6
+ export { validateTemplate, hasValidationErrors, type ValidationIssue, type ValidationSeverity, type ValidateTemplateOptions, } from './validation/validate';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TemplateSourceError = exports.serializeTemplateSource = exports.loadTemplateSource = exports.EmailBuilderCanvas = exports.EmailTemplateEditor = exports.EDITOR_CLASS_PREFIX = void 0;
3
+ exports.hasValidationErrors = exports.validateTemplate = exports.TemplateSourceError = exports.serializeTemplateSource = exports.loadTemplateSource = exports.EmailBuilderCanvas = exports.EmailTemplateEditor = exports.EDITOR_CLASS_PREFIX = void 0;
4
4
  var email_template_editor_1 = require("./email-template-editor");
5
5
  Object.defineProperty(exports, "EDITOR_CLASS_PREFIX", { enumerable: true, get: function () { return email_template_editor_1.EDITOR_CLASS_PREFIX; } });
6
6
  Object.defineProperty(exports, "EmailTemplateEditor", { enumerable: true, get: function () { return email_template_editor_1.EmailTemplateEditor; } });
@@ -10,4 +10,7 @@ var serialization_1 = require("./serialization");
10
10
  Object.defineProperty(exports, "loadTemplateSource", { enumerable: true, get: function () { return serialization_1.loadTemplateSource; } });
11
11
  Object.defineProperty(exports, "serializeTemplateSource", { enumerable: true, get: function () { return serialization_1.serializeTemplateSource; } });
12
12
  Object.defineProperty(exports, "TemplateSourceError", { enumerable: true, get: function () { return serialization_1.TemplateSourceError; } });
13
+ var validate_1 = require("./validation/validate");
14
+ Object.defineProperty(exports, "validateTemplate", { enumerable: true, get: function () { return validate_1.validateTemplate; } });
15
+ Object.defineProperty(exports, "hasValidationErrors", { enumerable: true, get: function () { return validate_1.hasValidationErrors; } });
13
16
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +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"}
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;AAEzE,kDAM+B;AAL7B,4GAAA,gBAAgB,OAAA;AAChB,+GAAA,mBAAmB,OAAA"}
@@ -1,7 +1,9 @@
1
1
  import type { TemplatePreviewData, TemplateSourceMetadata } from '@singleton-sd/post-kit-types';
2
+ import { type ValidationIssue } from '../validation/validate';
2
3
  export interface MetadataPanelProps {
3
4
  metadata: TemplateSourceMetadata;
4
5
  previewData: TemplatePreviewData;
5
6
  onChange: (metadata: TemplateSourceMetadata) => void;
7
+ issues?: readonly ValidationIssue[];
6
8
  }
7
- export declare function MetadataPanel({ metadata, previewData, onChange, }: MetadataPanelProps): JSX.Element;
9
+ export declare function MetadataPanel({ metadata, previewData, onChange, issues, }: MetadataPanelProps): JSX.Element;
@@ -5,12 +5,24 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const email_template_editor_1 = require("../email-template-editor");
7
7
  const insertion_target_1 = require("../insertion-target");
8
+ const validate_1 = require("../validation/validate");
8
9
  const insert_at_cursor_1 = require("./insert-at-cursor");
9
10
  const subject_preview_1 = require("./subject-preview");
10
11
  const template_key_1 = require("./template-key");
11
- function MetadataPanel({ metadata, previewData, onChange, }) {
12
+ function MetadataPanel({ metadata, previewData, onChange, issues = [], }) {
12
13
  const [keyError, setKeyError] = (0, react_1.useState)(null);
13
14
  const subjectRef = (0, react_1.useRef)(null);
15
+ const keyIssues = issues.filter((i) => i.field === 'metadata' && (i.code === 'missing-key' || i.code === 'invalid-key'));
16
+ const nameIssues = issues.filter((i) => i.field === 'metadata' && i.code === 'missing-name');
17
+ const subjectIssues = issues.filter((i) => i.field === 'subject');
18
+ const keyDescribedBy = [
19
+ keyError ? `${email_template_editor_1.EDITOR_CLASS_PREFIX}meta-key-error` : null,
20
+ ...keyIssues.map((i) => (0, validate_1.inlineIssueId)(i.code)),
21
+ ]
22
+ .filter(Boolean)
23
+ .join(' ');
24
+ const nameDescribedBy = nameIssues.map((i) => (0, validate_1.inlineIssueId)(i.code)).join(' ');
25
+ const subjectDescribedBy = subjectIssues.map((i) => (0, validate_1.inlineIssueId)(i.code, i.variable)).join(' ');
14
26
  const patch = (0, react_1.useCallback)((partial) => {
15
27
  onChange({ ...metadata, ...partial });
16
28
  }, [metadata, onChange]);
@@ -43,7 +55,7 @@ function MetadataPanel({ metadata, previewData, onChange, }) {
43
55
  const subjectFocus = (0, insertion_target_1.useRegisterInsertionTarget)('subject field', insertIntoSubject);
44
56
  const subjectPreview = (0, subject_preview_1.previewSubject)(metadata.subject, previewData);
45
57
  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) => {
58
+ 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`, "aria-invalid": keyError !== null || keyIssues.length > 0, "aria-describedby": keyDescribedBy || undefined }), keyError ? ((0, jsx_runtime_1.jsx)("p", { id: `${p}meta-key-error`, className: `${p}metadata-error`, "data-testid": `${p}meta-key-error`, role: "status", children: keyError })) : null, keyIssues.map((issue) => ((0, jsx_runtime_1.jsxs)("p", { id: (0, validate_1.inlineIssueId)(issue.code), className: `${p}metadata-error`, "data-testid": `${p}meta-key-validation`, role: "status", children: [(0, jsx_runtime_1.jsx)("span", { "aria-hidden": "true", children: "!" }), " ", issue.message] }, issue.code)))] }), (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`, "aria-invalid": nameIssues.length > 0, "aria-describedby": nameDescribedBy || undefined }), nameIssues.map((issue) => ((0, jsx_runtime_1.jsxs)("p", { id: (0, validate_1.inlineIssueId)(issue.code), className: `${p}metadata-error`, "data-testid": `${p}meta-name-validation`, role: "status", children: [(0, jsx_runtime_1.jsx)("span", { "aria-hidden": "true", children: "!" }), " ", issue.message] }, issue.code)))] }), (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
59
  const description = event.target.value;
48
60
  if (description === '') {
49
61
  const { description: _removed, ...rest } = metadata;
@@ -51,6 +63,6 @@ function MetadataPanel({ metadata, previewData, onChange, }) {
51
63
  return;
52
64
  }
53
65
  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 })] })] }));
66
+ }, 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`, "aria-invalid": subjectIssues.length > 0, "aria-describedby": subjectDescribedBy || undefined }), subjectIssues.map((issue) => ((0, jsx_runtime_1.jsxs)("p", { id: (0, validate_1.inlineIssueId)(issue.code, issue.variable), className: `${p}metadata-error`, "data-testid": `${p}meta-subject-validation`, role: "status", children: [(0, jsx_runtime_1.jsx)("span", { "aria-hidden": "true", children: "!" }), " ", issue.message] }, `${issue.code}:${issue.variable ?? ''}`))), (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
67
  }
56
68
  //# sourceMappingURL=MetadataPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MetadataPanel.js","sourceRoot":"","sources":["../../src/metadata/MetadataPanel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MetadataPanel.js","sourceRoot":"","sources":["../../src/metadata/MetadataPanel.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import type { TemplatePreviewData } from '@singleton-sd/post-kit-types';
2
+ import { type ValidationIssue } from '../validation/validate';
2
3
  export interface PreviewDataEditorProps {
3
4
  declaredVariables: readonly string[];
4
5
  previewData: TemplatePreviewData;
5
6
  onChange: (previewData: TemplatePreviewData) => void;
7
+ issues?: readonly ValidationIssue[];
6
8
  }
7
- export declare function PreviewDataEditor({ declaredVariables, previewData, onChange, }: PreviewDataEditorProps): JSX.Element;
9
+ export declare function PreviewDataEditor({ declaredVariables, previewData, onChange, issues, }: PreviewDataEditorProps): JSX.Element;
@@ -4,13 +4,15 @@ exports.PreviewDataEditor = PreviewDataEditor;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const email_template_editor_1 = require("../email-template-editor");
7
+ const validate_1 = require("../validation/validate");
7
8
  const preview_rows_1 = require("./preview-rows");
8
- function PreviewDataEditor({ declaredVariables, previewData, onChange, }) {
9
+ function PreviewDataEditor({ declaredVariables, previewData, onChange, issues = [], }) {
9
10
  const p = email_template_editor_1.EDITOR_CLASS_PREFIX;
10
11
  const rows = (0, preview_rows_1.buildPreviewRows)(declaredVariables, previewData);
11
12
  const [newKey, setNewKey] = (0, react_1.useState)('');
12
13
  const [addError, setAddError] = (0, react_1.useState)(null);
13
14
  const addInputId = (0, react_1.useId)();
15
+ const issuesForKey = (key) => issues.filter((i) => i.field === 'previewData' && i.variable === key);
14
16
  const handleValueChange = (0, react_1.useCallback)((key, value) => {
15
17
  onChange((0, preview_rows_1.setPreviewValue)(previewData, key, value));
16
18
  }, [onChange, previewData]);
@@ -29,7 +31,12 @@ function PreviewDataEditor({ declaredVariables, previewData, onChange, }) {
29
31
  setNewKey('');
30
32
  onChange(next);
31
33
  }, [newKey, onChange, previewData]);
32
- return ((0, jsx_runtime_1.jsxs)("section", { className: `${p}preview-data`, "data-testid": `${p}preview-data`, children: [(0, jsx_runtime_1.jsx)("h2", { className: `${p}preview-data-heading`, children: "Preview data" }), (0, jsx_runtime_1.jsx)("p", { className: `${p}preview-data-hint`, children: "Sample values only \u2014 never real personal data. These are committed with the template source." }), (0, jsx_runtime_1.jsx)("ul", { className: `${p}preview-data-list`, "data-testid": `${p}preview-data-list`, children: rows.map((row) => ((0, jsx_runtime_1.jsxs)("li", { className: `${p}preview-data-row${row.extra ? ` ${p}preview-data-row-extra` : ''}`, "data-testid": `${p}preview-data-row`, "data-extra": row.extra ? 'true' : 'false', "data-key": row.key, children: [(0, jsx_runtime_1.jsxs)("label", { className: `${p}preview-data-key`, htmlFor: `${p}preview-${row.key}`, children: [row.key, row.extra ? ((0, jsx_runtime_1.jsx)("span", { className: `${p}preview-data-extra-badge`, "data-testid": `${p}preview-extra`, children: "extra" })) : null] }), (0, jsx_runtime_1.jsx)("input", { id: `${p}preview-${row.key}`, className: `${p}preview-data-value`, type: "text", value: row.value, onChange: (event) => handleValueChange(row.key, event.target.value), "data-testid": `${p}preview-value-${row.key}`, autoComplete: "off", spellCheck: false }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: `${p}preview-data-remove`, onClick: () => handleRemove(row.key), "data-testid": `${p}preview-remove-${row.key}`, children: "Remove" })] }, row.key))) }), (0, jsx_runtime_1.jsxs)("form", { className: `${p}preview-data-add`, onSubmit: handleAdd, "data-testid": `${p}preview-data-add`, children: [(0, jsx_runtime_1.jsx)("label", { className: `${p}preview-data-label`, htmlFor: addInputId, children: "Add preview key" }), (0, jsx_runtime_1.jsx)("input", { id: addInputId, className: `${p}preview-data-input`, type: "text", value: newKey, onChange: (event) => {
34
+ return ((0, jsx_runtime_1.jsxs)("section", { className: `${p}preview-data`, "data-testid": `${p}preview-data`, children: [(0, jsx_runtime_1.jsx)("h2", { className: `${p}preview-data-heading`, children: "Preview data" }), (0, jsx_runtime_1.jsx)("p", { className: `${p}preview-data-hint`, children: "Sample values only \u2014 never real personal data. These are committed with the template source." }), (0, jsx_runtime_1.jsx)("ul", { className: `${p}preview-data-list`, "data-testid": `${p}preview-data-list`, children: rows.map((row) => {
35
+ const rowIssues = issuesForKey(row.key);
36
+ const describedBy = rowIssues.map((i) => (0, validate_1.inlineIssueId)(i.code, i.variable)).join(' ');
37
+ const inputId = `${p}preview-${(0, validate_1.domIdSegment)(row.key)}`;
38
+ return ((0, jsx_runtime_1.jsxs)("li", { className: `${p}preview-data-row${row.extra ? ` ${p}preview-data-row-extra` : ''}`, "data-testid": `${p}preview-data-row`, "data-extra": row.extra ? 'true' : 'false', "data-key": row.key, children: [(0, jsx_runtime_1.jsxs)("label", { className: `${p}preview-data-key`, htmlFor: inputId, children: [row.key, row.extra ? ((0, jsx_runtime_1.jsx)("span", { className: `${p}preview-data-extra-badge`, "data-testid": `${p}preview-extra`, children: "extra" })) : null] }), (0, jsx_runtime_1.jsx)("input", { id: inputId, className: `${p}preview-data-value`, type: "text", value: row.value, onChange: (event) => handleValueChange(row.key, event.target.value), "data-testid": `${p}preview-value-${row.key}`, autoComplete: "off", spellCheck: false, "aria-invalid": rowIssues.length > 0, "aria-describedby": describedBy || undefined }), rowIssues.map((issue) => ((0, jsx_runtime_1.jsxs)("p", { id: (0, validate_1.inlineIssueId)(issue.code, issue.variable), className: `${p}preview-data-row-error`, "data-testid": `${p}preview-validation-${row.key}`, role: "status", children: [(0, jsx_runtime_1.jsx)("span", { "aria-hidden": "true", children: issue.severity === 'error' ? '!' : 'i' }), ' ', issue.message] }, `${issue.code}:${issue.variable}`))), (0, jsx_runtime_1.jsx)("button", { type: "button", className: `${p}preview-data-remove`, onClick: () => handleRemove(row.key), "data-testid": `${p}preview-remove-${row.key}`, "aria-label": `Remove preview value ${row.key}`, children: "Remove" })] }, row.key));
39
+ }) }), (0, jsx_runtime_1.jsxs)("form", { className: `${p}preview-data-add`, onSubmit: handleAdd, "data-testid": `${p}preview-data-add`, children: [(0, jsx_runtime_1.jsx)("label", { className: `${p}preview-data-label`, htmlFor: addInputId, children: "Add preview key" }), (0, jsx_runtime_1.jsx)("input", { id: addInputId, className: `${p}preview-data-input`, type: "text", value: newKey, onChange: (event) => {
33
40
  setNewKey(event.target.value);
34
41
  setAddError(null);
35
42
  }, placeholder: "variable.name", autoComplete: "off", spellCheck: false, "data-testid": `${p}preview-add-key` }), (0, jsx_runtime_1.jsx)("button", { type: "submit", className: `${p}preview-data-add-button`, "data-testid": `${p}preview-add`, children: "Add" }), addError ? ((0, jsx_runtime_1.jsx)("p", { className: `${p}preview-data-error`, "data-testid": `${p}preview-add-error`, role: "status", children: addError })) : null] })] }));
@@ -1 +1 @@
1
- {"version":3,"file":"PreviewDataEditor.js","sourceRoot":"","sources":["../../src/preview/PreviewDataEditor.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PreviewDataEditor.js","sourceRoot":"","sources":["../../src/preview/PreviewDataEditor.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import type { TemplateSourceFiles } from '../types';
2
+ import { type PreviewRenderResult } from './render-template-preview';
2
3
  export interface PreviewPaneProps {
3
4
  files: TemplateSourceFiles;
4
5
  onPreviewRendered?: (html: string) => void;
6
+ onPreviewResultChange?: (result: PreviewRenderResult | null) => void;
5
7
  debounceMs?: number;
6
8
  }
7
- export declare function PreviewPane({ files, onPreviewRendered, debounceMs, }: PreviewPaneProps): JSX.Element;
9
+ export declare function PreviewPane({ files, onPreviewRendered, onPreviewResultChange, debounceMs, }: PreviewPaneProps): JSX.Element;
@@ -6,15 +6,18 @@ const react_1 = require("react");
6
6
  const email_template_editor_1 = require("../email-template-editor");
7
7
  const preview_frame_1 = require("./preview-frame");
8
8
  const render_template_preview_1 = require("./render-template-preview");
9
- function PreviewPane({ files, onPreviewRendered, debounceMs = render_template_preview_1.PREVIEW_DEBOUNCE_MS, }) {
9
+ function PreviewPane({ files, onPreviewRendered, onPreviewResultChange, debounceMs = render_template_preview_1.PREVIEW_DEBOUNCE_MS, }) {
10
10
  const p = email_template_editor_1.EDITOR_CLASS_PREFIX;
11
11
  const [result, setResult] = (0, react_1.useState)(null);
12
12
  const [pending, setPending] = (0, react_1.useState)(true);
13
13
  const onPreviewRenderedRef = (0, react_1.useRef)(onPreviewRendered);
14
14
  onPreviewRenderedRef.current = onPreviewRendered;
15
+ const onPreviewResultChangeRef = (0, react_1.useRef)(onPreviewResultChange);
16
+ onPreviewResultChangeRef.current = onPreviewResultChange;
15
17
  const requestIdRef = (0, react_1.useRef)(0);
16
18
  (0, react_1.useEffect)(() => {
17
19
  setPending(true);
20
+ onPreviewResultChangeRef.current?.(null);
18
21
  const requestId = ++requestIdRef.current;
19
22
  const timer = setTimeout(() => {
20
23
  void (async () => {
@@ -24,6 +27,7 @@ function PreviewPane({ files, onPreviewRendered, debounceMs = render_template_pr
24
27
  }
25
28
  setResult(next);
26
29
  setPending(false);
30
+ onPreviewResultChangeRef.current?.(next);
27
31
  if (next.ok) {
28
32
  onPreviewRenderedRef.current?.(next.html);
29
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PreviewPane.js","sourceRoot":"","sources":["../../src/preview/PreviewPane.tsx"],"names":[],"mappings":";;AA+BA,kCAsDC;;AArFD,iCAA2D;AAE3D,oEAA+D;AAE/D,mDAAmE;AACnE,uEAImC;AAsBnC,SAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,iBAAiB,EACjB,UAAU,GAAG,6CAAmB,GACf;IACjB,MAAM,CAAC,GAAG,2CAAmB,CAAC;IAC9B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAA6B,IAAI,CAAC,CAAC;IACvE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,oBAAoB,GAAG,IAAA,cAAM,EAAC,iBAAiB,CAAC,CAAC;IACvD,oBAAoB,CAAC,OAAO,GAAG,iBAAiB,CAAC;IACjD,MAAM,YAAY,GAAG,IAAA,cAAM,EAAC,CAAC,CAAC,CAAC;IAE/B,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,SAAS,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,GAAG,MAAM,IAAA,+CAAqB,EAAC,KAAK,CAAC,CAAC;gBAEhD,IAAI,SAAS,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;oBACvC,OAAO;gBACT,CAAC;gBACD,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChB,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;oBACZ,oBAAoB,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,EAAE,UAAU,CAAC,CAAC;QAEf,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YAEpB,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAExB,OAAO,CACL,qCAAS,SAAS,EAAE,GAAG,CAAC,cAAc,iBAAe,GAAG,CAAC,cAAc,aACrE,+BAAI,SAAS,EAAE,GAAG,CAAC,sBAAsB,wBAAc,EACtD,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CACjB,8BAAG,SAAS,EAAE,GAAG,CAAC,qBAAqB,iBAAe,GAAG,CAAC,iBAAiB,wCAEvE,CACL,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAC5B,8BAAG,SAAS,EAAE,GAAG,CAAC,qBAAqB,iBAAe,GAAG,CAAC,kBAAkB,uCAExE,CACL,CAAC,CAAC,CAAC,IAAI,EACP,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAC,kCAAkB,IAAC,OAAO,EAAE,MAAM,CAAC,KAAK,GAAI,CAAC,CAAC,CAAC,IAAI,EAC3E,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,uBAAC,4BAAY,IAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAI,CAAC,CAAC,CAAC,IAAI,IAChD,CACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"PreviewPane.js","sourceRoot":"","sources":["../../src/preview/PreviewPane.tsx"],"names":[],"mappings":";;AAoCA,kCA6DC;;AAjGD,iCAA2D;AAE3D,oEAA+D;AAE/D,mDAAmE;AACnE,uEAImC;AA2BnC,SAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,iBAAiB,EACjB,qBAAqB,EACrB,UAAU,GAAG,6CAAmB,GACf;IACjB,MAAM,CAAC,GAAG,2CAAmB,CAAC;IAC9B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAA6B,IAAI,CAAC,CAAC;IACvE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,oBAAoB,GAAG,IAAA,cAAM,EAAC,iBAAiB,CAAC,CAAC;IACvD,oBAAoB,CAAC,OAAO,GAAG,iBAAiB,CAAC;IACjD,MAAM,wBAAwB,GAAG,IAAA,cAAM,EAAC,qBAAqB,CAAC,CAAC;IAC/D,wBAAwB,CAAC,OAAO,GAAG,qBAAqB,CAAC;IACzD,MAAM,YAAY,GAAG,IAAA,cAAM,EAAC,CAAC,CAAC,CAAC;IAE/B,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,UAAU,CAAC,IAAI,CAAC,CAAC;QAGjB,wBAAwB,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,GAAG,MAAM,IAAA,+CAAqB,EAAC,KAAK,CAAC,CAAC;gBAEhD,IAAI,SAAS,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;oBACvC,OAAO;gBACT,CAAC;gBACD,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChB,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClB,wBAAwB,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;gBACzC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;oBACZ,oBAAoB,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,EAAE,UAAU,CAAC,CAAC;QAEf,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YAEpB,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAExB,OAAO,CACL,qCAAS,SAAS,EAAE,GAAG,CAAC,cAAc,iBAAe,GAAG,CAAC,cAAc,aACrE,+BAAI,SAAS,EAAE,GAAG,CAAC,sBAAsB,wBAAc,EACtD,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CACjB,8BAAG,SAAS,EAAE,GAAG,CAAC,qBAAqB,iBAAe,GAAG,CAAC,iBAAiB,wCAEvE,CACL,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAC5B,8BAAG,SAAS,EAAE,GAAG,CAAC,qBAAqB,iBAAe,GAAG,CAAC,kBAAkB,uCAExE,CACL,CAAC,CAAC,CAAC,IAAI,EACP,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAC,kCAAkB,IAAC,OAAO,EAAE,MAAM,CAAC,KAAK,GAAI,CAAC,CAAC,CAAC,IAAI,EAC3E,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,uBAAC,4BAAY,IAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAI,CAAC,CAAC,CAAC,IAAI,IAChD,CACX,CAAC;AACJ,CAAC"}
@@ -3,8 +3,10 @@ export interface SaveSendBarProps {
3
3
  saveFeedback: ActionFeedback;
4
4
  sendFeedback: ActionFeedback;
5
5
  busy: boolean;
6
+ validationBlocked?: boolean;
7
+ validationBlockedReason?: string;
6
8
  showSendTest: boolean;
7
9
  onSave: () => void;
8
10
  onSendTest: (recipient: string) => void;
9
11
  }
10
- export declare function SaveSendBar({ saveFeedback, sendFeedback, busy, showSendTest, onSave, onSendTest, }: SaveSendBarProps): JSX.Element;
12
+ export declare function SaveSendBar({ saveFeedback, sendFeedback, busy, validationBlocked, validationBlockedReason, showSendTest, onSave, onSendTest, }: SaveSendBarProps): JSX.Element;
@@ -5,13 +5,18 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const email_template_editor_1 = require("../email-template-editor");
7
7
  const recipient_1 = require("./recipient");
8
- function SaveSendBar({ saveFeedback, sendFeedback, busy, showSendTest, onSave, onSendTest, }) {
8
+ function SaveSendBar({ saveFeedback, sendFeedback, busy, validationBlocked = false, validationBlockedReason = 'Fix validation errors before saving.', showSendTest, onSave, onSendTest, }) {
9
9
  const p = email_template_editor_1.EDITOR_CLASS_PREFIX;
10
10
  const recipientId = (0, react_1.useId)();
11
+ const blockedId = (0, react_1.useId)();
11
12
  const [recipient, setRecipient] = (0, react_1.useState)('');
12
13
  const [recipientError, setRecipientError] = (0, react_1.useState)(null);
14
+ const controlsDisabled = busy || validationBlocked;
13
15
  const handleSend = (event) => {
14
16
  event.preventDefault();
17
+ if (controlsDisabled) {
18
+ return;
19
+ }
15
20
  const error = (0, recipient_1.validateSendTestRecipient)(recipient);
16
21
  if (error) {
17
22
  setRecipientError(error);
@@ -20,10 +25,10 @@ function SaveSendBar({ saveFeedback, sendFeedback, busy, showSendTest, onSave, o
20
25
  setRecipientError(null);
21
26
  onSendTest(recipient.trim());
22
27
  };
23
- return ((0, jsx_runtime_1.jsxs)("section", { className: `${p}save-send`, "data-testid": `${p}save-send`, children: [(0, jsx_runtime_1.jsx)("h2", { className: `${p}save-send-heading`, children: showSendTest ? 'Save & send test' : 'Save' }), (0, jsx_runtime_1.jsxs)("div", { className: `${p}save-send-actions`, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", className: `${p}save-button`, "data-testid": `${p}save`, disabled: busy, onClick: onSave, children: saveFeedback.status === 'pending' ? 'Saving…' : 'Save' }), (0, jsx_runtime_1.jsx)(ActionStatusMessage, { feedback: saveFeedback, testId: `${p}save-status`, successLabel: "Saved." })] }), showSendTest ? ((0, jsx_runtime_1.jsxs)("form", { className: `${p}send-test`, "data-testid": `${p}send-test`, onSubmit: handleSend, children: [(0, jsx_runtime_1.jsx)("label", { className: `${p}send-test-label`, htmlFor: recipientId, children: "Send test to" }), (0, jsx_runtime_1.jsx)("input", { id: recipientId, className: `${p}send-test-input`, type: "email", value: recipient, disabled: busy, autoComplete: "off", spellCheck: false, placeholder: "you@example.com", "data-testid": `${p}send-test-recipient`, onChange: (event) => {
28
+ return ((0, jsx_runtime_1.jsxs)("section", { className: `${p}save-send`, "data-testid": `${p}save-send`, children: [(0, jsx_runtime_1.jsx)("h2", { className: `${p}save-send-heading`, children: showSendTest ? 'Save & send test' : 'Save' }), validationBlocked ? ((0, jsx_runtime_1.jsx)("p", { id: blockedId, className: `${p}save-send-blocked`, "data-testid": `${p}save-blocked-reason`, role: "status", children: validationBlockedReason })) : null, (0, jsx_runtime_1.jsxs)("div", { className: `${p}save-send-actions`, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", className: `${p}save-button`, "data-testid": `${p}save`, disabled: controlsDisabled, "aria-describedby": validationBlocked ? blockedId : undefined, onClick: onSave, children: saveFeedback.status === 'pending' ? 'Saving…' : 'Save' }), (0, jsx_runtime_1.jsx)(ActionStatusMessage, { feedback: saveFeedback, testId: `${p}save-status`, successLabel: "Saved." })] }), showSendTest ? ((0, jsx_runtime_1.jsxs)("form", { className: `${p}send-test`, "data-testid": `${p}send-test`, onSubmit: handleSend, children: [(0, jsx_runtime_1.jsx)("label", { className: `${p}send-test-label`, htmlFor: recipientId, children: "Send test to" }), (0, jsx_runtime_1.jsx)("input", { id: recipientId, className: `${p}send-test-input`, type: "email", value: recipient, disabled: controlsDisabled, autoComplete: "off", spellCheck: false, placeholder: "you@example.com", "data-testid": `${p}send-test-recipient`, onChange: (event) => {
24
29
  setRecipient(event.target.value);
25
30
  setRecipientError(null);
26
- } }), (0, jsx_runtime_1.jsx)("button", { type: "submit", className: `${p}send-test-button`, "data-testid": `${p}send-test-submit`, disabled: busy, children: sendFeedback.status === 'pending' ? 'Sending…' : 'Send test' }), recipientError ? ((0, jsx_runtime_1.jsx)("p", { className: `${p}send-test-error`, "data-testid": `${p}send-test-invalid`, role: "status", children: recipientError })) : null, (0, jsx_runtime_1.jsx)(ActionStatusMessage, { feedback: sendFeedback, testId: `${p}send-test-status`, successLabel: "Test send completed." })] })) : null] }));
31
+ } }), (0, jsx_runtime_1.jsx)("button", { type: "submit", className: `${p}send-test-button`, "data-testid": `${p}send-test-submit`, disabled: controlsDisabled, "aria-describedby": validationBlocked ? blockedId : undefined, children: sendFeedback.status === 'pending' ? 'Sending…' : 'Send test' }), recipientError ? ((0, jsx_runtime_1.jsx)("p", { className: `${p}send-test-error`, "data-testid": `${p}send-test-invalid`, role: "status", children: recipientError })) : null, (0, jsx_runtime_1.jsx)(ActionStatusMessage, { feedback: sendFeedback, testId: `${p}send-test-status`, successLabel: "Test send completed." })] })) : null] }));
27
32
  }
28
33
  function ActionStatusMessage({ feedback, testId, successLabel, }) {
29
34
  const p = email_template_editor_1.EDITOR_CLASS_PREFIX;
@@ -1 +1 @@
1
- {"version":3,"file":"SaveSendBar.js","sourceRoot":"","sources":["../../src/save-send/SaveSendBar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SaveSendBar.js","sourceRoot":"","sources":["../../src/save-send/SaveSendBar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type ValidationIssue } from './validate';
2
+ export interface ValidationSummaryProps {
3
+ issues: readonly ValidationIssue[];
4
+ }
5
+ export declare function ValidationSummary({ issues }: ValidationSummaryProps): JSX.Element | null;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidationSummary = ValidationSummary;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const email_template_editor_1 = require("../email-template-editor");
6
+ const validate_1 = require("./validate");
7
+ function ValidationSummary({ issues }) {
8
+ const p = email_template_editor_1.EDITOR_CLASS_PREFIX;
9
+ if (issues.length === 0) {
10
+ return null;
11
+ }
12
+ const errors = issues.filter((i) => i.severity === 'error');
13
+ const warnings = issues.filter((i) => i.severity === 'warning');
14
+ return ((0, jsx_runtime_1.jsxs)("section", { className: `${p}validation`, "data-testid": `${p}validation`, "aria-label": "Template validation", children: [(0, jsx_runtime_1.jsx)("h2", { className: `${p}validation-heading`, children: "Validation" }), (0, jsx_runtime_1.jsxs)("div", { className: `${p}validation-live`, "data-testid": `${p}validation-live`, "aria-live": "polite", "aria-relevant": "additions text", children: [errors.length > 0 ? (0, jsx_runtime_1.jsx)(IssueGroup, { title: "Errors", severity: "error", issues: errors }) : null, warnings.length > 0 ? ((0, jsx_runtime_1.jsx)(IssueGroup, { title: "Warnings", severity: "warning", issues: warnings })) : null] })] }));
15
+ }
16
+ function IssueGroup({ title, severity, issues, }) {
17
+ const p = email_template_editor_1.EDITOR_CLASS_PREFIX;
18
+ return ((0, jsx_runtime_1.jsxs)("div", { className: `${p}validation-group ${p}validation-group-${severity}`, "data-testid": `${p}validation-${severity}s`, children: [(0, jsx_runtime_1.jsxs)("h3", { className: `${p}validation-group-title`, children: [(0, jsx_runtime_1.jsx)("span", { className: `${p}validation-icon`, "aria-hidden": "true", children: severity === 'error' ? '!' : 'i' }), ' ', title] }), (0, jsx_runtime_1.jsx)("ul", { className: `${p}validation-list`, children: issues.map((issue) => {
19
+ const targetId = (0, validate_1.focusTargetIdForIssue)(issue);
20
+ const key = `${issue.code}:${issue.field}:${issue.variable ?? ''}:${issue.message}`;
21
+ return ((0, jsx_runtime_1.jsx)("li", { className: `${p}validation-item`, children: (0, jsx_runtime_1.jsxs)("button", { type: "button", className: `${p}validation-link`, "data-testid": `${p}validation-link-${issue.code}`, "data-focus-target": targetId, onClick: () => {
22
+ const el = document.getElementById(targetId);
23
+ if (el && 'focus' in el && typeof el.focus === 'function') {
24
+ el.focus();
25
+ }
26
+ }, children: [(0, jsx_runtime_1.jsx)("span", { className: `${p}validation-code`, children: issue.code }), ': ', issue.message] }) }, key));
27
+ }) })] }));
28
+ }
29
+ //# sourceMappingURL=ValidationSummary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationSummary.js","sourceRoot":"","sources":["../../src/validation/ValidationSummary.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function extractPlaceholdersFromText(text: string): string[];
2
+ export declare function extractPlaceholdersFromDocument(document: unknown): string[];
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractPlaceholdersFromText = extractPlaceholdersFromText;
4
+ exports.extractPlaceholdersFromDocument = extractPlaceholdersFromDocument;
5
+ const PLACEHOLDER_RE = /\{\{\s*([a-zA-Z0-9_.-]+)\s*\}\}/g;
6
+ function extractPlaceholdersFromText(text) {
7
+ const seen = new Set();
8
+ const ordered = [];
9
+ PLACEHOLDER_RE.lastIndex = 0;
10
+ let match;
11
+ while ((match = PLACEHOLDER_RE.exec(text)) !== null) {
12
+ const name = match[1];
13
+ if (!seen.has(name)) {
14
+ seen.add(name);
15
+ ordered.push(name);
16
+ }
17
+ }
18
+ return ordered;
19
+ }
20
+ function extractPlaceholdersFromDocument(document) {
21
+ const seen = new Set();
22
+ const ordered = [];
23
+ const visit = (value) => {
24
+ if (typeof value === 'string') {
25
+ for (const name of extractPlaceholdersFromText(value)) {
26
+ if (!seen.has(name)) {
27
+ seen.add(name);
28
+ ordered.push(name);
29
+ }
30
+ }
31
+ return;
32
+ }
33
+ if (value === null || typeof value !== 'object') {
34
+ return;
35
+ }
36
+ if (Array.isArray(value)) {
37
+ for (const item of value) {
38
+ visit(item);
39
+ }
40
+ return;
41
+ }
42
+ for (const child of Object.values(value)) {
43
+ visit(child);
44
+ }
45
+ };
46
+ visit(document);
47
+ return ordered;
48
+ }
49
+ //# sourceMappingURL=extract-placeholders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-placeholders.js","sourceRoot":"","sources":["../../src/validation/extract-placeholders.ts"],"names":[],"mappings":";;AAQA,kEAaC;AAMD,0EA8BC;AApDD,MAAM,cAAc,GAAG,kCAAkC,CAAC;AAG1D,SAAgB,2BAA2B,CAAC,IAAY;IACtD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,cAAc,CAAC,SAAS,GAAG,CAAC,CAAC;IAC7B,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAMD,SAAgB,+BAA+B,CAAC,QAAiB;IAC/D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,KAAK,GAAG,CAAC,KAAc,EAAQ,EAAE;QACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,2BAA2B,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAChD,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,CAAC;YACd,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAgC,CAAC,EAAE,CAAC;YACpE,KAAK,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChB,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { TemplateSourceFiles } from '../types';
2
+ export type ValidationSeverity = 'error' | 'warning';
3
+ export interface ValidationIssue {
4
+ severity: ValidationSeverity;
5
+ code: string;
6
+ message: string;
7
+ field: 'metadata' | 'subject' | 'document' | 'previewData';
8
+ variable?: string;
9
+ }
10
+ export interface ValidateTemplateOptions {
11
+ renderError?: string | null;
12
+ }
13
+ export declare function validateTemplate(files: TemplateSourceFiles, options?: ValidateTemplateOptions): ValidationIssue[];
14
+ export declare function hasValidationErrors(issues: readonly ValidationIssue[]): boolean;
15
+ export declare function focusTargetIdForIssue(issue: ValidationIssue): string;
16
+ export declare function domIdSegment(value: string): string;
17
+ export declare function inlineIssueId(code: string, variable?: string): string;
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateTemplate = validateTemplate;
4
+ exports.hasValidationErrors = hasValidationErrors;
5
+ exports.focusTargetIdForIssue = focusTargetIdForIssue;
6
+ exports.domIdSegment = domIdSegment;
7
+ exports.inlineIssueId = inlineIssueId;
8
+ const template_key_1 = require("../metadata/template-key");
9
+ const extract_placeholders_1 = require("./extract-placeholders");
10
+ function validateTemplate(files, options = {}) {
11
+ const issues = [];
12
+ const { metadata, previewData, templateJson } = files;
13
+ const key = metadata.key.trim();
14
+ if (key === '') {
15
+ issues.push({
16
+ severity: 'error',
17
+ code: 'missing-key',
18
+ message: 'Template key is required.',
19
+ field: 'metadata',
20
+ });
21
+ }
22
+ else {
23
+ const keyError = (0, template_key_1.templateKeyInputError)(metadata.key);
24
+ if (keyError) {
25
+ issues.push({
26
+ severity: 'error',
27
+ code: 'invalid-key',
28
+ message: keyError,
29
+ field: 'metadata',
30
+ });
31
+ }
32
+ }
33
+ if (metadata.name.trim() === '') {
34
+ issues.push({
35
+ severity: 'error',
36
+ code: 'missing-name',
37
+ message: 'Template name is required.',
38
+ field: 'metadata',
39
+ });
40
+ }
41
+ if (metadata.subject.trim() === '') {
42
+ issues.push({
43
+ severity: 'error',
44
+ code: 'missing-subject',
45
+ message: 'Subject is required.',
46
+ field: 'subject',
47
+ });
48
+ }
49
+ const declared = metadata.variables;
50
+ const declaredSet = new Set(declared);
51
+ const subjectPlaceholders = (0, extract_placeholders_1.extractPlaceholdersFromText)(metadata.subject);
52
+ const documentPlaceholders = (0, extract_placeholders_1.extractPlaceholdersFromDocument)(templateJson);
53
+ const used = new Set([...subjectPlaceholders, ...documentPlaceholders]);
54
+ for (const name of subjectPlaceholders) {
55
+ if (!declaredSet.has(name)) {
56
+ issues.push({
57
+ severity: 'error',
58
+ code: 'undeclared-variable',
59
+ message: `Variable "{{${name}}}" is used in the subject but is not declared.`,
60
+ field: 'subject',
61
+ variable: name,
62
+ });
63
+ }
64
+ }
65
+ for (const name of documentPlaceholders) {
66
+ if (!declaredSet.has(name)) {
67
+ issues.push({
68
+ severity: 'error',
69
+ code: 'undeclared-variable',
70
+ message: `Variable "{{${name}}}" is used in the document but is not declared.`,
71
+ field: 'document',
72
+ variable: name,
73
+ });
74
+ }
75
+ }
76
+ for (const name of declared) {
77
+ const value = previewData[name];
78
+ if (value === undefined || value.trim() === '') {
79
+ issues.push({
80
+ severity: 'error',
81
+ code: 'missing-preview-value',
82
+ message: `Declared variable "${name}" has no preview value.`,
83
+ field: 'previewData',
84
+ variable: name,
85
+ });
86
+ }
87
+ }
88
+ for (const name of declared) {
89
+ if (!used.has(name)) {
90
+ issues.push({
91
+ severity: 'warning',
92
+ code: 'unused-variable',
93
+ message: `Declared variable "${name}" is not used in the subject or document.`,
94
+ field: 'metadata',
95
+ variable: name,
96
+ });
97
+ }
98
+ }
99
+ for (const name of Object.keys(previewData)) {
100
+ if (!declaredSet.has(name)) {
101
+ issues.push({
102
+ severity: 'warning',
103
+ code: 'extra-preview-value',
104
+ message: `Preview value "${name}" is not declared in metadata.variables.`,
105
+ field: 'previewData',
106
+ variable: name,
107
+ });
108
+ }
109
+ }
110
+ if (options.renderError) {
111
+ issues.push({
112
+ severity: 'error',
113
+ code: 'render-failed',
114
+ message: options.renderError,
115
+ field: 'document',
116
+ });
117
+ }
118
+ return issues;
119
+ }
120
+ function hasValidationErrors(issues) {
121
+ return issues.some((issue) => issue.severity === 'error');
122
+ }
123
+ function focusTargetIdForIssue(issue) {
124
+ const p = 'pk-editor-';
125
+ switch (issue.field) {
126
+ case 'metadata':
127
+ if (issue.code === 'missing-key' || issue.code === 'invalid-key') {
128
+ return `${p}meta-key`;
129
+ }
130
+ if (issue.code === 'missing-name') {
131
+ return `${p}meta-name`;
132
+ }
133
+ if (issue.code === 'unused-variable') {
134
+ return `${p}variables`;
135
+ }
136
+ return `${p}meta-key`;
137
+ case 'subject':
138
+ return `${p}meta-subject`;
139
+ case 'document':
140
+ return `${p}canvas`;
141
+ case 'previewData':
142
+ return issue.variable ? `${p}preview-${domIdSegment(issue.variable)}` : `${p}preview-data`;
143
+ default:
144
+ return `${p}root`;
145
+ }
146
+ }
147
+ function domIdSegment(value) {
148
+ return encodeURIComponent(value).replace(/%/g, '_');
149
+ }
150
+ function inlineIssueId(code, variable) {
151
+ const suffix = variable ? `${code}-${domIdSegment(variable)}` : code;
152
+ return `pk-editor-issue-${suffix}`;
153
+ }
154
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validation/validate.ts"],"names":[],"mappings":"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"}
@@ -61,7 +61,7 @@ function VariableCatalogue({ availableVariables, metadataVariables, onMetadataVa
61
61
  }, [metadataVariables, onMetadataVariablesChange]);
62
62
  const insertDisabled = target === null;
63
63
  const insertDisabledReason = 'Focus the subject field (or another editable target) before inserting a variable.';
64
- return ((0, jsx_runtime_1.jsxs)("section", { className: `${p}variables`, "data-testid": `${p}variables`, children: [(0, jsx_runtime_1.jsx)("h2", { className: `${p}variables-heading`, children: "Available variables" }), (0, jsx_runtime_1.jsx)("input", { ref: fallbackSelectRef, className: `${p}variables-clipboard-fallback`, type: "text", readOnly: true, "aria-hidden": "true", tabIndex: -1, "data-testid": `${p}variables-clipboard-fallback` }), entries.length === 0 ? ((0, jsx_runtime_1.jsx)("p", { className: `${p}variables-empty`, children: "No variables declared yet." })) : ((0, jsx_runtime_1.jsx)("ul", { className: `${p}variables-list`, children: entries.map((entry) => {
64
+ return ((0, jsx_runtime_1.jsxs)("section", { id: `${p}variables`, className: `${p}variables`, "data-testid": `${p}variables`, tabIndex: -1, "aria-label": "Available variables", children: [(0, jsx_runtime_1.jsx)("h2", { className: `${p}variables-heading`, children: "Available variables" }), (0, jsx_runtime_1.jsx)("input", { ref: fallbackSelectRef, className: `${p}variables-clipboard-fallback`, type: "text", readOnly: true, "aria-hidden": "true", tabIndex: -1, "data-testid": `${p}variables-clipboard-fallback` }), entries.length === 0 ? ((0, jsx_runtime_1.jsx)("p", { className: `${p}variables-empty`, children: "No variables declared yet." })) : ((0, jsx_runtime_1.jsx)("ul", { className: `${p}variables-list`, children: entries.map((entry) => {
65
65
  const placeholder = (0, insert_at_cursor_1.variablePlaceholder)(entry.name);
66
66
  const label = entry.label ?? entry.name;
67
67
  return ((0, jsx_runtime_1.jsxs)("li", { className: `${p}variables-item`, children: [(0, jsx_runtime_1.jsxs)("div", { className: `${p}variables-item-main`, children: [(0, jsx_runtime_1.jsx)("span", { className: `${p}variables-item-label`, children: label }), (0, jsx_runtime_1.jsx)("code", { className: `${p}variables-item-placeholder`, children: placeholder }), entry.description ? ((0, jsx_runtime_1.jsx)("span", { className: `${p}variables-item-description`, children: entry.description })) : null] }), (0, jsx_runtime_1.jsxs)("div", { className: `${p}variables-item-actions`, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", className: `${p}variables-copy`, onClick: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"VariableCatalogue.js","sourceRoot":"","sources":["../../src/variables/VariableCatalogue.tsx"],"names":[],"mappings":";;AAsBA,8CAqMC;;AA3ND,iCAAoE;AAEpE,oEAA+D;AAC/D,0DAAyD;AACzD,mEAAmE;AAEnE,2CAAkD;AAClD,mDAAoE;AACpE,2DAAgE;AAchE,SAAgB,iBAAiB,CAAC,EAChC,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,GACF;IACvB,MAAM,CAAC,GAAG,2CAAmB,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,qCAAkB,GAAE,CAAC;IACxC,MAAM,OAAO,GAAG,IAAA,6CAAyB,EAAC,kBAAkB,EAAE,iBAAiB,CAAC,CAAC;IACjF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,gBAAQ,EAGtC,IAAI,CAAC,CAAC;IAChB,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,EAAC,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,IAAA,gBAAQ,EAAgB,IAAI,CAAC,CAAC;IAC9D,MAAM,iBAAiB,GAAG,IAAA,cAAM,EAA0B,IAAI,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,IAAA,aAAK,GAAE,CAAC;IAE3B,MAAM,UAAU,GAAG,IAAA,mBAAW,EAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QACpD,MAAM,IAAI,GAAG,IAAA,sCAAmB,EAAC,IAAI,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAmB,EAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAA,gCAAgB,EAAC,MAAM,CAAC,CAAC;QACtC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC;YACrC,IAAI,EAAE,EAAE,CAAC;gBACP,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;gBAChB,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,EAAE,CAAC,MAAM,EAAE,CAAC;YACd,CAAC;QACH,CAAC;QACD,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,IAAA,mBAAW,EAC9B,CAAC,IAAY,EAAE,EAAE;QACf,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,IAAA,sCAAmB,EAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAC;IAGF,MAAM,uBAAuB,GAAG,IAAA,mBAAW,EAAC,CAAC,KAAuB,EAAE,EAAE;QACtE,KAAK,CAAC,cAAc,EAAE,CAAC;IACzB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,SAAS,GAAG,IAAA,mBAAW,EAC3B,CAAC,KAAsB,EAAE,EAAE;QACzB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,WAAW,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QACD,IAAI,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,WAAW,CAAC,IAAI,IAAI,wBAAwB,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,cAAc,CAAC,EAAE,CAAC,CAAC;QACnB,yBAAyB,CAAC,CAAC,GAAG,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1D,CAAC,EACD,CAAC,iBAAiB,EAAE,WAAW,EAAE,yBAAyB,CAAC,CAC5D,CAAC;IAEF,MAAM,YAAY,GAAG,IAAA,mBAAW,EAC9B,CAAC,IAAY,EAAE,EAAE;QACf,yBAAyB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC;IACjF,CAAC,EACD,CAAC,iBAAiB,EAAE,yBAAyB,CAAC,CAC/C,CAAC;IAEF,MAAM,cAAc,GAAG,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,oBAAoB,GACxB,mFAAmF,CAAC;IAEtF,OAAO,CACL,qCAAS,SAAS,EAAE,GAAG,CAAC,WAAW,iBAAe,GAAG,CAAC,WAAW,aAC/D,+BAAI,SAAS,EAAE,GAAG,CAAC,mBAAmB,oCAA0B,EAGhE,kCACE,GAAG,EAAE,iBAAiB,EACtB,SAAS,EAAE,GAAG,CAAC,8BAA8B,EAC7C,IAAI,EAAC,MAAM,EACX,QAAQ,uBACI,MAAM,EAClB,QAAQ,EAAE,CAAC,CAAC,iBACC,GAAG,CAAC,8BAA8B,GAC/C,EAED,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtB,8BAAG,SAAS,EAAE,GAAG,CAAC,iBAAiB,2CAAgC,CACpE,CAAC,CAAC,CAAC,CACF,+BAAI,SAAS,EAAE,GAAG,CAAC,gBAAgB,YAChC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;oBACrB,MAAM,WAAW,GAAG,IAAA,sCAAmB,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACpD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC;oBACxC,OAAO,CACL,gCAAqB,SAAS,EAAE,GAAG,CAAC,gBAAgB,aAClD,iCAAK,SAAS,EAAE,GAAG,CAAC,qBAAqB,aACvC,iCAAM,SAAS,EAAE,GAAG,CAAC,sBAAsB,YAAG,KAAK,GAAQ,EAC3D,iCAAM,SAAS,EAAE,GAAG,CAAC,4BAA4B,YAAG,WAAW,GAAQ,EACtE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CACnB,iCAAM,SAAS,EAAE,GAAG,CAAC,4BAA4B,YAAG,KAAK,CAAC,WAAW,GAAQ,CAC9E,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,iCAAK,SAAS,EAAE,GAAG,CAAC,wBAAwB,aAC1C,mCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,GAAG,CAAC,gBAAgB,EAC/B,OAAO,EAAE,GAAG,EAAE;4CACZ,KAAK,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wCAC9B,CAAC,iBACY,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAI,EAAE,YAE9C,IAAA,+BAAe,EAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,GACnC,EACT,mCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,GAAG,CAAC,kBAAkB,EACjC,WAAW,EAAE,uBAAuB,EACpC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EACvC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,UAAU,WAAW,EAAE,gBAEpE,cAAc;4CACZ,CAAC,CAAC,oBAAoB;4CACtB,CAAC,CAAC,UAAU,WAAW,yBAAyB,iBAEvC,GAAG,CAAC,oBAAoB,KAAK,CAAC,IAAI,EAAE,uBAG1C,IACL,KAnCC,KAAK,CAAC,IAAI,CAoCd,CACN,CAAC;gBACJ,CAAC,CAAC,GACC,CACN,EAED,iCAAK,SAAS,EAAE,GAAG,CAAC,oBAAoB,aACtC,+BAAI,SAAS,EAAE,GAAG,CAAC,4BAA4B,mCAAyB,EACxE,8BAAG,SAAS,EAAE,GAAG,CAAC,yBAAyB,uIAGvC,EACH,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC9B,+BAAI,SAAS,EAAE,GAAG,CAAC,yBAAyB,YACzC,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC/B,gCAAe,SAAS,EAAE,GAAG,CAAC,yBAAyB,aACrD,2CAAO,IAAA,sCAAmB,EAAC,IAAI,CAAC,GAAQ,EACxC,mCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,GAAG,CAAC,kBAAkB,EACjC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,iBACpB,GAAG,CAAC,oBAAoB,IAAI,EAAE,uBAGpC,KATF,IAAI,CAUR,CACN,CAAC,GACC,CACN,CAAC,CAAC,CAAC,IAAI,EACR,kCAAM,SAAS,EAAE,GAAG,CAAC,eAAe,EAAE,QAAQ,EAAE,SAAS,aACvD,kCAAO,SAAS,EAAE,GAAG,CAAC,qBAAqB,EAAE,OAAO,EAAE,UAAU,6BAExD,EACR,kCACE,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,GAAG,CAAC,qBAAqB,EACpC,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oCAClB,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oCACnC,WAAW,CAAC,IAAI,CAAC,CAAC;gCACpB,CAAC,EACD,WAAW,EAAC,gBAAgB,iBACf,GAAG,CAAC,qBAAqB,GACtC,EACF,mCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,GAAG,CAAC,sBAAsB,iBACxB,GAAG,CAAC,sBAAsB,oBAGhC,EACR,QAAQ,CAAC,CAAC,CAAC,CACV,8BAAG,SAAS,EAAE,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAC,QAAQ,YACnD,QAAQ,GACP,CACL,CAAC,CAAC,CAAC,IAAI,IACH,IACH,IACE,CACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"VariableCatalogue.js","sourceRoot":"","sources":["../../src/variables/VariableCatalogue.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@singleton-sd/post-kit-editor",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "private": false,
5
5
  "description": "React admin editor component for PostKit email templates",
6
6
  "license": "MIT",