@useinsider/guido 3.22.0-beta.ce512a7 → 3.22.0-beta.d4e1d48

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 (65) hide show
  1. package/README.md +0 -1
  2. package/dist/@types/config/schemas.js +10 -11
  3. package/dist/components/Guido.vue.js +2 -2
  4. package/dist/components/Guido.vue2.js +106 -117
  5. package/dist/components/organisms/AutoSaveController.vue2.js +10 -20
  6. package/dist/components/organisms/header/AutoSaveToggle.vue.js +22 -0
  7. package/dist/components/organisms/header/AutoSaveToggle.vue2.js +19 -0
  8. package/dist/components/organisms/header/EditorActions.vue.js +13 -13
  9. package/dist/components/organisms/header/EditorActions.vue2.js +73 -58
  10. package/dist/components/organisms/header/HeaderWrapper.vue.js +6 -6
  11. package/dist/components/organisms/header/HeaderWrapper.vue2.js +17 -9
  12. package/dist/components/organisms/header/LeftSlot.vue.js +1 -1
  13. package/dist/components/organisms/header/LeftSlot.vue2.js +23 -28
  14. package/dist/components/organisms/header/MiddleSlot.vue.js +4 -4
  15. package/dist/components/organisms/header/MiddleSlot.vue2.js +7 -8
  16. package/dist/components/organisms/header/RightSlot.vue.js +10 -11
  17. package/dist/components/organisms/header/RightSlot.vue2.js +18 -13
  18. package/dist/components/organisms/onboarding/OnboardingWrapper.vue.js +12 -12
  19. package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +35 -60
  20. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +11 -11
  21. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +9 -9
  22. package/dist/composables/useCustomInterfaceAppearance.js +41 -42
  23. package/dist/config/i18n/en/labels.json.js +4 -36
  24. package/dist/config/i18n/en/tooltips.json.js +1 -2
  25. package/dist/guido.css +1 -1
  26. package/dist/sprite.svg +0 -10
  27. package/dist/src/@types/config/schemas.d.ts +0 -2
  28. package/dist/src/components/organisms/AutoSaveController.vue.d.ts +1 -19
  29. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +19 -1
  30. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +19 -1
  31. package/dist/src/composables/useActionsApi.d.ts +2 -2
  32. package/dist/src/composables/useConfig.d.ts +0 -2
  33. package/dist/src/stores/autosave.d.ts +1 -73
  34. package/dist/src/stores/config.d.ts +0 -20
  35. package/dist/src/stores/editor.d.ts +0 -109
  36. package/dist/src/stores/onboarding.d.ts +33 -964
  37. package/dist/src/stores/unsubscribe.d.ts +10 -0
  38. package/dist/src/stores/version-history.d.ts +1 -1
  39. package/dist/src/utils/templatePreparation.d.ts +1 -1
  40. package/dist/src/utils/timeUtil.d.ts +8 -5
  41. package/dist/static/styles/variables.css.js +0 -2
  42. package/dist/stores/autosave.js +7 -12
  43. package/dist/stores/editor.js +3 -8
  44. package/dist/stores/onboarding.js +22 -48
  45. package/dist/stores/unsubscribe.js +33 -29
  46. package/dist/utils/timeUtil.js +17 -6
  47. package/package.json +1 -1
  48. package/dist/components/organisms/header/AutoSaveStatus.vue.js +0 -17
  49. package/dist/components/organisms/header/AutoSaveStatus.vue2.js +0 -25
  50. package/dist/components/organisms/header/EditorActionsMenu.vue.js +0 -20
  51. package/dist/components/organisms/header/EditorActionsMenu.vue2.js +0 -99
  52. package/dist/components/organisms/header/accessibility/AccessibilityToolbar.vue.js +0 -18
  53. package/dist/components/organisms/header/accessibility/AccessibilityToolbar.vue2.js +0 -37
  54. package/dist/components/organisms/header/accessibility/ColorVisionSelect.vue.js +0 -22
  55. package/dist/components/organisms/header/accessibility/ColorVisionSelect.vue2.js +0 -48
  56. package/dist/components/organisms/onboarding/EditorTabBarOnboarding.vue.js +0 -19
  57. package/dist/components/organisms/onboarding/EditorTabBarOnboarding.vue2.js +0 -90
  58. package/dist/composables/useAccessibilityApi.js +0 -51
  59. package/dist/src/components/organisms/header/EditorActionsMenu.vue.d.ts +0 -2
  60. package/dist/src/components/organisms/header/accessibility/AccessibilityToolbar.vue.d.ts +0 -2
  61. package/dist/src/components/organisms/header/accessibility/ColorVisionSelect.vue.d.ts +0 -2
  62. package/dist/src/components/organisms/onboarding/EditorTabBarOnboarding.vue.d.ts +0 -2
  63. package/dist/src/composables/useAccessibilityApi.d.ts +0 -13
  64. package/dist/static/styles/components/accessibility.css.js +0 -234
  65. /package/dist/src/components/organisms/header/{AutoSaveStatus.vue.d.ts → AutoSaveToggle.vue.d.ts} +0 -0
