@useinsider/guido 1.0.0-beta.a0d6eee → 1.0.0-beta.a3ed027

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 (59) hide show
  1. package/dist/@types/generic.d.ts +3 -14
  2. package/dist/components/Guido.vue.d.ts +3 -6
  3. package/dist/components/Guido.vue.js +8 -8
  4. package/dist/components/Guido.vue2.js +36 -48
  5. package/dist/components/organisms/design-preview/AmpErrorModal.vue.d.ts +16 -0
  6. package/dist/components/organisms/design-preview/AmpErrorModal.vue.js +21 -0
  7. package/dist/components/organisms/design-preview/AmpErrorModal.vue2.js +30 -0
  8. package/dist/components/organisms/design-preview/DesktopPreview.vue.d.ts +16 -0
  9. package/dist/components/organisms/design-preview/DesktopPreview.vue.js +22 -0
  10. package/dist/components/organisms/design-preview/DesktopPreview.vue2.js +43 -0
  11. package/dist/components/organisms/design-preview/EmailPreview.vue.d.ts +16 -0
  12. package/dist/components/organisms/design-preview/EmailPreview.vue.js +17 -0
  13. package/dist/components/organisms/design-preview/EmailPreview.vue2.js +33 -0
  14. package/dist/components/organisms/design-preview/EmailView.vue.d.ts +18 -0
  15. package/dist/components/organisms/design-preview/EmailView.vue.js +19 -0
  16. package/dist/components/organisms/design-preview/EmailView.vue2.js +24 -0
  17. package/dist/components/organisms/design-preview/InboxView.vue.d.ts +17 -0
  18. package/dist/components/organisms/design-preview/InboxView.vue.js +19 -0
  19. package/dist/components/organisms/design-preview/InboxView.vue2.js +23 -0
  20. package/dist/components/organisms/design-preview/MobilePreview.vue.d.ts +17 -0
  21. package/dist/components/organisms/design-preview/MobilePreview.vue.js +17 -0
  22. package/dist/components/organisms/design-preview/MobilePreview.vue2.js +23 -0
  23. package/dist/components/organisms/header/AmpToggle.vue.d.ts +2 -0
  24. package/dist/components/organisms/header/AmpToggle.vue.js +17 -0
  25. package/dist/components/organisms/header/AmpToggle.vue2.js +48 -0
  26. package/dist/components/organisms/header/MiddleSlot.vue.js +6 -6
  27. package/dist/components/organisms/header/MiddleSlot.vue2.js +20 -15
  28. package/dist/components/organisms/header/RightSlot.vue.js +7 -7
  29. package/dist/components/organisms/header/RightSlot.vue2.js +22 -24
  30. package/dist/components/organisms/header/ViewOptions.vue.js +6 -6
  31. package/dist/components/organisms/header/ViewOptions.vue2.js +10 -29
  32. package/dist/components/organisms/header/version-history/ViewOptions.vue.js +3 -3
  33. package/dist/components/organisms/header/version-history/ViewOptions.vue2.js +16 -34
  34. package/dist/composables/useActionsApi.d.ts +2 -0
  35. package/dist/composables/useActionsApi.js +47 -36
  36. package/dist/composables/useDebounce.d.ts +4 -0
  37. package/dist/composables/useDebounce.js +12 -0
  38. package/dist/composables/useMobileGmailFit.d.ts +5 -0
  39. package/dist/composables/useMobileGmailFit.js +69 -0
  40. package/dist/composables/useStripo.js +17 -23
  41. package/dist/enums/emailPreview.d.ts +3 -0
  42. package/dist/enums/emailPreview.js +6 -0
  43. package/dist/enums/gmailMobilePreview.d.ts +7 -0
  44. package/dist/enums/gmailMobilePreview.js +17 -0
  45. package/dist/extensions/DynamicContent/dynamic-content.js +15 -13
  46. package/dist/guido.css +1 -1
  47. package/dist/inbox-mockup.svg +39 -0
  48. package/dist/phone-mockup.svg +31 -0
  49. package/dist/stores/editor.d.ts +3 -0
  50. package/dist/stores/editor.js +6 -3
  51. package/package.json +1 -1
  52. package/dist/stores/dynamic-content.d.ts +0 -27
  53. package/dist/stores/dynamic-content.js +0 -23
  54. package/dist/utils/arrayUtil.d.ts +0 -1
  55. package/dist/utils/arrayUtil.js +0 -10
  56. package/dist/utils/genericUtil.d.ts +0 -2
  57. package/dist/utils/genericUtil.js +0 -7
  58. package/dist/utils/tooltipUtils.d.ts +0 -2
  59. package/dist/utils/tooltipUtils.js +0 -11
@@ -9,18 +9,7 @@ export type DynamicContent = {
9
9
  text: string;
10
10
  fallback?: string;
11
11
  };
