@useinsider/guido 3.7.2-beta.c0c3cea → 3.7.2-beta.cebab71

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.
@@ -1,6 +1,6 @@
1
- import r from "./DesktopPreview.vue2.js";
1
+ import o from "./DesktopPreview.vue2.js";
2
2
  /* empty css */
3
- import o from "../../../../_virtual/_plugin-vue2_normalizer.js";
3
+ import r from "../../../../_virtual/_plugin-vue2_normalizer.js";
4
4
  var a = function() {
5
5
  var s = this, e = s._self._c, t = s._self._setupProxy;
6
6
  return e("div", { staticClass: "desktop-preview-wrapper" }, [e("p", { staticClass: "f-s-1 f-w-600 l-h-1 t-t-u t-c-53 mb-6 l-s-5" }, [s._v(" " + s._s(t.trans("email-editor.desktop-preview")) + " ")]), e("div", { ref: "containerRef", staticClass: "desktop-preview d-f f-d-c o-h s-1" }, [e(t.DesktopBrowserHeader), e("div", { staticClass: "desktop-preview__content d-f f-g-1 o-h b-c-5 min-h-0" }, [e("div", { staticClass: "f-g-1 h-1 o-h b-c-4 min-w-0" }, [t.isContainerReady ? e("iframe", { staticClass: "desktop-preview__iframe d-b w-1 h-1 b-c-4 bor-s-n", attrs: { sandbox: `
@@ -8,16 +8,16 @@ var a = function() {
8
8
  allow-popups
9
9
  allow-forms
10
10
  allow-scripts
11
- allow-popups-to-escape-sandbox`, srcdoc: t.previewStore.previewHtml } }) : s._e()])])], 1)]);
12
- }, i = [], p = /* @__PURE__ */ o(
13
- r,
11
+ allow-popups-to-escape-sandbox`, srcdoc: t.previewStore.previewHtml }, on: { load: t.onIframeLoad } }) : s._e()])])], 1)]);
12
+ }, i = [], n = /* @__PURE__ */ r(
13
+ o,
14
14
  a,
15
15
  i,
16
16
  !1,
17
17
  null,
18
- "988f8da6"
18
+ "06afaecb"
19
19
  );
20
- const _ = p.exports;
20
+ const f = n.exports;
21
21
  export {
22
- _ as default
22
+ f as default
23
23
  };
@@ -1,23 +1,26 @@
1
- import { defineComponent as f, ref as s, onMounted as c, onBeforeUnmount as m, nextTick as u } from "vue";
2
- import { useTranslations as p } from "../../../../composables/useTranslations.js";
3
- import { usePreviewStore as l } from "../../../../stores/preview.js";
4
- import _ from "./DesktopBrowserHeader.vue.js";
5
- const x = /* @__PURE__ */ f({
1
+ import { defineComponent as u, ref as a, onMounted as p, onBeforeUnmount as l, nextTick as v } from "vue";
2
+ import { usePreviewInteractionGuard as d } from "../../../../composables/usePreviewInteractionGuard.js";
3
+ import { useTranslations as _ } from "../../../../composables/useTranslations.js";
4
+ import { usePreviewStore as w } from "../../../../stores/preview.js";
5
+ import I from "./DesktopBrowserHeader.vue.js";
6
+ const C = /* @__PURE__ */ u({
6
7
  __name: "DesktopPreview",
7
- setup(v) {
8
- const a = p(), o = s(), n = s(!1), i = l();
8
+ setup(k) {
9
+ const i = _(), { blockPreviewInteractions: t } = d(), o = a(), n = a(!1), c = w();
9
10
  let e = null;
10
- const t = () => {
11
+ const f = (m) => {
12
+ t(m.target);
13
+ }, r = () => {
11
14
  o.value && (e = new ResizeObserver(() => {
12
- }), e.observe(o.value), u(() => {
15
+ }), e.observe(o.value), v(() => {
13
16
  n.value = !0;
14
17
  }));
15
- }, r = () => {
18
+ }, s = () => {
16
19
  e == null || e.disconnect();
17
20
  };
18
- return c(t), m(r), { __sfc: !0, trans: a, containerRef: o, isContainerReady: n, previewStore: i, resizeObserver: e, initIframe: t, cleanIframe: r, DesktopBrowserHeader: _ };
21
+ return p(r), l(s), { __sfc: !0, trans: i, blockPreviewInteractions: t, containerRef: o, isContainerReady: n, previewStore: c, resizeObserver: e, onIframeLoad: f, initIframe: r, cleanIframe: s, DesktopBrowserHeader: I };
19
22
  }
20
23
  });
21
24
  export {
22
- x as default
25
+ C as default
23
26
  };
@@ -1,20 +1,20 @@
1
1
  import e from "./ContentView.vue2.js";
2
2
  /* empty css */
3
3
  import n from "../../../../_virtual/_plugin-vue2_normalizer.js";
4
- var o = function() {
4
+ var c = function() {
5
5
  var t = this, s = t._self._c, a = t._self._setupProxy;
6
6
  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) {
7
7
  return t.$emit("back-to-inbox");
8
8
  } } }, [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" }, [t._v(t._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", { staticClass: "iframe-wrapper f-g-1 o-h" }, [s("iframe", { ref: "iframeRef", staticClass: "iframe-scaled d-b b-c-4 bor-s-n", attrs: { sandbox: "allow-same-origin allow-popups allow-forms allow-scripts allow-popups-to-escape-sandbox", srcdoc: a.previewStore.previewHtml }, on: { load: a.onLoad } })])]);
9
- }, i = [], r = /* @__PURE__ */ n(
9
+ }, o = [], i = /* @__PURE__ */ n(
10
10
  e,
11
+ c,
11
12
  o,
12
- i,
13
13
  !1,
14
14
  null,
15
- "e0424e99"
15
+ "cbafc185"
16
16
  );
17
- const d = r.exports;
17
+ const d = i.exports;
18
18
  export {
19
19
  d as default
20
20
  };
@@ -1,23 +1,24 @@
1
- import { defineComponent as m, ref as c } from "vue";
2
- import { useResponsivePreview as f } from "../../../../composables/useResponsivePreview.js";
3
- import { useTranslations as a } from "../../../../composables/useTranslations.js";
4
- import { usePreviewStore as p } from "../../../../stores/preview.js";
5
- import { InIcons as u } from "@useinsider/design-system-vue";
6
- const h = /* @__PURE__ */ m({
1
+ import { defineComponent as m, ref as a } from "vue";
2
+ import { usePreviewInteractionGuard as f } from "../../../../composables/usePreviewInteractionGuard.js";
3
+ import { useResponsivePreview as p } from "../../../../composables/useResponsivePreview.js";
4
+ import { useTranslations as u } from "../../../../composables/useTranslations.js";
5
+ import { usePreviewStore as v } from "../../../../stores/preview.js";
6
+ import { InIcons as P } from "@useinsider/design-system-vue";
7
+ const g = /* @__PURE__ */ m({
7
8
  __name: "ContentView",
8
9
  emits: ["back-to-inbox"],
9
- setup(v) {
10
- const i = a(), t = p(), n = c(), { setupResponsivePreview: r } = f(), s = (o) => {
11
- ["transform", "transform-origin", "height"].forEach((e) => {
12
- o.documentElement.style.removeProperty(e);
10
+ setup(_) {
11
+ const c = u(), t = v(), r = a(), { setupResponsivePreview: n } = p(), { blockPreviewInteractions: s } = f(), i = (e) => {
12
+ ["transform", "transform-origin", "height"].forEach((o) => {
13
+ e.documentElement.style.removeProperty(o);
13
14
  });
14
15
  };
15
- return { __sfc: !0, trans: i, previewStore: t, iframeRef: n, setupResponsivePreview: r, clearAMPTransforms: s, onLoad: () => {
16
- const o = n.value, e = o == null ? void 0 : o.contentDocument;
17
- e && (r(o), t.isAMPResponsive && s(e));
18
- }, InIcons: u };
16
+ return { __sfc: !0, trans: c, previewStore: t, iframeRef: r, setupResponsivePreview: n, blockPreviewInteractions: s, clearAMPTransforms: i, onLoad: () => {
17
+ const e = r.value, o = e == null ? void 0 : e.contentDocument;
18
+ o && (n(e), s(e), t.isAMPResponsive && i(o));
19
+ }, InIcons: P };
19
20
  }
20
21
  });
21
22
  export {
22
- h as default
23
+ g as default
23
24
  };
@@ -10,15 +10,15 @@ var o = function() {
10
10
  return t.selectTemplate(s.id);
11
11
  } } }, [e(t.InContainer, { staticClass: "template-container o-h", class: { selected: t.unsubscribeStore.getSelectedTemplateByActiveType === s.id }, attrs: { border: t.getBorderClass(s.id) } }, [e("div", { staticClass: "w-1 h-1 d-f j-c-c a-i-c" }, [e("img", { staticClass: "w-1 h-1 thumbnail o-h", attrs: { alt: s.name, src: s.thumbnail } })])]), e("div", { staticClass: "mt-1 f-s-1" }, [r._v(" " + r._s(s.name) + " ")])], 1);
12
12
  }), 0)]);
13
- }, i = [], c = /* @__PURE__ */ n(
13
+ }, c = [], i = /* @__PURE__ */ n(
14
14
  a,
15
15
  o,
16
- i,
16
+ c,
17
17
  !1,
18
18
  null,
19
- "f6a8cb4c"
19
+ "ec5c2ac6"
20
20
  );
21
- const _ = c.exports;
21
+ const _ = i.exports;
22
22
  export {
23
23
  _ as default
24
24
  };
@@ -1,66 +1,69 @@
1
- import { defineComponent as y, ref as S, computed as a, watch as T } from "vue";
2
- import v from "../../wrappers/WpDrawer.vue.js";
1
+ import { defineComponent as y, ref as T, computed as a, watch as v } from "vue";
2
+ import w from "../../wrappers/WpDrawer.vue.js";
3
3
  import { useToaster as C } from "../../../composables/useToaster.js";
4
4
  import { useTranslations as B } from "../../../composables/useTranslations.js";
5
- import { ToasterTypeOptions as w } from "../../../enums/toaster.js";
6
- import { useUnsubscribeStore as h } from "../../../stores/unsubscribe.js";
7
- import { InContainer as U } from "@useinsider/design-system-vue";
8
- import P from "./UnsubscribeBreadcrumb.vue.js";
9
- const L = /* @__PURE__ */ y({
5
+ import { ToasterTypeOptions as h } from "../../../enums/toaster.js";
6
+ import { useEditorStore as P } from "../../../stores/editor.js";
7
+ import { useUnsubscribeStore as U } from "../../../stores/unsubscribe.js";
8
+ import { InContainer as _ } from "@useinsider/design-system-vue";
9
+ import x from "./UnsubscribeBreadcrumb.vue.js";
10
+ const N = /* @__PURE__ */ y({
10
11
  __name: "UnsubscribePageSelection",
11
- setup(_) {
12
- const s = B(), e = h(), { showToaster: r } = C(), o = S(!1), c = a(() => e.isActiveTypeLastInCollection ? o.value ? s("unsubscription-preference.applying-changes") : s("statistics.apply") : s("products.select-and-continue")), i = a(() => e.pageSelectionUpdateStatus && e.isActiveTypeFirstInCollection ? s("products.cancel") : s("newsletter.back")), u = a(() => ({
12
+ setup(A) {
13
+ const s = B(), e = U(), r = P(), { showToaster: c } = C(), o = T(!1), i = a(() => e.isActiveTypeLastInCollection ? o.value ? s("unsubscription-preference.applying-changes") : s("statistics.apply") : s("products.select-and-continue")), l = a(() => e.pageSelectionUpdateStatus && e.isActiveTypeFirstInCollection ? s("products.cancel") : s("newsletter.back")), p = a(() => ({
13
14
  primaryButton: {
14
15
  styling: "solid",
15
16
  type: "primary",
16
- labelText: c.value,
17
+ labelText: i.value,
17
18
  loadingStatus: o.value,
18
19
  disabledStatus: !1
19
20
  },
20
21
  cancelOrBackButton: {
21
22
  styling: "ghost",
22
23
  type: "secondary",
23
- labelText: i.value,
24
+ labelText: l.value,
24
25
  disabledStatus: o.value
25
26
  }
26
- })), p = (t) => e.getSelectedTemplateByActiveType === t ? "bor-w-3 bor-s-s bor-c-7" : "bor-w-1 bor-s-s bor-c-6", n = (t) => {
27
+ })), d = (t) => e.getSelectedTemplateByActiveType === t ? "bor-w-3 bor-s-s bor-c-7" : "bor-w-1 bor-s-s bor-c-6", n = (t) => {
27
28
  e.pageSelectionDrawerStatus = !1, t && setTimeout(() => {
28
29
  t();
29
30
  }, 500);
30
- }, d = () => {
31
- n(), e.pageSelectionUpdateStatus || document.dispatchEvent(new CustomEvent("unsubscribe:cancel"));
32
31
  }, m = () => {
32
+ n(), e.pageSelectionUpdateStatus || document.dispatchEvent(new CustomEvent("unsubscribe:cancel"));
33
+ }, b = () => {
33
34
  if (e.isActiveTypeFirstInCollection) {
34
35
  n(), e.pageSelectionUpdateStatus || (e.typeSelectionDrawerStatus = !0);
35
36
  return;
36
37
  }
37
38
  e.setPreviousType();
38
- }, b = () => {
39
- if (e.isActiveTypeLastInCollection) {
40
- o.value = !0;
41
- const t = e.selectedCollectionType, l = e.getSelectedTemplatesByCollection(t), g = e.getSelectedUnsubscribePagesByCollection(t);
42
- e.removeUnsubscribePages(g), e.addUnsubscribePages(l), document.dispatchEvent(new CustomEvent("unsubscribe:select", {
43
- detail: {
44
- collectionType: t,
45
- selectedPages: l
46
- }
47
- })), n(() => {
48
- o.value = !1, r({
49
- type: w.Success,
50
- message: s("global-unsubscribe.pages-were-attached")
39
+ }, f = () => {
40
+ if (!r.isPreviewModeOpen) {
41
+ if (e.isActiveTypeLastInCollection) {
42
+ o.value = !0;
43
+ const t = e.selectedCollectionType, u = e.getSelectedTemplatesByCollection(t), S = e.getSelectedUnsubscribePagesByCollection(t);
44
+ e.removeUnsubscribePages(S), e.addUnsubscribePages(u), document.dispatchEvent(new CustomEvent("unsubscribe:select", {
45
+ detail: {
46
+ collectionType: t,
47
+ selectedPages: u
48
+ }
49
+ })), n(() => {
50
+ o.value = !1, c({
51
+ type: h.Success,
52
+ message: s("global-unsubscribe.pages-were-attached")
53
+ });
51
54
  });
52
- });
53
- return;
55
+ return;
56
+ }
57
+ e.setNextType();
54
58
  }
55
- e.setNextType();
56
- }, f = (t) => {
57
- e.setSelectedTemplate(t);
59
+ }, g = (t) => {
60
+ r.isPreviewModeOpen || e.setSelectedTemplate(t);
58
61
  };
59
- return T(() => e.pageSelectionDrawerStatus, (t) => {
62
+ return v(() => e.pageSelectionDrawerStatus, (t) => {
60
63
  t && e.pageSelectionUpdateStatus && e.fetchTemplates();
61
- }), { __sfc: !0, trans: s, unsubscribeStore: e, showToaster: r, isApplying: o, getPrimaryButtonText: c, getCancelOrBackButtonText: i, footerButtonGroupOptions: u, getBorderClass: p, closeModal: n, handleClose: d, handleBack: m, handleSave: b, selectTemplate: f, WpDrawer: v, InContainer: U, UnsubscribeBreadcrumb: P };
64
+ }), { __sfc: !0, trans: s, unsubscribeStore: e, editorStore: r, showToaster: c, isApplying: o, getPrimaryButtonText: i, getCancelOrBackButtonText: l, footerButtonGroupOptions: p, getBorderClass: d, closeModal: n, handleClose: m, handleBack: b, handleSave: f, selectTemplate: g, WpDrawer: w, InContainer: _, UnsubscribeBreadcrumb: x };
62
65
  }
63
66
  });
64
67
  export {
65
- L as default
68
+ N as default
66
69
  };
@@ -10,7 +10,7 @@ var i = function() {
10
10
  r,
11
11
  !1,
12
12
  null,
13
- "43c617a7"
13
+ "811cff80"
14
14
  );
15
15
  const _ = c.exports;
16
16
  export {
@@ -1,106 +1,109 @@
1
- import { defineComponent as h, ref as b, computed as g, watch as _ } from "vue";
1
+ import { defineComponent as _, ref as b, computed as m, watch as h } from "vue";
2
2
  import v from "../../wrappers/WpDrawer.vue.js";
3
3
  import { useToaster as U } from "../../../composables/useToaster.js";
4
- import { useTranslations as N } from "../../../composables/useTranslations.js";
5
- import { ACADEMY_LINKS as w } from "../../../enums/academy.js";
6
- import { ToasterTypeOptions as R } from "../../../enums/toaster.js";
7
- import { PAGE_TYPES as l, getTypeTranslations as D, UNSUBSCRIBE_PAGES_LINK as I } from "../../../enums/unsubscribe.js";
8
- import { useUnsubscribeStore as P } from "../../../stores/unsubscribe.js";
9
- import { InSegments as G } from "@useinsider/design-system-vue";
10
- const V = /* @__PURE__ */ h({
4
+ import { useTranslations as w } from "../../../composables/useTranslations.js";
5
+ import { ACADEMY_LINKS as N } from "../../../enums/academy.js";
6
+ import { ToasterTypeOptions as I } from "../../../enums/toaster.js";
7
+ import { PAGE_TYPES as l, getTypeTranslations as R, UNSUBSCRIBE_PAGES_LINK as D } from "../../../enums/unsubscribe.js";
8
+ import { useUnsubscribeStore as L } from "../../../stores/unsubscribe.js";
9
+ import { InSegments as P } from "@useinsider/design-system-vue";
10
+ const V = /* @__PURE__ */ _({
11
11
  __name: "UnsubscribeTypeSelection",
12
- setup(L) {
13
- const e = N(), { showToaster: f } = U(), t = P(), n = b(!1), i = b(!0), o = b(l.GLOBAL_UNSUBSCRIBE), S = e(
12
+ setup(G) {
13
+ const t = w(), { showToaster: f } = U(), e = L(), n = b(!1), o = b(!0), r = b(l.GLOBAL_UNSUBSCRIBE), S = t(
14
14
  "unsubscription-preference.select-unsubscribe-page-description",
15
- { action: `<a href="${w.GLOBAL_UNSUBSCRIBE}" target="_blank">${e("ds-rules.visit-academy")}</a>` }
16
- ), T = g(() => [
15
+ { action: `<a href="${N.GLOBAL_UNSUBSCRIBE}" target="_blank">${t("ds-rules.visit-academy")}</a>` }
16
+ ), T = m(() => [
17
17
  {
18
- description: e("unsubscription-preference.type-global-unsubscribe-description"),
18
+ description: t("unsubscription-preference.type-global-unsubscribe-description"),
19
19
  icon: "line-contact-global-unsub-page",
20
- text: e("unsubscription-preference.type-global-unsubscribe"),
20
+ text: t("unsubscription-preference.type-global-unsubscribe"),
21
21
  value: l.GLOBAL_UNSUBSCRIBE,
22
- disable: t.isGlobalUnsubscribeDisabled,
22
+ disable: e.isGlobalUnsubscribeDisabled,
23
23
  position: "bottom",
24
- tooltipText: t.isGlobalUnsubscribeDisabled ? e("unsubscription-preference.global-unsub-added") : ""
24
+ tooltipText: e.isGlobalUnsubscribeDisabled ? t("unsubscription-preference.global-unsub-added") : ""
25
25
  },
26
26
  {
27
- description: e("unsubscription-preference.type-subscription-preferences-center-description"),
27
+ description: t("unsubscription-preference.type-subscription-preferences-center-description"),
28
28
  icon: "line-contact-sub-pref-center-page",
29
- text: e("unsubscription-preference.type-subscription-preferences-center"),
29
+ text: t("unsubscription-preference.type-subscription-preferences-center"),
30
30
  value: l.SUBSCRIPTION_PREFERENCE_CENTER,
31
- disable: t.isSubscriptionPreferencesCenterDisabled,
32
- tooltipText: t.isSubscriptionPreferencesCenterDisabled ? e("unsubscription-preference.pref-center-added") : ""
31
+ disable: e.isSubscriptionPreferencesCenterDisabled,
32
+ tooltipText: e.isSubscriptionPreferencesCenterDisabled ? t("unsubscription-preference.pref-center-added") : ""
33
33
  }
34
- ]), y = g(() => ({
34
+ ]), y = m(() => ({
35
35
  primaryButton: {
36
36
  styling: "solid",
37
37
  type: "primary",
38
- labelText: e(
38
+ labelText: t(
39
39
  n.value ? "unsubscription-preference.selecting-type" : "products.select-and-continue"
40
40
  ),
41
41
  loadingStatus: n.value,
42
42
  disabledStatus: !1,
43
- skeletonStatus: i.value,
43
+ skeletonStatus: o.value,
44
44
  skeletonSizing: { width: 168, height: 40 }
45
45
  },
46
46
  cancelOrBackButton: {
47
47
  styling: "ghost",
48
48
  type: "secondary",
49
- labelText: e("products.cancel"),
49
+ labelText: t("products.cancel"),
50
50
  disabledStatus: n.value,
51
- skeletonStatus: i.value,
51
+ skeletonStatus: o.value,
52
52
  skeletonSizing: { width: 78, height: 40 }
53
53
  }
54
54
  })), d = (s) => {
55
- t.typeSelectionDrawerStatus = !1, document.dispatchEvent(new CustomEvent("unsubscribe:cancel")), s && setTimeout(() => {
55
+ e.typeSelectionDrawerStatus = !1, document.dispatchEvent(new CustomEvent("unsubscribe:cancel", {
56
+ detail: { blockId: e.pendingBlockId }
57
+ })), s && setTimeout(() => {
56
58
  s();
57
59
  }, 500);
58
60
  }, E = (s) => {
59
- o.value = s;
60
- }, m = () => {
61
- const s = t.hasTemplatesByCollectionType, r = [];
62
- if (Object.entries(s).forEach(([c, p]) => {
63
- p || r.push(Number(c));
64
- }), r.length === 0)
61
+ r.value = s;
62
+ }, g = () => {
63
+ const s = e.hasTemplatesByCollectionType, a = [];
64
+ if (Object.entries(s).forEach(([i, p]) => {
65
+ p || a.push(Number(i));
66
+ }), a.length === 0)
65
67
  return !0;
66
- const B = D(), a = r.map((c) => B[c]);
68
+ const C = R(), c = a.map((i) => C[i]);
67
69
  let u = "";
68
- if (r.length === 1)
69
- u = e("unsubscription-preference.create-page-to-continue", {
70
- page: a[0]
70
+ if (a.length === 1)
71
+ u = t("unsubscription-preference.create-page-to-continue", {
72
+ page: c[0]
71
73
  });
72
- else if (r.length === 2)
73
- u = e("unsubscription-preference.create-pages-to-continue", {
74
- page1: a[0],
75
- page2: a[1]
74
+ else if (a.length === 2)
75
+ u = t("unsubscription-preference.create-pages-to-continue", {
76
+ page1: c[0],
77
+ page2: c[1]
76
78
  });
77
79
  else {
78
- const c = a.pop() ?? "", p = a.join(", ");
79
- u = e("unsubscription-preference.create-multiple-pages-to-continue", {
80
+ const i = c.pop() ?? "", p = c.join(", ");
81
+ u = t("unsubscription-preference.create-multiple-pages-to-continue", {
80
82
  pages: p,
81
- lastPage: c
83
+ lastPage: i
82
84
  });
83
85
  }
84
86
  return f({
85
- type: R.Warning,
87
+ type: I.Warning,
86
88
  message: u,
87
89
  actionButton: {
88
90
  text: "Go to Unsubscribe Pages",
89
91
  onClick: () => {
90
- window.location.href = I;
92
+ const i = new URL(D, window.location.origin).href;
93
+ window.open(i, "_blank", "noopener");
91
94
  }
92
95
  }
93
96
  }), !1;
94
- }, C = async () => {
95
- if (n.value = !0, await t.fetchTemplates(), t.setCollection(o.value), !m()) {
97
+ }, B = async () => {
98
+ if (n.value = !0, await e.fetchTemplates(!0), e.setCollection(r.value), !g()) {
96
99
  n.value = !1, d();
97
100
  return;
98
101
  }
99
- n.value = !1, t.typeSelectionDrawerStatus = !1, t.pageSelectionDrawerStatus = !0;
102
+ n.value = !1, e.typeSelectionDrawerStatus = !1, e.pageSelectionDrawerStatus = !0;
100
103
  };
101
- return _(() => t.typeSelectionDrawerStatus, (s) => {
102
- s && (i.value = !0, o.value = l.GLOBAL_UNSUBSCRIBE, t.isGlobalUnsubscribeDisabled && (o.value = t.isSubscriptionPreferencesCenterDisabled ? 0 : l.SUBSCRIPTION_PREFERENCE_CENTER), i.value = !1);
103
- }), { __sfc: !0, trans: e, showToaster: f, unsubscribeStore: t, isSelecting: n, skeletonStatus: i, selectedCollection: o, descriptionText: S, segmentList: T, footerButtonGroupOptions: y, closeModal: d, changeCollection: E, validateTemplates: m, selectCollection: C, WpDrawer: v, InSegments: G };
104
+ return h(() => e.typeSelectionDrawerStatus, (s) => {
105
+ s && (o.value = !0, r.value = l.GLOBAL_UNSUBSCRIBE, e.isGlobalUnsubscribeDisabled && (r.value = e.isSubscriptionPreferencesCenterDisabled ? 0 : l.SUBSCRIPTION_PREFERENCE_CENTER), o.value = !1);
106
+ }), { __sfc: !0, trans: t, showToaster: f, unsubscribeStore: e, isSelecting: n, skeletonStatus: o, selectedCollection: r, descriptionText: S, segmentList: T, footerButtonGroupOptions: y, closeModal: d, changeCollection: E, validateTemplates: g, selectCollection: B, WpDrawer: v, InSegments: P };
104
107
  }
105
108
  });
106
109
  export {
@@ -0,0 +1,17 @@
1
+ const o = ["click", "auxclick", "submit"], c = (t) => {
2
+ t.preventDefault(), t.stopPropagation();
3
+ }, a = () => ({ blockPreviewInteractions: (r) => {
4
+ try {
5
+ const e = r.contentDocument;
6
+ if (!e)
7
+ return;
8
+ o.forEach((n) => {
9
+ e.addEventListener(n, c, !0);
10
+ });
11
+ } catch (e) {
12
+ console.warn("[usePreviewInteractionGuard] Could not guard preview iframe:", e);
13
+ }
14
+ } });
15
+ export {
16
+ a as usePreviewInteractionGuard
17
+ };
@@ -1,19 +1,20 @@
1
1
  var S = Object.defineProperty;
2
- var L = (c, o, e) => o in c ? S(c, o, { enumerable: !0, configurable: !0, writable: !0, value: e }) : c[o] = e;
3
- var a = (c, o, e) => L(c, typeof o != "symbol" ? o + "" : o, e);
4
- import { useToaster as f } from "../../../composables/useToaster.js";
5
- import { ToasterTypeOptions as A } from "../../../enums/toaster.js";
6
- import { PAGE_TYPES as h } from "../../../enums/unsubscribe.js";
7
- import { useUnsubscribeStore as u } from "../../../stores/unsubscribe.js";
8
- import { Block as y, BlockCompositionType as T, ContextActionType as k, ModificationDescription as d, BlockType as I } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
9
- import { getDefaultTemplate as v } from "./template.js";
2
+ var f = (c, o, e) => o in c ? S(c, o, { enumerable: !0, configurable: !0, writable: !0, value: e }) : c[o] = e;
3
+ var a = (c, o, e) => f(c, typeof o != "symbol" ? o + "" : o, e);
4
+ import { useToaster as A } from "../../../composables/useToaster.js";
5
+ import { ToasterTypeOptions as L } from "../../../enums/toaster.js";
6
+ import { PAGE_TYPES as g } from "../../../enums/unsubscribe.js";
7
+ import { useEditorStore as T } from "../../../stores/editor.js";
8
+ import { useUnsubscribeStore as l } from "../../../stores/unsubscribe.js";
9
+ import { Block as y, BlockCompositionType as I, ContextActionType as _, ModificationDescription as d, BlockType as v } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
10
+ import { getDefaultTemplate as C } from "./template.js";
10
11
  import { UNSUBSCRIBE_BLOCK_SELECTOR as m, DATA_ATTRIBUTES as n, UNSUBSCRIBE_EVENTS as b } from "./utils/constants.js";
11
- import { parsePageList as B } from "./utils/utils.js";
12
- const C = "unsubscribe-block", E = 'a[data-unsubscribe-link="true"]', N = "{{ins-unsubscribe-link}}", U = "https://academy.insiderone.com/docs/adding-unsubscribe-pages-into-emails", R = "Removing the unsubscribe text leaves an empty block, but an active unsubscribe link is required. Undo your last action to restore the text, or delete the unsubscribe block entirely.", D = {
13
- [h.GLOBAL_UNSUBSCRIBE]: "{{ins-global-unsubscribe-link}}",
14
- [h.SUBSCRIPTION_PREFERENCE_CENTER]: "{{ins-preferences-unsubscribe-link}}"
12
+ import { parsePageList as k } from "./utils/utils.js";
13
+ const N = "unsubscribe-block", E = 'a[data-unsubscribe-link="true"]', U = "{{ins-unsubscribe-link}}", R = "https://academy.insiderone.com/docs/adding-unsubscribe-pages-into-emails", D = "Removing the unsubscribe text leaves an empty block, but an active unsubscribe link is required. Undo your last action to restore the text, or delete the unsubscribe block entirely.", P = {
14
+ [g.GLOBAL_UNSUBSCRIBE]: "{{ins-global-unsubscribe-link}}",
15
+ [g.SUBSCRIPTION_PREFERENCE_CENTER]: "{{ins-preferences-unsubscribe-link}}"
15
16
  }, w = 3;
16
- class H extends y {
17
+ class W extends y {
17
18
  constructor() {
18
19
  super();
19
20
  a(this, "selectEventListener", null);
@@ -29,13 +30,13 @@ class H extends y {
29
30
  a(this, "guardAttemptsByBlockId", /* @__PURE__ */ new Map());
30
31
  }
31
32
  getId() {
32
- return C;
33
+ return N;
33
34
  }
34
35
  getIcon() {
35
36
  return "unsubscribe-icon";
36
37
  }
37
38
  getBlockCompositionType() {
38
- return T.BLOCK;
39
+ return I.BLOCK;
39
40
  }
40
41
  getName() {
41
42
  return this.api.translate("Unsubscribe Block");
@@ -44,15 +45,16 @@ class H extends y {
44
45
  return this.api.translate("Unsubscribe Block Description");
45
46
  }
46
47
  getTemplate() {
47
- return v();
48
+ return C();
48
49
  }
49
50
  getContextActionsIds() {
50
- return [k.MOVE, k.REMOVE];
51
+ return [_.MOVE, _.REMOVE];
51
52
  }
52
53
  onSelect(e) {
53
- this.currentNode = e;
54
- const t = this._getOrAssignBlockId(e);
55
- t && this.linkStateByBlockId.set(t, this._hasUnsubscribeLink(e)), !("getAttribute" in e && e.getAttribute("data-migration")) && (this._resetStoreState(), this._loadBlockState(e), this._setupSelectEventListener(), this._setupCancelEventListener(), this._checkExistingBlocks(), this._openDrawer());
54
+ if (this.currentNode = e, T().isPreviewModeOpen)
55
+ return;
56
+ const t = this._readBlockId(e) !== null, r = this._getOrAssignBlockId(e);
57
+ r && this.linkStateByBlockId.set(r, this._hasUnsubscribeLink(e)), !("getAttribute" in e && e.getAttribute("data-migration")) && (t && !this._hasPageSelection(e) || (this._resetStoreState(), r && (l().pendingBlockId = r), this._loadBlockState(e), this._setupSelectEventListener(), this._setupCancelEventListener(r), this._checkExistingBlocks(), this._openDrawer()));
56
58
  }
57
59
  onCreated(e) {
58
60
  this._ensureLeadingTextGuard(e);
@@ -71,8 +73,8 @@ class H extends y {
71
73
  const t = this._getOrAssignBlockId(e);
72
74
  if (!t)
73
75
  return;
74
- const s = this._hasUnsubscribeLink(e);
75
- this.linkStateByBlockId.get(t) === !0 && !s && this._warnLinkRemoved(), this.linkStateByBlockId.set(t, s);
76
+ const r = this._hasUnsubscribeLink(e);
77
+ this.linkStateByBlockId.get(t) === !0 && !r && this._warnLinkRemoved(), this.linkStateByBlockId.set(t, r);
76
78
  }
77
79
  onDelete(e) {
78
80
  this._removeEventListeners(), this._removeBlockTemplatesFromStore(e), this._resetStoreState();
@@ -93,25 +95,25 @@ class H extends y {
93
95
  const t = e.querySelector(E);
94
96
  if (!t)
95
97
  return;
96
- let s = t, r = s.parent();
97
- for (; r && "getTagName" in r && r.getTagName().toLowerCase() !== "p"; )
98
- s = r, r = r.parent();
99
- if (!r || !("getTagName" in r) || r.getTagName().toLowerCase() !== "p")
98
+ let r = t, s = r.parent();
99
+ for (; s && "getTagName" in s && s.getTagName().toLowerCase() !== "p"; )
100
+ r = s, s = s.parent();
101
+ if (!s || !("getTagName" in s) || s.getTagName().toLowerCase() !== "p")
100
102
  return;
101
- const i = s.previousSibling();
103
+ const i = r.previousSibling();
102
104
  if (!!(i && i.getType() === "text" && i.getTextContent())) {
103
105
  const p = this._readBlockId(e);
104
106
  p && this.guardAttemptsByBlockId.delete(p);
105
107
  return;
106
108
  }
107
- const g = this._getOrAssignBlockId(e);
108
- if (!g)
109
+ const h = this._getOrAssignBlockId(e);
110
+ if (!h)
109
111
  return;
110
- const _ = this.guardAttemptsByBlockId.get(g) ?? 0;
111
- if (!(_ >= w)) {
112
- this.guardAttemptsByBlockId.set(g, _ + 1);
112
+ const B = this.guardAttemptsByBlockId.get(h) ?? 0;
113
+ if (!(B >= w)) {
114
+ this.guardAttemptsByBlockId.set(h, B + 1);
113
115
  try {
114
- this.api.getDocumentModifier().modifyHtml(r).prepend("&nbsp;").apply(new d("Ensure unsubscribe link text guard"));
116
+ this.api.getDocumentModifier().modifyHtml(s).prepend("&nbsp;").apply(new d("Ensure unsubscribe link text guard"));
115
117
  } catch (p) {
116
118
  console.warn("[UnsubscribeBlock] Failed to ensure link text guard:", p);
117
119
  }
@@ -123,6 +125,17 @@ class H extends y {
123
125
  _readBlockId(e) {
124
126
  return "getAttribute" in e ? e.getAttribute(n.BLOCK_ID) : null;
125
127
  }
128
+ /**
129
+ * True when the block has a page type and a page list — i.e. a template was
130
+ * applied. A block with neither, combined with an already-present block id,
131
+ * is an undo-restored orphan of a cancelled block.
132
+ */
133
+ _hasPageSelection(e) {
134
+ if (!("getAttribute" in e))
135
+ return !1;
136
+ const t = e.getAttribute(n.PAGE_TYPE), r = e.getAttribute(n.PAGE_LIST);
137
+ return !!t && !!r;
138
+ }
126
139
  /**
127
140
  * Returns the block's stable id, assigning one via the document modifier if
128
141
  * the node has not been tagged yet. Idempotent: subsequent calls during
@@ -135,13 +148,13 @@ class H extends y {
135
148
  return t;
136
149
  if (!("getAttribute" in e))
137
150
  return null;
138
- const s = this._generateNextBlockId();
151
+ const r = this._generateNextBlockId();
139
152
  try {
140
- this.api.getDocumentModifier().modifyHtml(e).setAttribute(n.BLOCK_ID, s).apply(new d(`Assign unsubscribe block id ${s}`));
141
- } catch (r) {
142
- return console.warn("[UnsubscribeBlock] Failed to assign block id:", r), null;
153
+ this.api.getDocumentModifier().modifyHtml(e).setAttribute(n.BLOCK_ID, r).apply(new d(`Assign unsubscribe block id ${r}`));
154
+ } catch (s) {
155
+ return console.warn("[UnsubscribeBlock] Failed to assign block id:", s), null;
143
156
  }
144
- return s;
157
+ return r;
145
158
  }
146
159
  /**
147
160
  * Generates a unique id by scanning the document for the highest existing
@@ -152,10 +165,10 @@ class H extends y {
152
165
  let e = 0;
153
166
  try {
154
167
  const t = this.api.getDocumentRoot();
155
- t && "querySelectorAll" in t && t.querySelectorAll(m).forEach((r) => {
156
- if ("getAttribute" in r) {
157
- const i = r.getAttribute(n.BLOCK_ID), l = i ? parseInt(i) : 0;
158
- l > e && (e = l);
168
+ t && "querySelectorAll" in t && t.querySelectorAll(m).forEach((s) => {
169
+ if ("getAttribute" in s) {
170
+ const i = s.getAttribute(n.BLOCK_ID), u = i ? parseInt(i) : 0;
171
+ u > e && (e = u);
159
172
  }
160
173
  });
161
174
  } catch {
@@ -164,14 +177,14 @@ class H extends y {
164
177
  }
165
178
  _warnLinkRemoved() {
166
179
  try {
167
- const { showToaster: e } = f();
180
+ const { showToaster: e } = A();
168
181
  e({
169
- type: A.Warning,
170
- message: this.api.translate(R),
182
+ type: L.Warning,
183
+ message: this.api.translate(D),
171
184
  actionButton: {
172
185
  text: this.api.translate("Visit Academy"),
173
186
  onClick: () => {
174
- window.open(U, "_blank", "noopener,noreferrer");
187
+ window.open(R, "_blank", "noopener,noreferrer");
175
188
  }
176
189
  }
177
190
  });
@@ -181,16 +194,17 @@ class H extends y {
181
194
  }
182
195
  _setupSelectEventListener() {
183
196
  this._removeSelectEventListener(), this.selectEventListener = (e) => {
184
- const t = e, { collectionType: s, selectedPages: r } = t.detail;
185
- this._updateBlock(s, r.join(","));
197
+ const t = e, { collectionType: r, selectedPages: s } = t.detail;
198
+ this._updateBlock(r, s.join(","));
186
199
  }, document.addEventListener(b.SELECT, this.selectEventListener);
187
200
  }
188
201
  _removeSelectEventListener() {
189
202
  this.selectEventListener && (document.removeEventListener(b.SELECT, this.selectEventListener), this.selectEventListener = null);
190
203
  }
191
- _setupCancelEventListener() {
192
- this._removeCancelEventListener(), this.cancelEventListener = () => {
193
- this._handleCancel();
204
+ _setupCancelEventListener(e) {
205
+ this._removeCancelEventListener(), this.cancelEventListener = (t) => {
206
+ const { detail: r } = t, s = (r == null ? void 0 : r.blockId) ?? null;
207
+ s !== null && s !== e || this._handleCancel();
194
208
  }, document.addEventListener(b.CANCEL, this.cancelEventListener);
195
209
  }
196
210
  _removeCancelEventListener() {
@@ -200,7 +214,7 @@ class H extends y {
200
214
  try {
201
215
  if (!this.currentNode)
202
216
  return;
203
- this.api.getDocumentModifier().modifyHtml(this.currentNode).replaceWith(`<${I.EMPTY_CONTAINER}/>`).apply(new d("Removed unsubscribe block due to cancel"));
217
+ this.api.getDocumentModifier().modifyHtml(this.currentNode).replaceWith(`<${v.EMPTY_CONTAINER}/>`).apply(new d("Removed unsubscribe block due to cancel"));
204
218
  } catch (e) {
205
219
  console.warn("[UnsubscribeBlock] Failed to remove unsubscribe block:", e);
206
220
  }
@@ -211,32 +225,32 @@ class H extends y {
211
225
  _updateBlock(e, t) {
212
226
  if (!this.currentNode || !("querySelector" in this.currentNode))
213
227
  return;
214
- const s = this.currentNode.querySelector(E);
215
- if (!s)
228
+ const r = this.currentNode.querySelector(E);
229
+ if (!r)
216
230
  return;
217
- const r = this._getMergeTag(e);
218
- this.api.getDocumentModifier().modifyHtml(s).setAttribute("href", r).apply(new d(`Updated unsubscribe link to ${r}`)), this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(n.PAGE_TYPE, e.toString()).setAttribute(n.PAGE_LIST, t).apply(new d("Updated unsubscribe block metadata"));
231
+ const s = this._getMergeTag(e);
232
+ this.api.getDocumentModifier().modifyHtml(r).setAttribute("href", s).apply(new d(`Updated unsubscribe link to ${s}`)), this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(n.PAGE_TYPE, e.toString()).setAttribute(n.PAGE_LIST, t).apply(new d("Updated unsubscribe block metadata"));
219
233
  }
220
234
  _getMergeTag(e) {
221
- return D[e] ?? N;
235
+ return P[e] ?? U;
222
236
  }
223
237
  _openDrawer() {
224
238
  if (!(this.currentNode && this.currentNode.getAttribute("data-unsubscribe-page-type")))
225
239
  try {
226
- const e = u();
240
+ const e = l();
227
241
  e.typeSelectionDrawerStatus = !0;
228
242
  } catch (e) {
229
243
  console.error("[UnsubscribeBlock] Failed to open drawer:", e);
230
244
  }
231
245
  }
232
246
  _checkExistingBlocks() {
233
- const e = u();
234
- e.isGlobalUnsubscribeDisabled = !1, e.isSubscriptionPreferencesCenterDisabled = !1, this.api.getDocumentRoot().querySelectorAll(m).forEach((s) => {
235
- if ("getAttribute" in s) {
236
- const r = s.getAttribute(n.PAGE_TYPE);
237
- if (r) {
238
- const i = Number(r);
239
- i === h.GLOBAL_UNSUBSCRIBE ? e.isGlobalUnsubscribeDisabled = !0 : i === h.SUBSCRIPTION_PREFERENCE_CENTER && (e.isSubscriptionPreferencesCenterDisabled = !0);
247
+ const e = l();
248
+ e.isGlobalUnsubscribeDisabled = !1, e.isSubscriptionPreferencesCenterDisabled = !1, this.api.getDocumentRoot().querySelectorAll(m).forEach((r) => {
249
+ if ("getAttribute" in r) {
250
+ const s = r.getAttribute(n.PAGE_TYPE);
251
+ if (s) {
252
+ const i = Number(s);
253
+ i === g.GLOBAL_UNSUBSCRIBE ? e.isGlobalUnsubscribeDisabled = !0 : i === g.SUBSCRIPTION_PREFERENCE_CENTER && (e.isSubscriptionPreferencesCenterDisabled = !0);
240
254
  }
241
255
  }
242
256
  });
@@ -244,14 +258,14 @@ class H extends y {
244
258
  async _loadBlockState(e) {
245
259
  if (!("getAttribute" in e))
246
260
  return;
247
- const t = e.getAttribute(n.PAGE_TYPE), s = e.getAttribute(n.PAGE_LIST);
248
- if (!t || !s)
261
+ const t = e.getAttribute(n.PAGE_TYPE), r = e.getAttribute(n.PAGE_LIST);
262
+ if (!t || !r)
249
263
  return;
250
- const r = u(), i = Number(t), l = B(s);
251
- await r.fetchTemplates(), r.setCollectionWithoutAutoSelection(i), r.loadSelectedTemplates(l);
264
+ const s = l(), i = Number(t), u = k(r);
265
+ await s.fetchTemplates(), s.setCollectionWithoutAutoSelection(i), s.loadSelectedTemplates(u);
252
266
  }
253
267
  _resetStoreState() {
254
- u().$reset();
268
+ l().$reset();
255
269
  }
256
270
  _removeBlockTemplatesFromStore(e) {
257
271
  if (!("getAttribute" in e))
@@ -259,11 +273,11 @@ class H extends y {
259
273
  const t = e.getAttribute(n.PAGE_LIST);
260
274
  if (!t)
261
275
  return;
262
- const s = u(), r = B(t);
263
- s.removeUnsubscribePages(r);
276
+ const r = l(), s = k(t);
277
+ r.removeUnsubscribePages(s);
264
278
  }
265
279
  }
266
280
  export {
267
- C as UNSUBSCRIBE_BLOCK_ID,
268
- H as UnsubscribeBlock
281
+ N as UNSUBSCRIBE_BLOCK_ID,
282
+ W as UnsubscribeBlock
269
283
  };
@@ -1,18 +1,19 @@
1
1
  var T = Object.defineProperty;
2
- var p = (o, s, e) => s in o ? T(o, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : o[s] = e;
3
- var c = (o, s, e) => p(o, typeof s != "symbol" ? s + "" : s, e);
2
+ var p = (a, s, e) => s in a ? T(a, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : a[s] = e;
3
+ var c = (a, s, e) => p(a, typeof s != "symbol" ? s + "" : s, e);
4
+ import { useEditorStore as _ } from "../../../stores/editor.js";
4
5
  import { useUnsubscribeStore as l } from "../../../stores/unsubscribe.js";
5
- import { Control as _, UEAttr as i, UIElementType as n } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
6
+ import { Control as g, UEAttr as i, UIElementType as n } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
6
7
  import { DATA_ATTRIBUTES as d } from "./utils/constants.js";
7
8
  import { parsePageList as h } from "./utils/utils.js";
8
- const g = "ui-elements-unsubscribe", r = {
9
+ const v = "ui-elements-unsubscribe", r = {
9
10
  SELECT_BUTTON: "selectTemplateButton",
10
11
  PREV_BUTTON: "prevButton",
11
12
  NEXT_BUTTON: "nextButton",
12
13
  COUNTER_TEXT: "counterText",
13
14
  PREVIEW_IMAGE: "previewImage"
14
15
  };
15
- class B extends _ {
16
+ class w extends g {
16
17
  constructor() {
17
18
  super(...arguments);
18
19
  c(this, "currentPreviewIndex", 0);
@@ -22,7 +23,7 @@ class B extends _ {
22
23
  c(this, "lastParsedAttribute");
23
24
  }
24
25
  getId() {
25
- return g;
26
+ return v;
26
27
  }
27
28
  getTemplate() {
28
29
  return `
@@ -61,6 +62,8 @@ class B extends _ {
61
62
  }
62
63
  _onButtonClick() {
63
64
  try {
65
+ if (_().isPreviewModeOpen)
66
+ return;
64
67
  const e = l();
65
68
  this._reseedSelectionFromBlock(), e.activeType = e.getSelectedCollection[this.currentPreviewIndex], e.pageSelectionUpdateStatus = !0, e.pageSelectionDrawerStatus = !0;
66
69
  } catch (e) {
@@ -71,8 +74,8 @@ class B extends _ {
71
74
  const e = l();
72
75
  if (e.$reset(), !this.currentNode || !("getAttribute" in this.currentNode))
73
76
  return;
74
- const t = this.currentNode.getAttribute(d.PAGE_TYPE), a = this.currentNode.getAttribute(d.PAGE_LIST);
75
- !t || !a || (e.setCollectionWithoutAutoSelection(Number(t)), e.loadSelectedTemplates(h(a)));
77
+ const t = this.currentNode.getAttribute(d.PAGE_TYPE), o = this.currentNode.getAttribute(d.PAGE_LIST);
78
+ !t || !o || (e.setCollectionWithoutAutoSelection(Number(t)), e.loadSelectedTemplates(h(o)));
76
79
  }
77
80
  _onPrevClick() {
78
81
  this.currentPreviewIndex > 0 && (this.currentPreviewIndex--, this._updatePreview(), this._updateCounter());
@@ -100,8 +103,8 @@ class B extends _ {
100
103
  }
101
104
  }
102
105
  _updateCounter() {
103
- const e = this.currentPreviewIndex + 1, t = this.totalTemplates, a = this.currentPreviewIndex === 0, u = this.currentPreviewIndex >= t - 1;
104
- this.api.setUIEAttribute(r.PREV_BUTTON, i.BUTTON.disabled, a), this.api.setUIEAttribute(r.NEXT_BUTTON, i.BUTTON.disabled, u), this.api.setUIEAttribute(
106
+ const e = this.currentPreviewIndex + 1, t = this.totalTemplates, o = this.currentPreviewIndex === 0, u = this.currentPreviewIndex >= t - 1;
107
+ this.api.setUIEAttribute(r.PREV_BUTTON, i.BUTTON.disabled, o), this.api.setUIEAttribute(r.NEXT_BUTTON, i.BUTTON.disabled, u), this.api.setUIEAttribute(
105
108
  r.COUNTER_TEXT,
106
109
  i.LABEL.text,
107
110
  `${this.api.translate("Showing")} ${e} ${this.api.translate("of")} ${t}`
@@ -142,8 +145,8 @@ class B extends _ {
142
145
  </${n.LABEL}>
143
146
  `;
144
147
  }
145
- _getIconButton(e, t, a) {
146
- const u = a ? `${i.BUTTON.disabled}="true"` : "";
148
+ _getIconButton(e, t, o) {
149
+ const u = o ? `${i.BUTTON.disabled}="true"` : "";
147
150
  return `
148
151
  <${n.BUTTON}
149
152
  id="${e}"
@@ -172,6 +175,6 @@ class B extends _ {
172
175
  }
173
176
  }
174
177
  export {
175
- g as UNSUBSCRIBE_CONTROL_ID,
176
- B as UnsubscribeControl
178
+ v as UNSUBSCRIBE_CONTROL_ID,
179
+ w as UnsubscribeControl
177
180
  };
package/dist/guido.css CHANGED
@@ -1 +1 @@
1
- .gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-195ab6d4]{position:relative;display:inline-block}.new-tag[data-v-195ab6d4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-195ab6d4] .guido__view-option-selection-desktop svg,[data-v-195ab6d4] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-195ab6d4] .in-segments-wrapper__button_selected,[data-v-195ab6d4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-195ab6d4] .in-tooltip-wrapper__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-64c52560]{gap:8px}.version-history__toolbar[data-v-64c52560]{gap:4px}.view-options-wrapper[data-v-d405ca59]{position:relative;display:inline-block}.new-tag[data-v-d405ca59]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-d405ca59] .guido__verion-history-view-option-selection-desktop svg,[data-v-d405ca59] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-d405ca59] .in-segments-wrapper__button_selected,[data-v-d405ca59] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-d405ca59] .in-tooltip-wrapper__icon{cursor:pointer}.auto-save-toggle[data-v-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-82128f7d]{gap:4px}.header-wrapper[data-v-5c02dcc7]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-50dac6de]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-50dac6de]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-50dac6de]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-f6a8cb4c]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-f6a8cb4c]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-f6a8cb4c]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-f6a8cb4c]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-f6a8cb4c]{object-fit:cover;transform:scale(1)}[data-v-43c617a7] .guido__verion-history-view-option-selection-desktop svg,[data-v-43c617a7] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-43c617a7] .in-segments-wrapper__button_selected,[data-v-43c617a7] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-988f8da6]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-988f8da6]{min-height:504px}.iframe-wrapper[data-v-e0424e99]{width:258px}.iframe-scaled[data-v-e0424e99]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-7419ae06] .vueperslides__bullets,[data-v-796d193b] .vueperslides__bullets{pointer-events:none!important}[data-v-796d193b] .vueperslides__parallax-wrapper{height:110px!important}[data-v-cadfc82d] .vueperslides__bullets{pointer-events:none!important}[data-v-cadfc82d] .vueperslides__parallax-wrapper{height:110px!important}
1
+ .gap-16[data-v-5553d071],.gap-16[data-v-0e1b0c54]{gap:16px}[data-v-73199fa4] .in-button-v2__wrapper{line-height:0}[data-v-22226124] .in-segments-wrapper__button_selected,[data-v-22226124] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb;color:#0010ac;border-color:#0010ac}[data-v-2cb418af] .in-progress-wrapper__progress p span:last-child{display:none!important}[data-v-2cb418af] .in-progress-description-status{display:none!important}.view-options-wrapper[data-v-195ab6d4]{position:relative;display:inline-block}.new-tag[data-v-195ab6d4]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-195ab6d4] .guido__view-option-selection-desktop svg,[data-v-195ab6d4] .guido__view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-195ab6d4] .in-segments-wrapper__button_selected,[data-v-195ab6d4] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-195ab6d4] .in-tooltip-wrapper__icon{cursor:pointer}.editor-toolbar[data-v-173c3a40]{gap:4px}.version-history-item[data-v-ee4b9c3f]{flex-basis:200px}.version-history[data-v-64c52560]{gap:8px}.version-history__toolbar[data-v-64c52560]{gap:4px}.view-options-wrapper[data-v-d405ca59]{position:relative;display:inline-block}.new-tag[data-v-d405ca59]{position:absolute;top:-8px;right:-16px;z-index:10}[data-v-d405ca59] .guido__verion-history-view-option-selection-desktop svg,[data-v-d405ca59] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-d405ca59] .in-segments-wrapper__button_selected,[data-v-d405ca59] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}[data-v-d405ca59] .in-tooltip-wrapper__icon{cursor:pointer}.auto-save-toggle[data-v-2c964af4]{position:relative}.auto-save-toggle__info-box[data-v-2c964af4]{position:absolute;top:100%;left:0;z-index:10;width:280px}.editor-actions[data-v-82128f7d]{gap:4px}.header-wrapper[data-v-5c02dcc7]{min-width:1000px}.guido-loading__wrapper[data-v-07c4b2d8]{height:100%;top:75px!important;bottom:0!important}.guido-editor__wrapper[data-v-50dac6de]{--ribbon-offset: 0px;position:relative;width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__container[data-v-50dac6de]{width:100%;height:calc(100vh - 128px - var(--ribbon-offset))}.guido-editor__no-header[data-v-50dac6de]{height:calc(100vh - 75px - var(--ribbon-offset))}[data-v-293f1c47] .in-breadcrumb-wrapper__links{cursor:pointer}.templates-wrapper[data-v-ec5c2ac6]{gap:16px;grid-template-columns:repeat(3,1fr)}.templates-wrapper .template-wrapper[data-v-ec5c2ac6]{cursor:pointer}.templates-wrapper .template-wrapper .template-container[data-v-ec5c2ac6]{height:274px;padding:2px;transition:none}.templates-wrapper .template-wrapper .template-container.selected[data-v-ec5c2ac6]{padding:1px}.templates-wrapper .template-wrapper .template-container .thumbnail[data-v-ec5c2ac6]{object-fit:cover;transform:scale(1)}[data-v-811cff80] .guido__verion-history-view-option-selection-desktop svg,[data-v-811cff80] .guido__verion-history-view-option-selection-mobile svg{margin:0 0 0 2px}[data-v-811cff80] .in-segments-wrapper__button_selected,[data-v-811cff80] .in-segments-wrapper__button_selected:hover{background-color:#dae1fb}.error-list[data-v-c3fd5d4b]{gap:16px}.desktop-browser-header[data-v-d86c5af5]{height:79px;min-height:79px}.desktop-browser-header__left[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:378px}.desktop-browser-header__center[data-v-d86c5af5]{height:79px;background-repeat:repeat-x;background-size:auto 100%;background-position:left top}.desktop-browser-header__right[data-v-d86c5af5]{-webkit-user-drag:none;height:79px;width:112px}.desktop-preview[data-v-06afaecb]{min-width:602px;height:70vh;min-height:583px;border-radius:10px}.desktop-preview iframe[data-v-06afaecb]{min-height:504px}.iframe-wrapper[data-v-cbafc185]{width:258px}.iframe-scaled[data-v-cbafc185]{width:320px;height:124.0310077519%;transform:scale(.80625);transform-origin:top left}.cropped-text[data-v-eb3d05d7]{width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-preview-wrapper__phone[data-v-3f472f96]{width:282px}.mobile-preview-wrapper__phone img[data-v-3f472f96]{object-fit:cover;border-radius:44px}.mobile-preview-wrapper__content[data-v-3f472f96]{width:258px;height:450px;left:12px}[data-v-7419ae06] .vueperslides__bullets,[data-v-796d193b] .vueperslides__bullets{pointer-events:none!important}[data-v-796d193b] .vueperslides__parallax-wrapper{height:110px!important}[data-v-cadfc82d] .vueperslides__bullets{pointer-events:none!important}[data-v-cadfc82d] .vueperslides__parallax-wrapper{height:110px!important}
@@ -1,4 +1,4 @@
1
- const o = { stripo: { version: "2.66.0" } }, s = {
1
+ const o = { stripo: { version: "2.65.0" } }, s = {
2
2
  guido: o
3
3
  };
4
4
  export {
@@ -0,0 +1,3 @@
1
+ export declare const usePreviewInteractionGuard: () => {
2
+ blockPreviewInteractions: (iframe: HTMLIFrameElement) => void;
3
+ };
@@ -29,6 +29,12 @@ export declare class UnsubscribeBlock extends Block {
29
29
  private _ensureLeadingTextGuard;
30
30
  private _hasUnsubscribeLink;
31
31
  private _readBlockId;
32
+ /**
33
+ * True when the block has a page type and a page list — i.e. a template was
34
+ * applied. A block with neither, combined with an already-present block id,
35
+ * is an undo-restored orphan of a cancelled block.
36
+ */
37
+ private _hasPageSelection;
32
38
  /**
33
39
  * Returns the block's stable id, assigning one via the document modifier if
34
40
  * the node has not been tagged yet. Idempotent: subsequent calls during
@@ -10,6 +10,7 @@ interface StoreState {
10
10
  typeSelectionDrawerStatus: boolean;
11
11
  isGlobalUnsubscribeDisabled: boolean;
12
12
  isSubscriptionPreferencesCenterDisabled: boolean;
13
+ pendingBlockId: string | null;
13
14
  }
14
15
  export declare const useUnsubscribeStore: import("pinia").StoreDefinition<"guidoUnsubscribe", StoreState, {
15
16
  getSelectedCollection: (state: {
@@ -35,6 +36,7 @@ export declare const useUnsubscribeStore: import("pinia").StoreDefinition<"guido
35
36
  typeSelectionDrawerStatus: boolean;
36
37
  isGlobalUnsubscribeDisabled: boolean;
37
38
  isSubscriptionPreferencesCenterDisabled: boolean;
39
+ pendingBlockId: string | null;
38
40
  } & import("pinia").PiniaCustomStateProperties<StoreState>) => number[];
39
41
  getSelectedTemplateByActiveType: (state: {
40
42
  templates: {
@@ -59,6 +61,7 @@ export declare const useUnsubscribeStore: import("pinia").StoreDefinition<"guido
59
61
  typeSelectionDrawerStatus: boolean;
60
62
  isGlobalUnsubscribeDisabled: boolean;
61
63
  isSubscriptionPreferencesCenterDisabled: boolean;
64
+ pendingBlockId: string | null;
62
65
  } & import("pinia").PiniaCustomStateProperties<StoreState>) => number;
63
66
  getTemplatesByActiveType: (state: {
64
67
  templates: {
@@ -83,6 +86,7 @@ export declare const useUnsubscribeStore: import("pinia").StoreDefinition<"guido
83
86
  typeSelectionDrawerStatus: boolean;
84
87
  isGlobalUnsubscribeDisabled: boolean;
85
88
  isSubscriptionPreferencesCenterDisabled: boolean;
89
+ pendingBlockId: string | null;
86
90
  } & import("pinia").PiniaCustomStateProperties<StoreState>) => {
87
91
  id: number;
88
92
  name: string;
@@ -119,6 +123,7 @@ export declare const useUnsubscribeStore: import("pinia").StoreDefinition<"guido
119
123
  typeSelectionDrawerStatus: boolean;
120
124
  isGlobalUnsubscribeDisabled: boolean;
121
125
  isSubscriptionPreferencesCenterDisabled: boolean;
126
+ pendingBlockId: string | null;
122
127
  } & import("pinia").PiniaCustomStateProperties<StoreState>) => (id: number) => string;
123
128
  getSelectedUnsubscribePagesByCollection: (state: {
124
129
  templates: {
@@ -143,6 +148,7 @@ export declare const useUnsubscribeStore: import("pinia").StoreDefinition<"guido
143
148
  typeSelectionDrawerStatus: boolean;
144
149
  isGlobalUnsubscribeDisabled: boolean;
145
150
  isSubscriptionPreferencesCenterDisabled: boolean;
151
+ pendingBlockId: string | null;
146
152
  } & import("pinia").PiniaCustomStateProperties<StoreState>) => (collectionType: number) => number[];
147
153
  isActiveTypeFirstInCollection: (state: {
148
154
  templates: {
@@ -167,6 +173,7 @@ export declare const useUnsubscribeStore: import("pinia").StoreDefinition<"guido
167
173
  typeSelectionDrawerStatus: boolean;
168
174
  isGlobalUnsubscribeDisabled: boolean;
169
175
  isSubscriptionPreferencesCenterDisabled: boolean;
176
+ pendingBlockId: string | null;
170
177
  } & import("pinia").PiniaCustomStateProperties<StoreState>) => boolean;
171
178
  isActiveTypeLastInCollection: (state: {
172
179
  templates: {
@@ -191,6 +198,7 @@ export declare const useUnsubscribeStore: import("pinia").StoreDefinition<"guido
191
198
  typeSelectionDrawerStatus: boolean;
192
199
  isGlobalUnsubscribeDisabled: boolean;
193
200
  isSubscriptionPreferencesCenterDisabled: boolean;
201
+ pendingBlockId: string | null;
194
202
  } & import("pinia").PiniaCustomStateProperties<StoreState>) => boolean;
195
203
  hasTemplatesByCollectionType: (state: {
196
204
  templates: {
@@ -215,6 +223,7 @@ export declare const useUnsubscribeStore: import("pinia").StoreDefinition<"guido
215
223
  typeSelectionDrawerStatus: boolean;
216
224
  isGlobalUnsubscribeDisabled: boolean;
217
225
  isSubscriptionPreferencesCenterDisabled: boolean;
226
+ pendingBlockId: string | null;
218
227
  } & import("pinia").PiniaCustomStateProperties<StoreState>) => Record<number, boolean>;
219
228
  unsubscribePagesStatus: (state: {
220
229
  templates: {
@@ -239,10 +248,11 @@ export declare const useUnsubscribeStore: import("pinia").StoreDefinition<"guido
239
248
  typeSelectionDrawerStatus: boolean;
240
249
  isGlobalUnsubscribeDisabled: boolean;
241
250
  isSubscriptionPreferencesCenterDisabled: boolean;
251
+ pendingBlockId: string | null;
242
252
  } & import("pinia").PiniaCustomStateProperties<StoreState>) => boolean;
243
253
  }, {
244
254
  $reset(): void;
245
- fetchTemplates(): Promise<void>;
255
+ fetchTemplates(force?: boolean): Promise<void>;
246
256
  setCollection(collectionType: number): void;
247
257
  setCollectionWithoutAutoSelection(collectionType: number): void;
248
258
  setSelectedTemplate(template: number): void;
@@ -1,6 +1,6 @@
1
1
  import { TYPE_COLLECTIONS as i, PAGE_TYPES as p } from "../enums/unsubscribe.js";
2
2
  import { useUnsubscribeApi as d } from "../services/unsubscribeApi.js";
3
- import { defineStore as h } from "pinia";
3
+ import { defineStore as u } from "pinia";
4
4
  let o = null;
5
5
  const r = () => ({
6
6
  templates: [],
@@ -12,8 +12,9 @@ const r = () => ({
12
12
  pageSelectionDrawerStatus: !1,
13
13
  typeSelectionDrawerStatus: !1,
14
14
  isGlobalUnsubscribeDisabled: !1,
15
- isSubscriptionPreferencesCenterDisabled: !1
16
- }), b = h("guidoUnsubscribe", {
15
+ isSubscriptionPreferencesCenterDisabled: !1,
16
+ pendingBlockId: null
17
+ }), b = u("guidoUnsubscribe", {
17
18
  state: () => r(),
18
19
  getters: {
19
20
  getSelectedCollection: (e) => i[e.selectedCollectionType],
@@ -62,10 +63,10 @@ const r = () => ({
62
63
  selectedUnsubscribePages: t
63
64
  });
64
65
  },
65
- async fetchTemplates() {
66
- this.templates.length || (o || (o = (async () => {
67
- const { getUnsubscribePages: e } = d();
68
- this.templates = await e();
66
+ async fetchTemplates(e = !1) {
67
+ !e && this.templates.length || ((e || !o) && (o = (async () => {
68
+ const { getUnsubscribePages: t } = d();
69
+ this.templates = await t();
69
70
  })().finally(() => {
70
71
  o = null;
71
72
  })), await o);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useinsider/guido",
3
- "version": "3.7.2-beta.c0c3cea",
3
+ "version": "3.7.2-beta.cebab71",
4
4
  "description": "Guido is a Vue + TypeScript wrapper for Email Plugin. Easily embed the email editor in your Vue applications.",
5
5
  "main": "./dist/guido.umd.cjs",
6
6
  "module": "./dist/library.js",
@@ -101,7 +101,7 @@
101
101
  },
102
102
  "guido": {
103
103
  "stripo": {
104
- "version": "2.66.0"
104
+ "version": "2.65.0"
105
105
  }
106
106
  }
107
107
  }