package/README.md CHANGED
@@ -166,7 +166,6 @@ const config: GuidoConfigInput = {
166
166
  allowlistEnabled?: boolean, // Default: false - Pre-save domain-allowlist check (opt-in). Guido self-serves the block toaster (role lookup, deep-link, copy from window.trans).
167
167
  allowSaveWithErrors?: boolean, // Default: true - Allow the validation drawer's "Save and Continue" soft-save. Set false to hard-block invalid saves (transactional + unsubscribe pages).
168
168
  reusableRecommendationStrategy?: boolean, // Default: false - Assign an RRS strategy to recommendation blocks instead of per-block algorithm/filters/shuffle/product-count settings.
169
- accessibilityTesting?: boolean, // Default: false - Show the Accessibility Test entry in the header kebab menu (Stripo's checker: contrast, image alternatives, colour-vision simulation) and the tab-bar onboarding tour that points at it.
170
169
  },
171
170
 
172
171
  // Optional: Callbacks
@@ -1,5 +1,5 @@
1
- import { ModuleFolderDefaults as S } from "../../enums/defaults.js";
2
- import { object as a, number as s, optional as e, string as t, picklist as m, pipe as i, minLength as b, custom as k, boolean as o, array as c, transform as y, unknown as r, record as g, fallback as R, literal as u, looseObject as C, variant as T, union as h, lazy as I } from "../../node_modules/valibot/dist/index.js";
1
+ import { ModuleFolderDefaults as f } from "../../enums/defaults.js";
2
+ import { object as a, number as s, optional as e, string as t, picklist as m, pipe as i, minLength as b, custom as k, boolean as o, array as c, transform as y, unknown as r, record as g, fallback as R, literal as u, looseObject as C, variant as I, union as h, lazy as T } from "../../node_modules/valibot/dist/index.js";
3
3
  const p = {
4
4
  /** Promotional/marketing emails */
5
5
  PROMOTIONAL: 1,
@@ -76,17 +76,17 @@ const p = {
76
76
  value: t()
77
77
  })
78
78
  )