12
- export interface TooltipOptions {
13
- id: string;
14
- dynamicPosition: boolean;
15
- staticPosition: 'top center' | 'top left' | 'top right' | 'bottom center' | 'bottom left' | 'bottom right' | 'right center' | 'right top' | 'right bottom' | 'left center' | 'left top' | 'left bottom';
16
- iconStatus: boolean;
17
- offset?: {
18
- x: number;
19
- y: number;
20
- };
21
- preventXss?: boolean;
12
+ export interface EmailData {
13
+ senderName: string;
14
+ subject: string;
22
15
  }
23
- export type MergeTag = {
24
- label: string;
25
- value: string;
26
- };
@@ -1,4 +1,4 @@
1
- import type { DynamicContent, GuidoConfig } from '@@/Types/generic';
1
+ import type { DynamicContent, GuidoConfig, EmailData } from '@@/Types/generic';
2
2
  import type { Template } from '@@/Types/stripo';
3
3
  type __VLS_Props = {
4
4
  templateId: string;
@@ -8,8 +8,8 @@ type __VLS_Props = {
8
8
  username?: string;
9
9
  html?: string;
10
10
  css?: string;
11
- preselectedDynamicContentList: DynamicContent[];
12
11
  guidoConfig: GuidoConfig;
12
+ emailData?: EmailData;
13
13
  };
14
14
  declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<__VLS_Props>, {
15
15
  dynamicContent: {
@@ -20,10 +20,7 @@ declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<__
20
20
  "dynamic-content:open": (detail: DynamicContent | null) => void;
21
21
  back: () => void;
22
22
  "save:start": () => void;
23
- "save:complete": (data: {
24
- template: Omit<Template, "forceRecreate">;
25
- dynamicContentList: DynamicContent[];
26
- }) => void;
23
+ "save:complete": (template: Omit<Template, "forceRecreate">) => void;
27
24
  }, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<__VLS_Props>>>, {}>;
28
25
  export default _default;
29
26
  type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
@@ -1,18 +1,18 @@
1
1
  import o from "./Guido.vue2.js";
2
2
  /* empty css */
3
- import i from "../_virtual/_plugin-vue2_normalizer.js";
3
+ import t from "../_virtual/_plugin-vue2_normalizer.js";
4
4
  var s = function() {
5
- var e = this, r = e._self._c, t = e._self._setupProxy;
6
- return r("div", { staticClass: "guido-editor__wrapper" }, [r(t.HeaderWrapper), r("div", { staticClass: "guido-editor__container", attrs: { id: "guido-editor" } })], 1);
7
- }, _ = [], a = /* @__PURE__ */ i(
5
+ var i = this, r = i._self._c, e = i._self._setupProxy;
6
+ return r("div", { staticClass: "guido-editor__wrapper" }, [r(e.HeaderWrapper), r(e.EmailPreview, { directives: [{ name: "show", rawName: "v-show", value: e.editorStore.isPreviewModeOpen, expression: "editorStore.isPreviewModeOpen" }], attrs: { "email-data": i.emailData, "is-visible": e.editorStore.isPreviewModeOpen } }), r("div", { directives: [{ name: "show", rawName: "v-show", value: !e.editorStore.isPreviewModeOpen, expression: "!editorStore.isPreviewModeOpen" }], staticClass: "guido-editor__container", attrs: { id: "guido-editor" } })], 1);
7
+ }, a = [], d = /* @__PURE__ */ t(
8
8
  o,
9
9
  s,
10
- _,
10
+ a,
11
11
  !1,
12
12
  null,
13
- "f9fbdc93"
13
+ "7836f831"
14
14
  );
15
- const f = a.exports;
15
+ const m = d.exports;
16
16
  export {
17
- f as default
17
+ m as default
18
18
  };
@@ -1,12 +1,13 @@
1
- import { defineComponent as h, onMounted as L } from "vue";
2
- import { provideGuidoActions as w } from "../composables/useGuidoActions.js";
3
- import { usePartner as E } from "../composables/usePartner.js";
1
+ import { defineComponent as w, onMounted as E } from "vue";
2
+ import { provideGuidoActions as S } from "../composables/useGuidoActions.js";
3
+ import { usePartner as D } from "../composables/usePartner.js";
4
4
  import { useStripo as _ } from "../composables/useStripo.js";
5
5
  import { DefaultUsername as G, DefaultGuidoConfig as I } from "../enums/defaults.js";
6
+ import P from "./organisms/design-preview/EmailPreview.vue.js";
6
7
  import k from "./organisms/header/HeaderWrapper.vue.js";
7
- import { useStripoApi as P } from "../services/stripoApi.js";
8
- import { useDynamicContentStore as T } from "../stores/dynamic-content.js";
9
- const K = /* @__PURE__ */ h({
8
+ import { useStripoApi as T } from "../services/stripoApi.js";
9
+ import { useEditorStore as N } from "../stores/editor.js";
10
+ const M = /* @__PURE__ */ w({
10
11
  __name: "Guido",
11
12
  props: {
12
13
  templateId: null,
@@ -16,34 +17,27 @@ const K = /* @__PURE__ */ h({
16
17
  username: null,
17
18
  html: null,
18
19
  css: null,
19
- preselectedDynamicContentList: null,
20
- guidoConfig: null
20
+ guidoConfig: null,
21
+ emailData: null
21
22
  },
22
23
  emits: ["dynamic-content:open", "back", "save:start", "save:complete"],
23
- setup(b, { expose: S, emit: t }) {
24
- const o = b, n = T(), c = o.preselectedDynamicContentList || [], { getPartnerName: i, getProductType: s } = E(), {
25
- templateId: a,
24
+ setup(C, { expose: b, emit: t }) {
25
+ const o = C, { getPartnerName: n, getProductType: a } = D(), {
26
+ templateId: c,
26
27
  userId: r,
27
- guidoConfig: l,
28
- html: d = "",
29
- css: m = "",
30
- partnerName: u = i(),
31
- productType: p = s(),
32
- username: y = G
28
+ guidoConfig: i,
29
+ html: s = "",
30
+ css: l = "",
31
+ partnerName: d = n(),
32
+ productType: u = a(),
33
+ username: m = G
33
34
  } = o;
34
35
  window.GuidoConfig = {
35
36
  ...I,
36
- ...l
37
+ ...i
37
38
  };
38
- const { initPlugin: g } = _({
39
- emailId: a,
40
- userId: r,
41
- username: y,
42
- partnerName: u,
43
- productType: p,
44
- preselectedDynamicContentList: c
45
- }), { getDefaultTemplate: C } = P();
46
- w({
39
+ const { initPlugin: p } = _({ emailId: c, userId: r, username: m, partnerName: d, productType: u }), { getDefaultTemplate: f } = T(), h = N();
40
+ S({
47
41
  onBack: () => {
48
42
  console.debug("guido:back"), t("back");
49
43
  },
@@ -51,45 +45,39 @@ const K = /* @__PURE__ */ h({
51
45
  console.debug("guido:save:start"), t("save:start");
52
46
  },
53
47
  onSaveComplete: (e) => {
54
- console.debug("guido:save:complete", {
55
- template: e,
56
- dynamicContentList: n.getSelectedDynamicContentList
57
- }), t("save:complete", {
58
- template: e,
59
- dynamicContentList: n.getSelectedDynamicContentList
60
- });
48
+ console.debug("guido:save:complete", e), t("save:complete", e);
61
49
  }
62
50
  });
63
- const f = (e) => {
64
- console.debug("dynamic-content:close", e), n.setSelectedDynamicContent(e), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: e }));
65
- }, v = () => {
51
+ const g = (e) => {
52
+ console.debug("dynamic-content:close", e), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: e }));
53
+ }, y = () => {
66
54
  console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
67
55
  };
68
- return L(async () => {
56
+ return E(async () => {
69
57
  console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow");
70
58
  try {
71
59
  let e = {
72
- html: d,
73
- css: m,
60
+ html: s,
61
+ css: l,
74
62
  forceRecreate: !0
75
63
  // TODO: It should be false for old templates. We will communicate with Stripo
76
64
  };
77
- e.html || (e = await C()), await g(e), n.selectedDynamicContentList = c;
65
+ e.html || (e = await f()), await p(e);
78
66
  } catch (e) {
79
67
  console.error("Failed to initialize Stripo editor:", e);
80
68
  }
81
69
  document.addEventListener("dynamic-content:open", (e) => {
82
- const D = e;
83
- console.debug("dynamic-content:open", D.detail), t("dynamic-content:open", D.detail);
70
+ const v = e;
71
+ console.debug("dynamic-content:open", v.detail), t("dynamic-content:open", v.detail);
84
72
  });
85
- }), S({
73
+ }), b({
86
74
  dynamicContent: {
87
- insert: f,
88
- close: v
75
+ insert: g,
76
+ close: y
89
77
  }
90
- }), { __sfc: !0, dynamicContentStore: n, props: o, preselectedDynamicContentList: c, getPartnerName: i, getProductType: s, templateId: a, userId: r, guidoConfig: l, html: d, css: m, partnerName: u, productType: p, username: y, emit: t, initPlugin: g, getDefaultTemplate: C, insertDynamicContent: f, closeDynamicContent: v, HeaderWrapper: k };
78
+ }), { __sfc: !0, props: o, getPartnerName: n, getProductType: a, templateId: c, userId: r, guidoConfig: i, html: s, css: l, partnerName: d, productType: u, username: m, emit: t, initPlugin: p, getDefaultTemplate: f, editorStore: h, insertDynamicContent: g, closeDynamicContent: y, EmailPreview: P, HeaderWrapper: k };
91
79
  }
92
80
  });
93
81
  export {
94
- K as default
82
+ M as default
95
83
  };
@@ -0,0 +1,16 @@
1
+ interface Props {
2
+ errors: string[];
3
+ }
4
+ declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<Props>, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {
5
+ close: () => void;
6
+ }, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<Props>>>, {}>;
7
+ export default _default;
8
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
9
+ type __VLS_TypePropsToOption<T> = {
10
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
11
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
12
+ } : {
13
+ type: import('vue').PropType<T[K]>;
14
+ required: true;
15
+ };
16
+ };
@@ -0,0 +1,21 @@
1
+ import n from "./AmpErrorModal.vue2.js";
2
+ import a from "../../../_virtual/_plugin-vue2_normalizer.js";
3
+ var i = function() {
4
+ var e = this, o = e._self._c, t = e._self._setupProxy;
5
+ return o(t.InModalV2, { attrs: { id: "amp-error-modal", "close-button-status": "", "close-on-outside-click": "", "description-status": "", "footer-status": "", status: "", size: "medium", "description-text": t.trans("email.amp-validation-description"), "footer-button-group-options": t.footerButtonOptions, "title-text": t.trans("email.amp-validation-title") }, on: { cancelOrBackButtonEvent: t.handleClose, onCloseEvent: t.handleClose, primaryButtonEvent: t.handleFixInCodeEditor }, scopedSlots: e._u([{ key: "contentSlot", fn: function() {
6
+ return [o("div", { staticClass: "d-f f-d-c" }, [o("div", { staticClass: "mb-3" }, [o("div", { staticClass: "l-s-5 f-s-1 f-w-600 t-c-55 t-t-u" }, [e._v(" " + e._s(`${t.trans("products.errors")}(${t.errorCount})`) + " ")])]), o("div", { staticClass: "d-f f-d-c g-13 max-h-21-s o-y-a", staticStyle: { gap: "16px" } }, e._l(t.props.errors, function(s, r) {
7
+ return o(t.InOnPageMessage, { key: r, attrs: { icon: "filled-error-box", size: "medium", type: "alert", text: s } });
8
+ }), 1)])];
9
+ }, proxy: !0 }]) });
10
+ }, l = [], c = /* @__PURE__ */ a(
11
+ n,
12
+ i,
13
+ l,
14
+ !1,
15
+ null,
16
+ null
17
+ );
18
+ const f = c.exports;
19
+ export {
20
+ f as default
21
+ };
@@ -0,0 +1,30 @@
1
+ import { defineComponent as m } from "vue";
2
+ import { useToaster as f } from "../../../composables/useToaster.js";
3
+ import { useTranslations as u } from "../../../composables/useTranslations.js";
4
+ import { useEditorStore as E } from "../../../stores/editor.js";
5
+ import { InOnPageMessage as g, InModalV2 as y } from "@useinsider/design-system-vue";
6
+ const x = /* @__PURE__ */ m({
7
+ __name: "AmpErrorModal",
8
+ props: {
9
+ errors: null
10
+ },
11
+ emits: ["close"],
12
+ setup(a, { emit: o }) {
13
+ const r = a, e = u(), t = E(), { showToaster: i } = f(), p = r.errors.length, d = () => {
14
+ o("close");
15
+ }, l = () => {
16
+ var n, s;
17
+ o("close"), t.isPreviewModeOpen = !1, (s = (n = window.StripoEditorApi) == null ? void 0 : n.codeEditorApi) != null && s.openCodeEditor ? window.StripoEditorApi.codeEditorApi.openCodeEditor() : i({
18
+ type: "error",
19
+ message: "StripoEditorApi codeEditorApi not available"
20
+ });
21
+ }, c = {
22
+ primaryButton: { type: "primary", labelText: e("email.amp-validation-fix") },
23
+ cancelOrBackButton: { type: "secondary", labelText: e("campaign-builder.cancel"), styling: "ghost" }
24
+ };
25
+ return { __sfc: !0, props: r, emit: o, trans: e, editorStore: t, showToaster: i, errorCount: p, handleClose: d, handleFixInCodeEditor: l, footerButtonOptions: c, InModalV2: y, InOnPageMessage: g };
26
+ }
27
+ });
28
+ export {
29
+ x as default
30
+ };
@@ -0,0 +1,16 @@
1
+ import type { EmailData } from '@@/Types/generic';
2
+ interface Props {
3
+ emailHtml: string;
4
+ emailData?: EmailData;
5
+ }
6
+ declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<Props>, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<Props>>>, {}>;
7
+ export default _default;
8
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
9
+ type __VLS_TypePropsToOption<T> = {
10
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
11
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
12
+ } : {
13
+ type: import('vue').PropType<T[K]>;
14
+ required: true;
15
+ };
16
+ };
@@ -0,0 +1,22 @@
1
+ import i from "./DesktopPreview.vue2.js";
2
+ /* empty css */
3
+ import a from "../../../_virtual/_plugin-vue2_normalizer.js";
4
+ var r = function() {
5
+ var e = this, t = e._self._c, s = e._self._setupProxy;
6
+ return t("div", { ref: "containerRef", staticStyle: { "min-height": "720px", height: "80vh" } }, [t(s.InContainer, { staticClass: "s-2 m-b-5 desktop-preview-container", attrs: { "full-width-content-status": "", "header-status": "", "border-radius": "bor-r-1", "container-type": "default", "footer-status": !1 }, scopedSlots: e._u([{ key: "headerLeftSlot", fn: function() {
7
+ return [t("div", { staticClass: "d-f a-i-c j-c-s-b w-1" }, [t("div", { staticClass: "d-f a-i-c" }, [t("div", { staticClass: "b-c-49 bor-r-100 w-5-s h-5-s d-f a-i-c j-c-c" }, [t(s.InIcons, { attrs: { name: "line-menu-profile" } })], 1), t("div", { staticClass: "d-f f-d-c ml-2" }, [t("p", { staticClass: "t-c-53 f-w-600 f-s-1 l-h-1" }, [e._v(" " + e._s(s.senderName) + " ")]), t("p", { staticClass: "t-c-55 f-w-400 f-s-12 l-h-1" }, [e._v(" " + e._s(s.subject) + " ")])])])])];
8
+ }, proxy: !0 }, { key: "headerRightSlot", fn: function() {
9
+ return [t("div", { staticClass: "d-f a-i-c j-c-c" }, [t(s.InProgress, { staticClass: "min-w-15-s", attrs: { id: "email-size-progress", "description-status": "", "description-position": "left", description: s.emailSize, "max-value": s.MAX_EMAIL_WEIGHT, type: s.progressType, value: s.progressValue } }), t(s.InTooltip, { staticClass: "d-f ml-1", attrs: { id: "email-size-tooltip", align: "center", position: "bottom", text: s.trans("email.preview-design-size-tooltip") } })], 1)];
10
+ }, proxy: !0 }]) }, [t("iframe", { staticClass: "email-iframe w-1 bor-w-0", style: { height: s.iframeHeight }, attrs: { sandbox: "allow-same-origin allow-popups allow-forms allow-scripts", srcdoc: e.emailHtml } })])], 1);
11
+ }, o = [], l = /* @__PURE__ */ a(
12
+ i,
13
+ r,
14
+ o,
15
+ !1,
16
+ null,
17
+ "95dad178"
18
+ );
19
+ const d = l.exports;
20
+ export {
21
+ d as default
22
+ };
@@ -0,0 +1,43 @@
1
+ import { defineComponent as I, computed as d, ref as n, onMounted as B, onUnmounted as w, watch as z } from "vue";
2
+ import { useTranslations as E } from "../../../composables/useTranslations.js";
3
+ import { InTooltip as M, InProgress as R, InIcons as y, InContainer as C } from "@useinsider/design-system-vue";
4
+ import { MAX_EMAIL_WEIGHT as c } from "../../../enums/emailPreview.js";
5
+ const x = /* @__PURE__ */ I({
6
+ __name: "DesktopPreview",
7
+ props: {
8
+ emailHtml: null,
9
+ emailData: null
10
+ },
11
+ setup(h) {
12
+ const t = h, r = E(), g = d(() => {
13
+ var e;
14
+ return ((e = t.emailData) == null ? void 0 : e.senderName) || `(${r("settings.sender-name")})`;
15
+ }), _ = d(() => {
16
+ var e;
17
+ return ((e = t.emailData) == null ? void 0 : e.subject) || r("newsletter.subject");
18
+ }), u = n("~-- KB"), m = n(0), i = n("success"), a = n(), p = n("400px"), f = () => {
19
+ if (!t.emailHtml)
20
+ return;
21
+ const e = new Blob([t.emailHtml]).size, o = Math.round(e / 1024);
22
+ u.value = `~${o} KB`, m.value = Math.min(o, c), o < c ? i.value = "success" : i.value = "warning";
23
+ }, l = () => {
24
+ if (!a.value)
25
+ return;
26
+ const e = a.value.querySelector(".in-container");
27
+ if (!e)
28
+ return;
29
+ const o = e.getBoundingClientRect(), v = e.querySelector(".in-container__header"), H = v ? v.getBoundingClientRect().height : 0, b = o.height - H;
30
+ p.value = `${b}px`;
31
+ }, s = n();
32
+ return B(() => {
33
+ l(), s.value = new ResizeObserver(() => {
34
+ l();
35
+ }), a.value && s.value.observe(a.value);
36
+ }), w(() => {
37
+ s.value && s.value.disconnect();
38
+ }), z(() => t.emailHtml, f, { immediate: !0 }), { __sfc: !0, trans: r, props: t, senderName: g, subject: _, emailSize: u, progressValue: m, progressType: i, containerRef: a, iframeHeight: p, calculateEmailSize: f, calculateIframeHeight: l, resizeObserver: s, InContainer: C, InIcons: y, InProgress: R, InTooltip: M, MAX_EMAIL_WEIGHT: c };
39
+ }
40
+ });
41
+ export {
42
+ x as default
43
+ };
@@ -0,0 +1,16 @@
1
+ import type { EmailData } from '@@/Types/generic';
2
+ interface Props {
3
+ isVisible: boolean;
4
+ emailData?: EmailData;
5
+ }
6
+ declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<Props>, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<Props>>>, {}>;
7
+ export default _default;
8
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
9
+ type __VLS_TypePropsToOption<T> = {
10
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
11
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
12
+ } : {
13
+ type: import('vue').PropType<T[K]>;
14
+ required: true;
15
+ };
16
+ };
@@ -0,0 +1,17 @@
1
+ import i from "./EmailPreview.vue2.js";
2
+ import e from "../../../_virtual/_plugin-vue2_normalizer.js";
3
+ var r = function() {
4
+ var t = this, s = t._self._c, a = t._self._setupProxy;
5
+ return t.isVisible ? s("div", { staticClass: "d-f f-d-c h-1 b-c-5 bor-r-2 pb-5" }, [s("div", { staticClass: "f-g-1 d-f p-5 o-a g-4 min-h-600" }, [a.isLoading ? [s("div", { staticClass: "d-f a-i-c j-c-c w-1 h-1 f-g-1" }, [s(a.InLoading, { attrs: { "color-class": "i-c-1", size: "32" } })], 1)] : [s(a.DesktopPreview, { staticClass: "f-g-1 min-w-0", attrs: { "email-data": t.emailData, "email-html": a.currentHtml } }), s(a.MobilePreview, { staticClass: "f-0 min-w-a", attrs: { "email-data": t.emailData, "email-html": a.currentHtml, "is-amp": a.isAmp } })]], 2)]) : t._e();
6
+ }, l = [], m = /* @__PURE__ */ e(
7
+ i,
8
+ r,
9
+ l,
10
+ !1,
11
+ null,
12
+ null
13
+ );
14
+ const f = m.exports;
15
+ export {
16
+ f as default
17
+ };
@@ -0,0 +1,33 @@
1
+ import { defineComponent as u, ref as l, computed as n, watch as d, onMounted as v } from "vue";
2
+ import { useActionsApi as w } from "../../../composables/useActionsApi.js";
3
+ import { useToaster as y } from "../../../composables/useToaster.js";
4
+ import { useEditorStore as P } from "../../../stores/editor.js";
5
+ import { InLoading as _ } from "@useinsider/design-system-vue";
6
+ import g from "./DesktopPreview.vue.js";
7
+ import h from "./MobilePreview.vue.js";
8
+ const L = /* @__PURE__ */ u({
9
+ __name: "EmailPreview",
10
+ props: {
11
+ isVisible: { type: Boolean },
12
+ emailData: null
13
+ },
14
+ setup(p) {
15
+ const o = p, { getPreviewData: s } = w(), { showToaster: m } = y(), e = P(), t = l(""), r = l(!1), c = n(() => e.emailFormat === "amp" && e.ampHtml ? e.ampHtml : t.value), f = n(() => e.emailFormat === "amp"), a = async () => {
16
+ r.value = !0;
17
+ try {
18
+ const i = await s();
19
+ t.value = i.html;
20
+ } catch {
21
+ console.error("Failed to load preview"), m({ type: "error", message: "Failed to load email preview. Please try again later." });
22
+ } finally {
23
+ r.value = !1;
24
+ }
25
+ };
26
+ return d(() => o.isVisible, (i) => i && a()), v(() => {
27
+ o.isVisible && a();
28
+ }), { __sfc: !0, props: o, getPreviewData: s, showToaster: m, editorStore: e, html: t, isLoading: r, currentHtml: c, isAmp: f, loadPreview: a, InLoading: _, DesktopPreview: g, MobilePreview: h };
29
+ }
30
+ });
31
+ export {
32
+ L as default
33
+ };
@@ -0,0 +1,18 @@
1
+ interface Props {
2
+ emailHtml: string;
3
+ isAmp?: boolean;
4
+ }
5
+ declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<Props>, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {
6
+ "back-to-inbox": () => void;
7
+ load: () => void;
8
+ }, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<Props>>>, {}>;
9
+ export default _default;
10
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
11
+ type __VLS_TypePropsToOption<T> = {
12
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
13
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
14
+ } : {
15
+ type: import('vue').PropType<T[K]>;
16
+ required: true;
17
+ };
18
+ };
@@ -0,0 +1,19 @@
1
+ import i from "./EmailView.vue2.js";
2
+ import n from "../../../_virtual/_plugin-vue2_normalizer.js";
3
+ var t = function() {
4
+ var e = this, s = e._self._c, a = e._self._setupProxy;
5
+ return s("div", { staticClass: "w-1 h-1 b-c-4 d-f f-d-c" }, [s("div", { staticClass: "d-f j-c-s-b a-i-c p-2 h-6-s" }, [s("div", { staticClass: "d-f a-i-c cur-p", on: { click: function(l) {
6
+ return e.$emit("back-to-inbox");
7
+ } } }, [s(a.InIcons, { staticClass: "f-s-3 i-c-7", attrs: { name: "line-chevron-left" } }), s("span", { staticClass: "ml-2 f-s-1 f-w-400 l-h-1 t-c-7" }, [e._v(e._s(a.trans("newsletter.inbox")))])], 1), s("div", { staticClass: "d-f a-i-c" }, [s(a.InIcons, { staticClass: "i-c-52", attrs: { name: "line-chevron-down" } }), s(a.InIcons, { staticClass: "ml-1 i-c-52", attrs: { name: "line-chevron-up" } })], 1)]), s("div", { directives: [{ name: "show", rawName: "v-show", value: a.isLoadingIframe, expression: "isLoadingIframe" }], staticClass: "d-f a-i-c j-c-c w-1 h-1" }, [s(a.InLoading)], 1), s("iframe", { directives: [{ name: "show", rawName: "v-show", value: !a.isLoadingIframe, expression: "!isLoadingIframe" }], ref: "iframeRef", staticClass: "f-g-1 w-1 d-b b-c-4 bor-s-n", attrs: { sandbox: "allow-same-origin allow-popups allow-forms allow-scripts", srcdoc: e.emailHtml }, on: { load: a.onLoad } })]);
8
+ }, o = [], c = /* @__PURE__ */ n(
9
+ i,
10
+ t,
11
+ o,
12
+ !1,
13
+ null,
14
+ null
15
+ );
16
+ const d = c.exports;
17
+ export {
18
+ d as default
19
+ };
@@ -0,0 +1,24 @@
1
+ import { defineComponent as u, ref as l } from "vue";
2
+ import { useMobileGmailFit as f } from "../../../composables/useMobileGmailFit.js";
3
+ import { useTranslations as d } from "../../../composables/useTranslations.js";
4
+ import { InLoading as y, InIcons as v } from "@useinsider/design-system-vue";
5
+ const I = /* @__PURE__ */ u({
6
+ __name: "EmailView",
7
+ props: {
8
+ emailHtml: null,
9
+ isAmp: { type: Boolean }
10
+ },
11
+ emits: ["back-to-inbox", "load"],
12
+ setup(c, { emit: t }) {
13
+ const o = c, p = d(), n = l(), { setupMobileGmailFit: s } = f(), m = l(!0), r = () => !!o.isAmp && o.emailHtml.includes("@media") && o.emailHtml.includes(".adapt-img"), i = (e) => {
14
+ e.documentElement.style.removeProperty("transform"), e.documentElement.style.removeProperty("transform-origin"), e.documentElement.style.removeProperty("height");
15
+ };
16
+ return { __sfc: !0, props: o, emit: t, trans: p, iframeRef: n, setupMobileGmailFit: s, isLoadingIframe: m, isAmpResponsive: r, clearAmpTransforms: i, onLoad: () => {
17
+ const e = n.value, a = e == null ? void 0 : e.contentDocument;
18
+ !e || !a || (s(e), r() && setTimeout(() => i(a), 50), t("load"), m.value = !1);
19
+ }, InIcons: v, InLoading: y };
20
+ }
21
+ });
22
+ export {
23
+ I as default
24
+ };
@@ -0,0 +1,17 @@
1
+ import type { EmailData } from '@@/Types/generic';
2
+ interface Props {
3
+ emailData?: EmailData;
4
+ }
5
+ declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<Props>, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {
6
+ "open-email": () => void;
7
+ }, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<Props>>>, {}>;
8
+ export default _default;
9
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
10
+ type __VLS_TypePropsToOption<T> = {
11
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
12
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
13
+ } : {
14
+ type: import('vue').PropType<T[K]>;
15
+ required: true;
16
+ };
17
+ };
@@ -0,0 +1,19 @@
1
+ import a from "./InboxView.vue2.js";
2
+ import e from "../../../_virtual/_plugin-vue2_normalizer.js";
3
+ var n = function() {
4
+ var s = this, t = s._self._c, c = s._self._setupProxy;
5
+ return t("div", { staticClass: "p-y-13 p-x-3 bor-b-w-1 bor-b-s-s bor-b-c-50 cur-p b-c-4 b-c-h-5 p-3", on: { click: function(l) {
6
+ return s.$emit("open-email");
7
+ } } }, [t("div", { staticClass: "d-f j-c-s-b a-i-c w-1" }, [t("div", { staticClass: "f-g-1 min-w-0-s" }, [t("div", { staticClass: "f-s-1 f-w-600 t-c-53 l-h-1 mb-12" }, [s._v(" " + s._s(c.senderName) + " ")]), t("div", { staticClass: "f-s-12 f-w-400 t-c-55 l-h-1" }, [s._v(" " + s._s(c.subject) + " ")])]), t("div", { staticClass: "f-sh-0 ml-2 f-s-12 f-w-400 t-c-55 l-h-1" }, [s._v(" " + s._s(c.trans("product-catalog.today")) + " ")]), t(c.InIcons, { staticClass: "i-c-52", attrs: { name: "line-chevron-right" } })], 1)]);
8
+ }, r = [], i = /* @__PURE__ */ e(
9
+ a,
10
+ n,
11
+ r,
12
+ !1,
13
+ null,
14
+ null
15
+ );
16
+ const m = i.exports;
17
+ export {
18
+ m as default
19
+ };
@@ -0,0 +1,23 @@
1
+ import { defineComponent as r, computed as n } from "vue";
2
+ import { useTranslations as i } from "../../../composables/useTranslations.js";
3
+ import { InIcons as c } from "@useinsider/design-system-vue";
4
+ const f = /* @__PURE__ */ r({
5
+ __name: "InboxView",
6
+ props: {
7
+ emailData: null
8
+ },
9
+ emits: ["open-email"],
10
+ setup(o) {
11
+ const t = o, s = i(), a = n(() => {
12
+ var e;
13
+ return ((e = t.emailData) == null ? void 0 : e.senderName) || `(${s("settings.sender-name")})`;
14
+ }), m = n(() => {
15
+ var e;
16
+ return ((e = t.emailData) == null ? void 0 : e.subject) || s("newsletter.subject");
17
+ });
18
+ return { __sfc: !0, props: t, trans: s, senderName: a, subject: m, InIcons: c };
19
+ }
20
+ });
21
+ export {
22
+ f as default
23
+ };
@@ -0,0 +1,17 @@
1
+ import type { EmailData } from '@@/Types/generic';
2
+ interface Props {
3
+ emailHtml: string;
4
+ isAmp: boolean;
5
+ emailData?: EmailData;
6
+ }
7
+ declare const _default: import("vue").DefineComponent<__VLS_TypePropsToOption<Props>, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<__VLS_TypePropsToOption<Props>>>, {}>;
8
+ export default _default;
9
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
10
+ type __VLS_TypePropsToOption<T> = {
11
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
12
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
13
+ } : {
14
+ type: import('vue').PropType<T[K]>;
15
+ required: true;
16
+ };
17
+ };
@@ -0,0 +1,17 @@
1
+ import e from "./MobilePreview.vue2.js";
2
+ import o from "../../../_virtual/_plugin-vue2_normalizer.js";
3
+ var i = function() {
4
+ var t = this, s = t._self._c, a = t._self._setupProxy;
5
+ return s("div", { staticClass: "d-f j-c-c pl-5" }, [s("div", { staticClass: "p-r w-35-s h-26-s" }, [s("img", { staticClass: "w-1 h-1 d-b p-e-n", attrs: { alt: a.mockupAlt, src: a.mockupImage } }), s("div", { staticClass: "p-a w-21-s h-24-s o-h", style: { top: a.phoneScreenTopMargin, left: "20px" } }, [a.showInbox ? s(a.InboxView, { attrs: { "email-data": a.props.emailData }, on: { "open-email": a.openEmail } }) : s(a.EmailView, { attrs: { "email-html": t.emailHtml, "is-amp": t.isAmp }, on: { "back-to-inbox": a.backToInbox } })], 1)])]);
6
+ }, l = [], n = /* @__PURE__ */ o(
7
+ e,
8
+ i,
9
+ l,
10
+ !1,
11
+ null,
12
+ null
13
+ );
14
+ const c = n.exports;
15
+ export {
16
+ c as default
17
+ };
@@ -0,0 +1,23 @@
1
+ import { defineComponent as s, ref as c, computed as e } from "vue";
2
+ import { INBOX_PREVIEW_PATH as u, PHONE_PREVIEW_PATH as i } from "../../../enums/emailPreview.js";
3
+ import f from "./EmailView.vue.js";
4
+ import _ from "./InboxView.vue.js";
5
+ const b = /* @__PURE__ */ s({
6
+ __name: "MobilePreview",
7
+ props: {
8
+ emailHtml: null,
9
+ isAmp: { type: Boolean },
10
+ emailData: null
11
+ },
12
+ setup(n) {
13
+ const t = n, o = c(!1), m = e(() => o.value ? u : i), p = e(() => o.value ? "Inbox mockup" : "Phone mockup"), a = () => {
14
+ o.value = !1;
15
+ }, l = () => {
16
+ o.value = !0;
17
+ }, r = e(() => o.value ? "88px" : "44px");
18
+ return { __sfc: !0, props: t, showInbox: o, mockupImage: m, mockupAlt: p, openEmail: a, backToInbox: l, phoneScreenTopMargin: r, EmailView: f, InboxView: _ };
19
+ }
20
+ });
21
+ export {
22
+ b as default
23
+ };
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue/types/v3-component-options.js").ComponentOptionsMixin, import("vue/types/v3-component-options.js").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{}>>, {}>;
2
+ export default _default;