79
- }), f = I(() => C({
79
+ }), S = T(() => C({
80
80
  text: e(t()),
81
81
  // eslint-disable-next-line camelcase -- backend field name
82
82
  tag_text: e(t()),
83
83
  value: e(t()),
84
- children: e(c(f)),
84
+ children: e(c(S)),
85
85
  // eslint-disable-next-line camelcase -- backend field name
86
- select_items: e(c(f))
86
+ select_items: e(c(S))
87
87
  })), N = g(
88
88
  t(),
89
- R(c(f), [])
89
+ R(c(S), [])
90
90
  ), P = C({
91
91
  /** Block ID (matches the dictionary key and the legacy HTML element id) */
92
92
  id: e(s()),
@@ -210,9 +210,9 @@ const p = {
210
210
  /** Email header settings */
211
211
  emailHeader: e(D, { senderName: "", subject: "" }),
212
212
  /** Folder name for user-saved modules (used by Stripo plugin panel for path construction) */
213
- savedModulesFolderName: e(t(), S.SAVED_MODULES),
213
+ savedModulesFolderName: e(t(), f.SAVED_MODULES),
214
214
  /** Folder name for default/prebuilt modules (used by Stripo plugin panel for path construction) */
215
- defaultModulesFolderName: e(t(), S.DEFAULT_MODULES)
215
+ defaultModulesFolderName: e(t(), f.DEFAULT_MODULES)
216
216
  }), F = a({
217
217
  /** Whether to show the header bar */
218
218
  showHeader: e(o(), !0),
@@ -237,7 +237,6 @@ const p = {
237
237
  liquidSyntax: e(o(), !1),
238
238
  /** Enable autosave (3-min interval + tab-hide). User toggles on/off from the header. */
239
239
  autosave: e(o(), !1),
240
- accessibilityTesting: e(o(), !1),
241
240
  /** Enable pre-save domain-allowlist validation (opt-in; Guido self-serves the block toaster) */
242
241
  allowlistEnabled: e(o(), !1),
243
242
  /** Enable persistent link tracking-id assignment for the click heatmap (opt-in) */
@@ -316,7 +315,7 @@ const p = {
316
315
  (n) => typeof n == "function",
317
316
  "processor must be a function"
318
317
  )
319
- }), V = T("type", [
318
+ }), V = I("type", [
320
319
  H,
321
320
  _,
322
321
  q,
@@ -368,7 +367,7 @@ export {
368
367
  G as CustomRuleSchema,
369
368
  w as DefaultBlockTypeSchema,
370
369
  N as DynamicContentListSchema,
371
- f as DynamicContentNodeSchema,
370
+ S as DynamicContentNodeSchema,
372
371
  M as DynamicContentSchema,
373
372
  O as EditorSchema,
374
373
  D as EmailHeaderSchema,
@@ -3,7 +3,7 @@ import o from "./Guido.vue2.js";
3
3
  import i from "../_virtual/_plugin-vue2_normalizer.js";
4
4
  var t = function() {
5
5
  var a = this, r = a._self._c, e = a._self._setupProxy;
6
- return r("div", { ref: "wrapperRef", staticClass: "guido-editor__wrapper", class: { "guido-editor__no-header": e.noHeader } }, [r(e.HeaderWrapper), r(e.AutoSaveController, { ref: "autoSaveControllerRef" }), e.editorStore.isPreviewModeOpen ? r(e.PreviewContainer) : a._e(), r("div", { directives: [{ name: "show", rawName: "v-show", value: !e.previewStore.isLoaded, expression: "!previewStore.isLoaded" }], staticClass: "guido-editor__container", class: { "guido-editor__no-header": e.noHeader }, attrs: { id: "guido-editor" } }), r(e.Toaster), r(e.AuthErrorModal), r(e.FilterSelectionDrawer), e.isRrsEnabled || e.hasAssignedStrategy ? r(e.AssignStrategyDrawer) : a._e(), e.isRrsEnabled || e.hasAssignedStrategy ? r(e.RemoveStrategyModal) : a._e(), e.isRrsEnabled ? r(e.LegacyStrategyUpdatedModal) : a._e(), r(e.SaveAsTemplateDrawer), e.isSaveValidationEnabled ? r(e.ValidationErrorDrawer) : a._e(), e.isTestPartner() ? a._e() : r(e.OnboardingWrapper, { on: { "onboarding-finished": function(_) {
6
+ return r("div", { ref: "wrapperRef", staticClass: "guido-editor__wrapper", class: { "guido-editor__no-header": e.noHeader } }, [r(e.HeaderWrapper, { ref: "headerWrapperRef" }), r(e.AutoSaveController), e.editorStore.isPreviewModeOpen ? r(e.PreviewContainer) : a._e(), r("div", { directives: [{ name: "show", rawName: "v-show", value: !e.previewStore.isLoaded, expression: "!previewStore.isLoaded" }], staticClass: "guido-editor__container", class: { "guido-editor__no-header": e.noHeader }, attrs: { id: "guido-editor" } }), r(e.Toaster), r(e.AuthErrorModal), r(e.FilterSelectionDrawer), e.isRrsEnabled || e.hasAssignedStrategy ? r(e.AssignStrategyDrawer) : a._e(), e.isRrsEnabled || e.hasAssignedStrategy ? r(e.RemoveStrategyModal) : a._e(), e.isRrsEnabled ? r(e.LegacyStrategyUpdatedModal) : a._e(), r(e.SaveAsTemplateDrawer), e.isSaveValidationEnabled ? r(e.ValidationErrorDrawer) : a._e(), e.isTestPartner() ? a._e() : r(e.OnboardingWrapper, { on: { "onboarding-finished": function(_) {
7
7
  return e.emit("onboarding:finished");
8
8
  } } }), r(e.UnsubscribeWrapper), r(e.LoadingWrapper)], 1);
9
9
  }, s = [], n = /* @__PURE__ */ i(
@@ -12,7 +12,7 @@ var t = function() {
12
12
  s,
13
13
  !1,
14
14
  null,
15
- "f0ba01bc"
15
+ "c5146fc5"
16
16
  );
17
17
  const v = n.exports;
18
18
  export {
@@ -1,190 +1,179 @@
1
- import { defineComponent as de, defineAsyncComponent as m, ref as W, computed as p, watch as G, onMounted as me, onUnmounted as le } from "vue";
2
- import { useCortexBlueprintBridge as ue } from "../composables/useCortexBlueprintBridge.js";
3
- import { useEditorLock as pe } from "../composables/useEditorLock.js";
4
- import { provideGuidoActions as fe } from "../composables/useGuidoActions.js";
5
- import { useGuidoStateBridge as ye } from "../composables/useGuidoStateBridge.js";
6
- import { usePartner as ge } from "../composables/usePartner.js";
7
- import { useSaveValidationRollout as ve } from "../composables/useSaveValidationRollout.js";
8
- import { useStripo as Se } from "../composables/useStripo.js";
9
- import { useTimerClone as be } from "../composables/useTimerClone.js";
10
- import { useToaster as he } from "../composables/useToaster.js";
11
- import { useTranslations as Ee } from "../composables/useTranslations.js";
12
- import { migrate as $ } from "../config/migrator/index.js";
13
- import { ModuleFolderDefaults as z } from "../enums/defaults.js";
14
- import { RIBBON_SELECTOR as we } from "../enums/onboarding.js";
15
- import { ToasterTypeOptions as De } from "../enums/toaster.js";
16
- import { useRecommendationExtensionStore as q, disposeStrategyPageReturnListeners as Te } from "../extensions/Blocks/Recommendation/store/recommendation.js";
17
- import { disposeUnsubscribeListeners as ke } from "../extensions/Blocks/Unsubscribe/block.js";
18
- import Ce from "./organisms/AutoSaveController.vue.js";
19
- import Re from "./organisms/base/AuthErrorModal.vue.js";
20
- import Fe from "./organisms/base/Toaster.vue.js";
21
- import Le from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
22
- import Me from "./organisms/header/HeaderWrapper.vue.js";
23
- import Ie from "./organisms/LoadingWrapper.vue.js";
24
- import Ue from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
25
- import Oe from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
26
- import Ae from "./organisms/validation/ValidationErrorDrawer.vue.js";
27
- import { useStripoApi as Be } from "../services/stripoApi.js";
28
- import { useConfigStore as Ne } from "../stores/config.js";
29
- import { useDynamicContentStore as Pe } from "../stores/dynamic-content.js";
1
+ import { defineComponent as ie, defineAsyncComponent as m, ref as W, computed as p, watch as G, onMounted as ce, onUnmounted as de } from "vue";
2
+ import { useCortexBlueprintBridge as me } from "../composables/useCortexBlueprintBridge.js";
3
+ import { useEditorLock as le } from "../composables/useEditorLock.js";
4
+ import { provideGuidoActions as ue } from "../composables/useGuidoActions.js";
5
+ import { useGuidoStateBridge as pe } from "../composables/useGuidoStateBridge.js";
6
+ import { usePartner as fe } from "../composables/usePartner.js";
7
+ import { useSaveValidationRollout as ye } from "../composables/useSaveValidationRollout.js";
8
+ import { useStripo as ge } from "../composables/useStripo.js";
9
+ import { useTimerClone as Se } from "../composables/useTimerClone.js";
10
+ import { migrate as V } from "../config/migrator/index.js";
11
+ import { ModuleFolderDefaults as $ } from "../enums/defaults.js";
12
+ import { RIBBON_SELECTOR as ve } from "../enums/onboarding.js";
13
+ import { useRecommendationExtensionStore as z, disposeStrategyPageReturnListeners as be } from "../extensions/Blocks/Recommendation/store/recommendation.js";
14
+ import { disposeUnsubscribeListeners as he } from "../extensions/Blocks/Unsubscribe/block.js";
15
+ import Ee from "./organisms/AutoSaveController.vue.js";
16
+ import we from "./organisms/base/AuthErrorModal.vue.js";
17
+ import De from "./organisms/base/Toaster.vue.js";
18
+ import Ce from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
19
+ import ke from "./organisms/header/HeaderWrapper.vue.js";
20
+ import Re from "./organisms/LoadingWrapper.vue.js";
21
+ import Fe from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
22
+ import Le from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
23
+ import Me from "./organisms/validation/ValidationErrorDrawer.vue.js";
24
+ import { useStripoApi as Te } from "../services/stripoApi.js";
25
+ import { useConfigStore as Ie } from "../stores/config.js";
26
+ import { useDynamicContentStore as Ue } from "../stores/dynamic-content.js";
30
27
  import { useEditorStore as E } from "../stores/editor.js";
31
- import { usePreviewStore as _e } from "../stores/preview.js";
32
- import { useSaveValidationStore as Ve } from "../stores/save-validation.js";
33
- import { useTemplateStore as xe } from "../stores/template.js";
34
- import { useUnsubscribeStore as He } from "../stores/unsubscribe.js";
35
- import { readTrackFloor as K } from "../utils/linkTrackingIds.js";
36
- const To = /* @__PURE__ */ de({
28
+ import { usePreviewStore as Ae } from "../stores/preview.js";
29
+ import { useSaveValidationStore as Be } from "../stores/save-validation.js";
30
+ import { useTemplateStore as Ne } from "../stores/template.js";
31
+ import { useUnsubscribeStore as Pe } from "../stores/unsubscribe.js";
32
+ import { readTrackFloor as H } from "../utils/linkTrackingIds.js";
33
+ const yt = /* @__PURE__ */ ie({
37
34
  __name: "Guido",
38
35
  props: {
39
36
  config: null,
40
37
  ready: { type: Boolean, default: !0 }
41
38
  },
42
39
  emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready", "onboarding:finished", "test-email:click"],
43
- setup(j, { expose: J, emit: r }) {
44
- const i = j, Q = m(
40
+ setup(q, { expose: K, emit: r }) {
41
+ const s = q, j = m(
45
42
  () => import("./organisms/email-preview/PreviewContainer.vue.js")
46
- ), X = m(
43
+ ), J = m(
47
44
  () => import("./organisms/onboarding/OnboardingWrapper.vue.js")
48
- ), Y = m(
45
+ ), Q = m(
49
46
  () => import("./organisms/extensions/recommendation/AssignStrategyDrawer.vue.js")
50
- ), Z = m(
47
+ ), X = m(
51
48
  () => import("./organisms/extensions/recommendation/RemoveStrategyModal.vue.js")
52
- ), w = W(), ee = m(
49
+ ), Y = m(
53
50
  () => import("./organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js")
54
- ), f = W(), y = Pe(), D = He(), t = Ne();
55
- i.ready && t.init(i.config);
56
- const a = E(), oe = _e(), l = p(() => a.hasChanges), { isTestPartner: te } = ge(), { isEnabled: ne, loadRollout: T } = ve(), { showToaster: k } = he(), C = Ee(), R = () => {
57
- var o;
58
- if (a.isVersionHistoryOpen) {
59
- console.debug("guido:save:silent:blocked", { isVersionHistoryOpen: !0 }), k({
60
- type: De.Warning,
61
- message: C("email-editor.save-blocked-outside-editor")
62
- });
63
- return;
64
- }
65
- return (o = w.value) == null ? void 0 : o.saveSilent();
66
- }, F = (o) => {
67
- a.loadingStatus = o;
51
+ ), w = W(), f = W(), y = Ue(), D = Pe(), o = Ie();
52
+ s.ready && o.init(s.config);
53
+ const c = E(), Z = Ae(), l = p(() => c.hasChanges), { isTestPartner: ee } = fe(), { isEnabled: te, loadRollout: C } = ye(), k = () => {
54
+ var t;
55
+ return (t = w.value) == null ? void 0 : t.handleSave(!0);
56
+ }, R = (t) => {
57
+ c.loadingStatus = t;
68
58
  };
69
- ue(), ye();
59
+ me(), pe();
70
60
  const g = () => {
71
- var o, e;
61
+ var t, e;
72
62
  return {
73
- emailId: t.templateId,
74
- userId: t.userId,
75
- username: t.username,
76
- partnerName: t.partnerName,
77
- savedModulesFolderName: ((o = t.editor) == null ? void 0 : o.savedModulesFolderName) || z.SAVED_MODULES,
78
- defaultModulesFolderName: ((e = t.editor) == null ? void 0 : e.defaultModulesFolderName) || z.DEFAULT_MODULES
63
+ emailId: o.templateId,
64
+ userId: o.userId,
65
+ username: o.username,
66
+ partnerName: o.partnerName,
67
+ savedModulesFolderName: ((t = o.editor) == null ? void 0 : t.savedModulesFolderName) || $.SAVED_MODULES,
68
+ defaultModulesFolderName: ((e = o.editor) == null ? void 0 : e.defaultModulesFolderName) || $.DEFAULT_MODULES
79
69
  };
80
- }, { initPlugin: L, preloadRuntime: M } = Se(), { runExclusive: I, beginMount: U, isCurrentMount: v } = pe();
70
+ }, { initPlugin: F, preloadRuntime: L } = ge(), { runExclusive: M, beginMount: T, isCurrentMount: S } = le();
81
71
  let u = 0;
82
- const { getDefaultTemplate: O } = Be(), { cloneTimersOnSave: A, hasTimerBlocks: B } = be(), re = p(() => {
83
- var o;
84
- return !((o = t.ui) != null && o.showHeader);
85
- }), se = p(() => t.isFeatureEnabled("reusableRecommendationStrategy")), ie = p(
86
- () => !!q().recommendationConfigs.strategyId
72
+ const { getDefaultTemplate: I } = Te(), { cloneTimersOnSave: U, hasTimerBlocks: A } = Se(), oe = p(() => {
73
+ var t;
74
+ return !((t = o.ui) != null && t.showHeader);
75
+ }), ne = p(() => o.isFeatureEnabled("reusableRecommendationStrategy")), re = p(
76
+ () => !!z().recommendationConfigs.strategyId
87
77
  );
88
- fe({
78
+ ue({
89
79
  onBack: () => {
90
80
  console.debug("guido:back"), r("back");
91
81
  },
92
82
  onSaveStart: () => {
93
83
  console.debug("guido:save:start"), r("save:start");
94
84
  },
95
- onSaveComplete: (o) => {
96
- const e = { ...o, metadata: g() };
85
+ onSaveComplete: (t) => {
86
+ const e = { ...t, metadata: g() };
97
87
  console.debug("guido:save:complete", e), r("save:complete", e);
98
88
  },
99
89
  onTestEmailClick: () => {
100
90
  console.debug("guido:test-email:click"), r("test-email:click");
101
91
  }
102
92
  });
103
- const N = (o) => {
104
- console.debug("dynamic-content:close", o), y.setSelectedDynamicContent(o), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: o }));
105
- }, P = () => {
93
+ const B = (t) => {
94
+ console.debug("dynamic-content:close", t), y.setSelectedDynamicContent(t), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: t }));
95
+ }, N = () => {
106
96
  console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
107
97
  };
108
98
  G(() => l.value, () => {
109
99
  r("on-change", l.value);
110
100
  });
111
- const S = (o) => {
112
- const e = o, { attribute: s, position: d } = e.detail;
113
- console.debug("dynamic-content:open", e.detail), r("dynamic-content:open", s, d);
101
+ const v = (t) => {
102
+ const e = t, { attribute: a, position: d } = e.detail;
103
+ console.debug("dynamic-content:open", e.detail), r("dynamic-content:open", a, d);
114
104
  };
115
- let c = null;
105
+ let i = null;
116
106
  const b = () => {
117
107
  var e;
118
- const o = document.querySelector(we);
119
- (e = f.value) == null || e.style.setProperty("--ribbon-offset", `${(o == null ? void 0 : o.offsetHeight) ?? 0}px`);
108
+ const t = document.querySelector(ve);
109
+ (e = f.value) == null || e.style.setProperty("--ribbon-offset", `${(t == null ? void 0 : t.offsetHeight) ?? 0}px`);
120
110
  }, h = async () => {
121
- var o;
111
+ var t;
122
112
  try {
123
- t.initialized || t.init(i.config), a.templateId = t.templateId;
124
- const e = t.template, s = (e == null ? void 0 : e.html) || "", d = (e == null ? void 0 : e.css) || "", _ = (e == null ? void 0 : e.preselectedDynamicContent) || [];
113
+ o.initialized || o.init(s.config), c.templateId = o.templateId;
114
+ const e = o.template, a = (e == null ? void 0 : e.html) || "", d = (e == null ? void 0 : e.css) || "", P = (e == null ? void 0 : e.preselectedDynamicContent) || [];
125
115
  D.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
126
- const V = ((o = e == null ? void 0 : e.migration) == null ? void 0 : o.recommendationConfigs) ?? {}, x = t.isFeatureEnabled("linkTrackingIds"), H = {
127
- partnerName: t.partnerName,
116
+ const _ = ((t = e == null ? void 0 : e.migration) == null ? void 0 : t.recommendationConfigs) ?? {}, O = o.isFeatureEnabled("linkTrackingIds"), x = {
117
+ partnerName: o.partnerName,
128
118
  campaignUrls: e == null ? void 0 : e.recommendationCampaignUrls,
129
- rrsEnabled: t.isFeatureEnabled("reusableRecommendationStrategy")
119
+ rrsEnabled: o.isFeatureEnabled("reusableRecommendationStrategy")
130
120
  };
131
121
  let n = {
132
- html: s && await $(s, V, H),
122
+ html: a && await V(a, _, x),
133
123
  css: d
134
124
  };
135
- n.html || (n = await O(), n.html = await $(n.html, V, H));
136
- const ae = x ? K(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
137
- B(n.html) && (n.html = await A(n.html)), x && (a.trackIdSessionFloor = Math.max(ae, K(n.html)));
138
- const ce = {
139
- preselectedDynamicContentList: _,
125
+ n.html || (n = await I(), n.html = await V(n.html, _, x));
126
+ const ae = O ? H(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
127
+ A(n.html) && (n.html = await U(n.html)), O && (c.trackIdSessionFloor = Math.max(ae, H(n.html)));
128
+ const se = {
129
+ preselectedDynamicContentList: P,
140
130
  onReady: () => {
141
131
  console.debug("guido:ready"), r("ready");
142
132
  }
143
133
  };
144
- u = U(), await L(n, g(), ce), y.selectedDynamicContentList = _;
134
+ u = T(), await F(n, g(), se), y.selectedDynamicContentList = P;
145
135
  } catch (e) {
146
136
  console.error("Failed to initialize Stripo editor:", e);
147
137
  }
148
138
  };
149
- return me(async () => {
139
+ return ce(async () => {
150
140
  var e;
151
- console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), q().$reset(), E().$reset(), xe().$reset(), Ve().$reset(), T(), b();
152
- const o = (e = f.value) == null ? void 0 : e.parentElement;
153
- if (o && (c = new ResizeObserver(b), c.observe(o)), M(), i.ready)
141
+ console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), z().$reset(), E().$reset(), Ne().$reset(), Be().$reset(), C(), b();
142
+ const t = (e = f.value) == null ? void 0 : e.parentElement;
143
+ if (t && (i = new ResizeObserver(b), i.observe(t)), L(), s.ready)
154
144
  await h();
155
145
  else {
156
- const s = G(() => i.ready, (d) => {
157
- d && (s(), h());
146
+ const a = G(() => s.ready, (d) => {
147
+ d && (a(), h());
158
148
  });
159
149
  }
160
- document.addEventListener("dynamic-content:open", S);
161
- }), le(() => {
162
- if (ke(), Te(), c == null || c.disconnect(), document.removeEventListener("dynamic-content:open", S), v(u))
150
+ document.addEventListener("dynamic-content:open", v);
151
+ }), de(() => {
152
+ if (he(), be(), i == null || i.disconnect(), document.removeEventListener("dynamic-content:open", v), S(u))
163
153
  try {
164
- const o = E();
165
- o.isStripoInitialized = !1, o.isAccessibilityTestingOpen = !1, o.imagesHidden = !1, o.colorVisionDeficiency = "";
166
- } catch (o) {
167
- console.debug("Failed to close the editor readiness gate on unmount", o);
154
+ E().isStripoInitialized = !1;
155
+ } catch (t) {
156
+ console.debug("Failed to close the editor readiness gate on unmount", t);
168
157
  }
169
- I(async () => {
170
- if (v(u))
158
+ M(async () => {
159
+ if (S(u))
171
160
  try {
172
161
  window.UIEditor.removeEditor();
173
162
  } catch {
174
163
  console.debug("Failed to remove Stripo editor: No editor found");
175
164
  }
176
- }), t.reset();
177
- }), J({
165
+ }), o.reset();
166
+ }), K({
178
167
  dynamicContent: {
179
- insert: N,
180
- close: P
168
+ insert: B,
169
+ close: N
181
170
  },
182
171
  hasChanges: l,
183
- saveSilent: R,
184
- setLoading: F
185
- }), { __sfc: !0, PreviewContainer: Q, OnboardingWrapper: X, AssignStrategyDrawer: Y, RemoveStrategyModal: Z, autoSaveControllerRef: w, LegacyStrategyUpdatedModal: ee, wrapperRef: f, dynamicContentStore: y, unsubscribeStore: D, props: i, configStore: t, editorStore: a, previewStore: oe, hasChanges: l, isTestPartner: te, isSaveValidationEnabled: ne, loadRollout: T, showToaster: k, trans: C, saveSilent: R, setLoading: F, emit: r, buildMetadata: g, initPlugin: L, preloadRuntime: M, runExclusive: I, beginMount: U, isCurrentMount: v, mountGeneration: u, getDefaultTemplate: O, cloneTimersOnSave: A, hasTimerBlocks: B, noHeader: re, isRrsEnabled: se, hasAssignedStrategy: ie, insertDynamicContent: N, closeDynamicContent: P, handleDynamicContentOpen: S, ribbonObserver: c, updateRibbonOffset: b, startEditor: h, AutoSaveController: Ce, AuthErrorModal: Re, Toaster: Fe, FilterSelectionDrawer: Le, HeaderWrapper: Me, LoadingWrapper: Ie, SaveAsTemplateDrawer: Ue, UnsubscribeWrapper: Oe, ValidationErrorDrawer: Ae };
172
+ saveSilent: k,
173
+ setLoading: R
174
+ }), { __sfc: !0, PreviewContainer: j, OnboardingWrapper: J, AssignStrategyDrawer: Q, RemoveStrategyModal: X, LegacyStrategyUpdatedModal: Y, headerWrapperRef: w, wrapperRef: f, dynamicContentStore: y, unsubscribeStore: D, props: s, configStore: o, editorStore: c, previewStore: Z, hasChanges: l, isTestPartner: ee, isSaveValidationEnabled: te, loadRollout: C, saveSilent: k, setLoading: R, emit: r, buildMetadata: g, initPlugin: F, preloadRuntime: L, runExclusive: M, beginMount: T, isCurrentMount: S, mountGeneration: u, getDefaultTemplate: I, cloneTimersOnSave: U, hasTimerBlocks: A, noHeader: oe, isRrsEnabled: ne, hasAssignedStrategy: re, insertDynamicContent: B, closeDynamicContent: N, handleDynamicContentOpen: v, ribbonObserver: i, updateRibbonOffset: b, startEditor: h, AutoSaveController: Ee, AuthErrorModal: we, Toaster: De, FilterSelectionDrawer: Ce, HeaderWrapper: ke, LoadingWrapper: Re, SaveAsTemplateDrawer: Fe, UnsubscribeWrapper: Le, ValidationErrorDrawer: Me };
186
175
  }
187
176
  });
188
177
  export {
189
- To as default
178
+ yt as default
190
179
  };
@@ -1,25 +1,15 @@
1
- import { defineComponent as c } from "vue";
2
- import { useAutoSave as m } from "../../composables/useAutoSave.js";
3
- import { useSave as f } from "../../composables/useSave.js";
4
- import { useSaveValidationRollout as v } from "../../composables/useSaveValidationRollout.js";
5
- import { useToaster as p } from "../../composables/useToaster.js";
6
- import { useConfigStore as S } from "../../stores/config.js";
7
- const A = /* @__PURE__ */ c({
1
+ import { defineComponent as n } from "vue";
2
+ import { useAutoSave as u } from "../../composables/useAutoSave.js";
3
+ import { useSave as i } from "../../composables/useSave.js";
4
+ import { useSaveValidationRollout as l } from "../../composables/useSaveValidationRollout.js";
5
+ import { useConfigStore as m } from "../../stores/config.js";
6
+ const d = /* @__PURE__ */ n({
8
7
  __name: "AutoSaveController",
9
- setup(d, { expose: u }) {
10
- const { save: e, saveRawOnly: t } = f(), { isEnabled: r } = v(), { handleError: a } = p(), s = S(), o = () => r.value && s.allowSaveWithErrors, n = () => o() ? t() : e(!1, !0);
11
- m(n, { clearsChanges: () => !o() });
12
- const i = async () => {
13
- try {
14
- return await e(!0);
15
- } catch (l) {
16
- a(l, "Failed to save template");
17
- return;
18
- }
19
- };
20
- return u({ saveSilent: i }), { __sfc: !0, save: e, saveRawOnly: t, isEnabled: r, handleError: a, configStore: s, isRawAutosave: o, backgroundSave: n, saveSilent: i };
8
+ setup(f) {
9
+ const { save: e, saveRawOnly: t } = i(), { isEnabled: r } = l(), a = m(), o = () => r.value && a.allowSaveWithErrors, s = () => o() ? t() : e(!1, !0);
10
+ return u(s, { clearsChanges: () => !o() }), { __sfc: !0, save: e, saveRawOnly: t, isEnabled: r, configStore: a, isRawAutosave: o, backgroundSave: s };
21
11
  }
22
12
  });
23
13
  export {
24
- A as default
14
+ d as default
25
15
  };
@@ -0,0 +1,22 @@
1
+ import o from "./AutoSaveToggle.vue2.js";
2
+ /* empty css */
3
+ import i from "../../../_virtual/_plugin-vue2_normalizer.js";
4
+ var n = function() {
5
+ var e = this, a = e._self._c, t = e._self._setupProxy;
6
+ return t.isFeatureEnabled("autosave") ? a("div", { staticClass: "d-f a-i-c mr-3 auto-save-toggle", on: { mouseenter: function(s) {
7
+ t.isHovered = !0;
8
+ }, mouseleave: function(s) {
9
+ t.isHovered = !1;
10
+ } } }, [a(t.InToggle, { attrs: { id: "guido__autosave-toggle", name: "guido-autosave-toggle", checked: t.autosaveStore.isOn, disable: t.editorStore.loadingStatus }, on: { click: t.toggle } }), a("span", { staticClass: "ml-2 auto-save-toggle__label t-c-55" }, [e._v(" " + e._s(t.trans("email-editor.auto-save")) + " ")]), t.autosaveStore.status === t.AUTOSAVE_STATUS.SAVING ? a("span", { staticClass: "ml-2 d-f a-i-c f-s-1" }, [a(t.InLoading, { attrs: { "color-class": "i-c-53", size: "16" } }), a("span", { staticClass: "ml-1 t-c-53" }, [e._v(" " + e._s(t.trans("newsletter.saving")) + " ")])], 1) : t.lastSavedLabel ? a("span", { staticClass: "ml-2 f-s-1 t-c-53" }, [e._v(" " + e._s(t.lastSavedLabel) + " ")]) : e._e(), t.isHovered ? a(t.InInfoBox, { staticClass: "auto-save-toggle__info-box", attrs: { id: "guido__autosave-info-box", size: "small", variant: "information", "description-text": t.trans("email-editor.auto-save-description"), "title-text": t.trans("email-editor.auto-save-title") } }) : e._e()], 1) : e._e();
11
+ }, l = [], r = /* @__PURE__ */ i(
12
+ o,
13
+ n,
14
+ l,
15
+ !1,
16
+ null,
17
+ "2c964af4"
18
+ );
19
+ const d = r.exports;
20
+ export {
21
+ d as default
22
+ };
@@ -0,0 +1,19 @@
1
+ import { defineComponent as i, ref as f, computed as u } from "vue";
2
+ import { useConfig as l } from "../../../composables/useConfig.js";
3
+ import { useTranslations as p } from "../../../composables/useTranslations.js";
4
+ import { useAutosaveStore as c, AUTOSAVE_STATUS as t } from "../../../stores/autosave.js";
5
+ import { useEditorStore as S } from "../../../stores/editor.js";
6
+ import { formatLocalTime as d } from "../../../utils/timeUtil.js";
7
+ import { InToggle as g, InLoading as _, InInfoBox as A } from "@useinsider/design-system-vue";
8
+ const U = /* @__PURE__ */ i({
9
+ __name: "AutoSaveToggle",
10
+ setup(v) {
11
+ const { isFeatureEnabled: e } = l(), r = S(), o = c(), s = p(), n = f(!1), a = u(() => o.status !== t.SAVED || !o.lastSavedAt ? "" : d(o.lastSavedAt));
12
+ return { __sfc: !0, isFeatureEnabled: e, editorStore: r, autosaveStore: o, trans: s, isHovered: n, lastSavedLabel: a, toggle: (m) => {
13
+ o.isOn = m;
14
+ }, AUTOSAVE_STATUS: t, InInfoBox: A, InLoading: _, InToggle: g };
15
+ }
16
+ });
17
+ export {
18
+ U as default
19
+ };
@@ -1,23 +1,23 @@
1
- import a from "./EditorActions.vue2.js";
1
+ import l from "./EditorActions.vue2.js";
2
2
  /* empty css */
3
- import r from "../../../_virtual/_plugin-vue2_normalizer.js";
4
- var d = function() {
5
- var o, s;
6
- var i = this, e = i._self._c, t = i._self._setupProxy;
7
- return e("div", { staticClass: "d-f a-i-c editor-actions" }, [!t.editorStore.isPreviewModeOpen && t.hasContentOnTheLeft ? e("div", { staticClass: "editor-actions__divider" }) : i._e(), (s = (o = t.config) == null ? void 0 : o.features) != null && s.testMessage ? e(t.InButtonV2, { attrs: { id: "guido__test-button", "left-icon": "line-architect-test-journey", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isTestButtonDisabled, "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__test-button", { staticPosition: "bottom right" }), "tooltip-text": t.trans("newsletter.test-email") }, on: { click: t.handleTestEmail } }) : i._e(), e(t.EditorActionsMenu), t.editorStore.isPreviewModeOpen ? i._e() : e("div", { staticClass: "editor-actions__divider" }), t.editorStore.isPreviewModeOpen ? i._e() : e(t.InButtonV2, { staticClass: "ml-3", attrs: { id: "guido__save-button", "disabled-status": !t.isSaving && t.editorStore.isSaveButtonDisabled, "label-text": t.saveLabel, "loading-status": t.isSaving }, on: { click: function(n) {
3
+ import d from "../../../_virtual/_plugin-vue2_normalizer.js";
4
+ var u = function() {
5
+ var s, i, n, a;
6
+ var o = this, e = o._self._c, t = o._self._setupProxy;
7
+ return e("div", { staticClass: "d-f editor-actions" }, [t.isVersionHistoryButtonVisible ? e(t.InButtonV2, { attrs: { id: "guido__history-button", "left-icon": "line-architect-version-history", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isVersionHistoryButtonDisabled, "label-text-status": !1, "selected-status": t.editorStore.isVersionHistoryOpen, "tooltip-options": t.getTooltipOptions("guido__history-button"), "tooltip-text": t.versionHistoryTooltipText }, on: { click: t.handleVersionHistory } }) : o._e(), e(t.InButtonV2, { attrs: { id: "guido__export-button", "left-icon": "line-export", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isExportButtonDisabled, "label-text-status": !1, "loading-status": t.isExporting, "tooltip-options": t.getTooltipOptions("guido__export-button"), "tooltip-text": t.trans("newsletter.export") }, on: { click: t.handleExport } }), (i = (s = t.config) == null ? void 0 : s.features) != null && i.saveAsTemplate ? e(t.InButtonV2, { attrs: { id: "guido__save-as-button", "left-icon": "line-newsletter-save-as-template", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isSaveAsButtonDisabled, "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__save-as-button"), "tooltip-text": t.trans("newsletter.save-templates") }, on: { click: t.handleSaveAs } }) : o._e(), (a = (n = t.config) == null ? void 0 : n.features) != null && a.testMessage ? e(t.InButtonV2, { attrs: { id: "guido__test-button", "left-icon": "line-architect-test-journey", styling: "ghost", type: "secondary", "disabled-status": t.editorStore.isTestButtonDisabled, "label-text-status": !1, "tooltip-options": t.getTooltipOptions("guido__test-button", { staticPosition: "bottom right" }), "tooltip-text": t.trans("newsletter.test-email") }, on: { click: t.handleTestEmail } }) : o._e(), t.editorStore.isPreviewModeOpen ? o._e() : e(t.InButtonV2, { staticClass: "ml-3", attrs: { id: "guido__save-button", "disabled-status": !t.isSaving && t.editorStore.isSaveButtonDisabled, "label-text": t.saveLabel, "loading-status": t.isSaving }, on: { click: function(r) {
8
8
  return t.handleSave(!1);
9
- } } }), e(t.MigrationConfirmModal, { ref: "migrationModalRef", on: { confirm: function(n) {
9
+ } } }), e(t.MigrationConfirmModal, { ref: "migrationModalRef", on: { confirm: function(r) {
10
10
  return t.executeSave(!1);
11
11
  } } })], 1);
12
- }, l = [], c = /* @__PURE__ */ r(
13
- a,
14
- d,
12
+ }, p = [], c = /* @__PURE__ */ d(
15
13
  l,
14
+ u,
15
+ p,
16
16
  !1,
17
17
  null,
18
- "9a028d08"
18
+ "baf7a5dd"
19
19
  );
20
- const p = c.exports;
20
+ const v = c.exports;
21
21
  export {
22
- p as default
22
+ v as default
23
23
  };