@useinsider/guido 3.20.1-beta.24b6c72 → 3.20.1-beta.49b58ed

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 (60) hide show
  1. package/README.md +1 -0
  2. package/dist/@types/config/schemas.js +11 -10
  3. package/dist/components/Guido.vue.js +2 -2
  4. package/dist/components/Guido.vue2.js +114 -101
  5. package/dist/components/organisms/AutoSaveController.vue2.js +19 -9
  6. package/dist/components/organisms/header/AutoSaveStatus.vue.js +17 -0
  7. package/dist/components/organisms/header/AutoSaveStatus.vue2.js +25 -0
  8. package/dist/components/organisms/header/EditorActions.vue.js +13 -13
  9. package/dist/components/organisms/header/EditorActions.vue2.js +57 -72
  10. package/dist/components/organisms/header/EditorActionsMenu.vue.js +20 -0
  11. package/dist/components/organisms/header/EditorActionsMenu.vue2.js +98 -0
  12. package/dist/components/organisms/header/HeaderWrapper.vue.js +6 -6
  13. package/dist/components/organisms/header/HeaderWrapper.vue2.js +9 -17
  14. package/dist/components/organisms/header/LeftSlot.vue.js +1 -1
  15. package/dist/components/organisms/header/LeftSlot.vue2.js +28 -23
  16. package/dist/components/organisms/header/MiddleSlot.vue.js +4 -4
  17. package/dist/components/organisms/header/MiddleSlot.vue2.js +8 -7
  18. package/dist/components/organisms/header/RightSlot.vue.js +9 -8
  19. package/dist/components/organisms/header/RightSlot.vue2.js +13 -18
  20. package/dist/components/organisms/header/accessibility/AccessibilityToolbar.vue.js +18 -0
  21. package/dist/components/organisms/header/accessibility/AccessibilityToolbar.vue2.js +37 -0
  22. package/dist/components/organisms/header/accessibility/ColorVisionSelect.vue.js +22 -0
  23. package/dist/components/organisms/header/accessibility/ColorVisionSelect.vue2.js +48 -0
  24. package/dist/components/organisms/onboarding/EditorTabBarOnboarding.vue.js +19 -0
  25. package/dist/components/organisms/onboarding/EditorTabBarOnboarding.vue2.js +90 -0
  26. package/dist/components/organisms/onboarding/OnboardingWrapper.vue.js +12 -12
  27. package/dist/components/organisms/onboarding/OnboardingWrapper.vue2.js +60 -35
  28. package/dist/composables/useAccessibilityApi.js +45 -0
  29. package/dist/composables/useCustomInterfaceAppearance.js +42 -41
  30. package/dist/config/i18n/en/labels.json.js +36 -4
  31. package/dist/config/i18n/en/tooltips.json.js +2 -1
  32. package/dist/guido.css +1 -1
  33. package/dist/sprite.svg +10 -0
  34. package/dist/src/@types/config/schemas.d.ts +2 -0
  35. package/dist/src/components/organisms/AutoSaveController.vue.d.ts +19 -1
  36. package/dist/src/components/organisms/header/EditorActionsMenu.vue.d.ts +2 -0
  37. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -19
  38. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -19
  39. package/dist/src/components/organisms/header/accessibility/AccessibilityToolbar.vue.d.ts +2 -0
  40. package/dist/src/components/organisms/header/accessibility/ColorVisionSelect.vue.d.ts +2 -0
  41. package/dist/src/components/organisms/onboarding/EditorTabBarOnboarding.vue.d.ts +2 -0
  42. package/dist/src/composables/useAccessibilityApi.d.ts +13 -0
  43. package/dist/src/composables/useActionsApi.d.ts +2 -2
  44. package/dist/src/composables/useConfig.d.ts +2 -0
  45. package/dist/src/stores/autosave.d.ts +73 -1
  46. package/dist/src/stores/config.d.ts +20 -0
  47. package/dist/src/stores/editor.d.ts +109 -0
  48. package/dist/src/stores/onboarding.d.ts +953 -21
  49. package/dist/src/stores/version-history.d.ts +1 -1
  50. package/dist/src/utils/timeUtil.d.ts +5 -0
  51. package/dist/static/styles/components/accessibility.css.js +234 -0
  52. package/dist/static/styles/variables.css.js +2 -0
  53. package/dist/stores/autosave.js +12 -7
  54. package/dist/stores/editor.js +7 -4
  55. package/dist/stores/onboarding.js +48 -21
  56. package/dist/utils/timeUtil.js +6 -17
  57. package/package.json +2 -2
  58. package/dist/components/organisms/header/AutoSaveToggle.vue.js +0 -22
  59. package/dist/components/organisms/header/AutoSaveToggle.vue2.js +0 -19
  60. /package/dist/src/components/organisms/header/{AutoSaveToggle.vue.d.ts → AutoSaveStatus.vue.d.ts} +0 -0
package/README.md CHANGED
@@ -166,6 +166,7 @@ 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.
169
170
  },
170
171
 
171
172
  // Optional: Callbacks
@@ -1,5 +1,5 @@
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";
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";
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
- }), S = T(() => C({
79
+ }), f = I(() => 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(S)),
84
+ children: e(c(f)),
85
85
  // eslint-disable-next-line camelcase -- backend field name
86
- select_items: e(c(S))
86
+ select_items: e(c(f))
87
87
  })), N = g(
88
88
  t(),
89
- R(c(S), [])
89
+ R(c(f), [])
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(), f.SAVED_MODULES),
213
+ savedModulesFolderName: e(t(), S.SAVED_MODULES),
214
214
  /** Folder name for default/prebuilt modules (used by Stripo plugin panel for path construction) */
215
- defaultModulesFolderName: e(t(), f.DEFAULT_MODULES)
215
+ defaultModulesFolderName: e(t(), S.DEFAULT_MODULES)
216
216
  }), F = a({
217
217
  /** Whether to show the header bar */
218
218
  showHeader: e(o(), !0),
@@ -237,6 +237,7 @@ 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),
240
241
  /** Enable pre-save domain-allowlist validation (opt-in; Guido self-serves the block toaster) */
241
242
  allowlistEnabled: e(o(), !1),
242
243
  /** Enable persistent link tracking-id assignment for the click heatmap (opt-in) */
@@ -315,7 +316,7 @@ const p = {
315
316
  (n) => typeof n == "function",
316
317
  "processor must be a function"
317
318
  )
318
- }), V = I("type", [
319
+ }), V = T("type", [
319
320
  H,
320
321
  _,
321
322
  q,
@@ -367,7 +368,7 @@ export {
367
368
  G as CustomRuleSchema,
368
369
  w as DefaultBlockTypeSchema,
369
370
  N as DynamicContentListSchema,
370
- S as DynamicContentNodeSchema,
371
+ f as DynamicContentNodeSchema,
371
372
  M as DynamicContentSchema,
372
373
  O as EditorSchema,
373
374
  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, { 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(_) {
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(_) {
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
- "1b5c844a"
15
+ "40eca1bd"
16
16
  );
17
17
  const v = n.exports;
18
18
  export {
@@ -1,178 +1,191 @@
1
- import { defineComponent as se, defineAsyncComponent as m, ref as W, computed as p, watch as G, onMounted as ie, onUnmounted as ce } from "vue";
2
- import { useCortexBlueprintBridge as de } from "../composables/useCortexBlueprintBridge.js";
3
- import { useEditorLock as me } from "../composables/useEditorLock.js";
4
- import { provideGuidoActions as le } from "../composables/useGuidoActions.js";
5
- import { useGuidoStateBridge as ue } from "../composables/useGuidoStateBridge.js";
6
- import { usePartner as pe } from "../composables/usePartner.js";
7
- import { useSaveValidationRollout as fe } from "../composables/useSaveValidationRollout.js";
8
- import { useStripo as ye } from "../composables/useStripo.js";
9
- import { useTimerClone as ge } 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 Se } from "../enums/onboarding.js";
1
+ import { defineComponent as ce, defineAsyncComponent as m, ref as H, computed as p, watch as G, onMounted as de, onUnmounted as me } from "vue";
2
+ import { useCortexBlueprintBridge as le } from "../composables/useCortexBlueprintBridge.js";
3
+ import { useEditorLock as ue } from "../composables/useEditorLock.js";
4
+ import { provideGuidoActions as pe } from "../composables/useGuidoActions.js";
5
+ import { useGuidoStateBridge as fe } from "../composables/useGuidoStateBridge.js";
6
+ import { usePartner as ye } from "../composables/usePartner.js";
7
+ import { useSaveValidationRollout as ge } from "../composables/useSaveValidationRollout.js";
8
+ import { useStripo as ve } from "../composables/useStripo.js";
9
+ import { useTimerClone as Se } from "../composables/useTimerClone.js";
10
+ import { useToaster as be } from "../composables/useToaster.js";
11
+ import { useTranslations as he } 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 Ee } from "../enums/onboarding.js";
15
+ import { ToasterTypeOptions as we } from "../enums/toaster.js";
13
16
  import { useRecommendationExtensionStore as E } from "../extensions/Blocks/Recommendation/store/recommendation.js";
14
- import ve from "./organisms/AutoSaveController.vue.js";
15
- import be from "./organisms/base/AuthErrorModal.vue.js";
16
- import he from "./organisms/base/Toaster.vue.js";
17
- import Ee from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
18
- import we from "./organisms/header/HeaderWrapper.vue.js";
19
- import De from "./organisms/LoadingWrapper.vue.js";
20
- import Ce from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
21
- import ke from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
22
- import Fe from "./organisms/validation/ValidationErrorDrawer.vue.js";
23
- import { useStripoApi as Re } from "../services/stripoApi.js";
24
- import { useConfigStore as Me } from "../stores/config.js";
25
- import { useDynamicContentStore as Te } from "../stores/dynamic-content.js";
17
+ import Te from "./organisms/AutoSaveController.vue.js";
18
+ import ke from "./organisms/base/AuthErrorModal.vue.js";
19
+ import Ce from "./organisms/base/Toaster.vue.js";
20
+ import De from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
21
+ import Fe from "./organisms/header/HeaderWrapper.vue.js";
22
+ import Me from "./organisms/LoadingWrapper.vue.js";
23
+ import Re from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
24
+ import Ie from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
25
+ import Le from "./organisms/validation/ValidationErrorDrawer.vue.js";
26
+ import { useStripoApi as Oe } from "../services/stripoApi.js";
27
+ import { useConfigStore as Ae } from "../stores/config.js";
28
+ import { useDynamicContentStore as Ue } from "../stores/dynamic-content.js";
26
29
  import { useEditorStore as w } from "../stores/editor.js";
27
- import { usePreviewStore as Ie } from "../stores/preview.js";
28
- import { useSaveValidationStore as Le } from "../stores/save-validation.js";
29
- import { useTemplateStore as Ue } from "../stores/template.js";
30
- import { useUnsubscribeStore as Ae } from "../stores/unsubscribe.js";
31
- import { readTrackFloor as z } from "../utils/linkTrackingIds.js";
32
- const lt = /* @__PURE__ */ se({
30
+ import { usePreviewStore as Ne } from "../stores/preview.js";
31
+ import { useSaveValidationStore as Be } from "../stores/save-validation.js";
32
+ import { useTemplateStore as Pe } from "../stores/template.js";
33
+ import { useUnsubscribeStore as _e } from "../stores/unsubscribe.js";
34
+ import { readTrackFloor as q } from "../utils/linkTrackingIds.js";
35
+ const ho = /* @__PURE__ */ ce({
33
36
  __name: "Guido",
34
37
  props: {
35
38
  config: null,
36
39
  ready: { type: Boolean, default: !0 }
37
40
  },
38
41
  emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready", "onboarding:finished", "test-email:click"],
39
- setup(H, { expose: q, emit: r }) {
40
- const s = H, K = m(
42
+ setup(K, { expose: j, emit: r }) {
43
+ const a = K, J = m(
41
44
  () => import("./organisms/email-preview/PreviewContainer.vue.js")
42
- ), j = m(
45
+ ), Q = m(
43
46
  () => import("./organisms/onboarding/OnboardingWrapper.vue.js")
44
- ), J = m(
47
+ ), X = m(
45
48
  () => import("./organisms/extensions/recommendation/AssignStrategyDrawer.vue.js")
46
- ), Q = m(
49
+ ), Y = m(
47
50
  () => import("./organisms/extensions/recommendation/RemoveStrategyModal.vue.js")
48
- ), X = m(
51
+ ), T = H(), Z = m(
49
52
  () => import("./organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js")
50
- ), D = W(), f = W(), y = Te(), C = Ae(), o = Me();
51
- s.ready && o.init(s.config);
52
- const c = w(), Y = Ie(), l = p(() => c.hasChanges), { isTestPartner: Z } = pe(), { isEnabled: ee } = fe(), k = () => {
53
- var t;
54
- return (t = D.value) == null ? void 0 : t.handleSave(!0);
55
- }, F = (t) => {
56
- c.loadingStatus = t;
53
+ ), f = H(), y = Ue(), k = _e(), t = Ae();
54
+ a.ready && t.init(a.config);
55
+ const s = w(), ee = Ne(), l = p(() => s.hasChanges), { isTestPartner: oe } = ye(), { isEnabled: te } = ge(), { showToaster: C } = be(), D = he(), F = () => {
56
+ var o;
57
+ if (!s.isNormalMode) {
58
+ console.debug("guido:save:silent:blocked", {
59
+ isVersionHistoryOpen: s.isVersionHistoryOpen,
60
+ isAccessibilityTestingOpen: s.isAccessibilityTestingOpen
61
+ }), C({
62
+ type: we.Warning,
63
+ message: D("email-editor.save-blocked-outside-editor")
64
+ });
65
+ return;
66
+ }
67
+ return (o = T.value) == null ? void 0 : o.saveSilent();
68
+ }, M = (o) => {
69
+ s.loadingStatus = o;
57
70
  };
58
- de(), ue();
71
+ le(), fe();
59
72
  const g = () => {
60
- var t, e;
73
+ var o, e;
61
74
  return {
62
- emailId: o.templateId,
63
- userId: o.userId,
64
- username: o.username,
65
- partnerName: o.partnerName,
66
- savedModulesFolderName: ((t = o.editor) == null ? void 0 : t.savedModulesFolderName) || $.SAVED_MODULES,
67
- defaultModulesFolderName: ((e = o.editor) == null ? void 0 : e.defaultModulesFolderName) || $.DEFAULT_MODULES
75
+ emailId: t.templateId,
76
+ userId: t.userId,
77
+ username: t.username,
78
+ partnerName: t.partnerName,
79
+ savedModulesFolderName: ((o = t.editor) == null ? void 0 : o.savedModulesFolderName) || z.SAVED_MODULES,
80
+ defaultModulesFolderName: ((e = t.editor) == null ? void 0 : e.defaultModulesFolderName) || z.DEFAULT_MODULES
68
81
  };
69
- }, { initPlugin: R, preloadRuntime: M } = ye(), { runExclusive: T, beginMount: I, isCurrentMount: S } = me();
82
+ }, { initPlugin: R, preloadRuntime: I } = ve(), { runExclusive: L, beginMount: O, isCurrentMount: v } = ue();
70
83
  let u = 0;
71
- const { getDefaultTemplate: L } = Re(), { cloneTimersOnSave: U, hasTimerBlocks: A } = ge(), te = p(() => {
72
- var t;
73
- return !((t = o.ui) != null && t.showHeader);
74
- }), oe = p(() => o.isFeatureEnabled("reusableRecommendationStrategy")), ne = p(
84
+ const { getDefaultTemplate: A } = Oe(), { cloneTimersOnSave: U, hasTimerBlocks: N } = Se(), ne = p(() => {
85
+ var o;
86
+ return !((o = t.ui) != null && o.showHeader);
87
+ }), re = p(() => t.isFeatureEnabled("reusableRecommendationStrategy")), se = p(
75
88
  () => !!E().recommendationConfigs.strategyId
76
89
  );
77
- le({
90
+ pe({
78
91
  onBack: () => {
79
92
  console.debug("guido:back"), r("back");
80
93
  },
81
94
  onSaveStart: () => {
82
95
  console.debug("guido:save:start"), r("save:start");
83
96
  },
84
- onSaveComplete: (t) => {
85
- const e = { ...t, metadata: g() };
97
+ onSaveComplete: (o) => {
98
+ const e = { ...o, metadata: g() };
86
99
  console.debug("guido:save:complete", e), r("save:complete", e);
87
100
  },
88
101
  onTestEmailClick: () => {
89
102
  console.debug("guido:test-email:click"), r("test-email:click");
90
103
  }
91
104
  });
92
- const B = (t) => {
93
- console.debug("dynamic-content:close", t), y.setSelectedDynamicContent(t), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: t }));
94
- }, N = () => {
105
+ const B = (o) => {
106
+ console.debug("dynamic-content:close", o), y.setSelectedDynamicContent(o), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: o }));
107
+ }, P = () => {
95
108
  console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
96
109
  };
97
110
  G(() => l.value, () => {
98
111
  r("on-change", l.value);
99
112
  });
100
- const v = (t) => {
101
- const e = t, { attribute: a, position: d } = e.detail;
102
- console.debug("dynamic-content:open", e.detail), r("dynamic-content:open", a, d);
113
+ const S = (o) => {
114
+ const e = o, { attribute: i, position: d } = e.detail;
115
+ console.debug("dynamic-content:open", e.detail), r("dynamic-content:open", i, d);
103
116
  };
104
- let i = null;
117
+ let c = null;
105
118
  const b = () => {
106
119
  var e;
107
- const t = document.querySelector(Se);
108
- (e = f.value) == null || e.style.setProperty("--ribbon-offset", `${(t == null ? void 0 : t.offsetHeight) ?? 0}px`);
120
+ const o = document.querySelector(Ee);
121
+ (e = f.value) == null || e.style.setProperty("--ribbon-offset", `${(o == null ? void 0 : o.offsetHeight) ?? 0}px`);
109
122
  }, h = async () => {
110
- var t;
123
+ var o;
111
124
  try {
112
- o.initialized || o.init(s.config), c.templateId = o.templateId;
113
- 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) || [];
114
- C.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
115
- const _ = ((t = e == null ? void 0 : e.migration) == null ? void 0 : t.recommendationConfigs) ?? {}, O = o.isFeatureEnabled("linkTrackingIds"), x = {
116
- partnerName: o.partnerName,
125
+ t.initialized || t.init(a.config), s.templateId = t.templateId;
126
+ const e = t.template, i = (e == null ? void 0 : e.html) || "", d = (e == null ? void 0 : e.css) || "", _ = (e == null ? void 0 : e.preselectedDynamicContent) || [];
127
+ k.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
128
+ const x = ((o = e == null ? void 0 : e.migration) == null ? void 0 : o.recommendationConfigs) ?? {}, V = t.isFeatureEnabled("linkTrackingIds"), W = {
129
+ partnerName: t.partnerName,
117
130
  campaignUrls: e == null ? void 0 : e.recommendationCampaignUrls,
118
- rrsEnabled: o.isFeatureEnabled("reusableRecommendationStrategy")
131
+ rrsEnabled: t.isFeatureEnabled("reusableRecommendationStrategy")
119
132
  };
120
133
  let n = {
121
- html: a && await V(a, _, x),
134
+ html: i && await $(i, x, W),
122
135
  css: d
123
136
  };
124
- n.html || (n = await L(), n.html = await V(n.html, _, x));
125
- const re = O ? z(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
126
- A(n.html) && (n.html = await U(n.html)), O && (c.trackIdSessionFloor = Math.max(re, z(n.html)));
137
+ n.html || (n = await A(), n.html = await $(n.html, x, W));
138
+ const ie = V ? q(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
139
+ N(n.html) && (n.html = await U(n.html)), V && (s.trackIdSessionFloor = Math.max(ie, q(n.html)));
127
140
  const ae = {
128
- preselectedDynamicContentList: P,
141
+ preselectedDynamicContentList: _,
129
142
  onReady: () => {
130
143
  console.debug("guido:ready"), r("ready");
131
144
  }
132
145
  };
133
- u = I(), await R(n, g(), ae), y.selectedDynamicContentList = P;
146
+ u = O(), await R(n, g(), ae), y.selectedDynamicContentList = _;
134
147
  } catch (e) {
135
148
  console.error("Failed to initialize Stripo editor:", e);
136
149
  }
137
150
  };
138
- return ie(async () => {
151
+ return de(async () => {
139
152
  var e;
140
- console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), E().$reset(), w().$reset(), Ue().$reset(), Le().$reset(), b();
141
- const t = (e = f.value) == null ? void 0 : e.parentElement;
142
- if (t && (i = new ResizeObserver(b), i.observe(t)), M(), s.ready)
153
+ console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), E().$reset(), w().$reset(), Pe().$reset(), Be().$reset(), b();
154
+ const o = (e = f.value) == null ? void 0 : e.parentElement;
155
+ if (o && (c = new ResizeObserver(b), c.observe(o)), I(), a.ready)
143
156
  await h();
144
157
  else {
145
- const a = G(() => s.ready, (d) => {
146
- d && (a(), h());
158
+ const i = G(() => a.ready, (d) => {
159
+ d && (i(), h());
147
160
  });
148
161
  }
149
- document.addEventListener("dynamic-content:open", v);
150
- }), ce(() => {
151
- if (i == null || i.disconnect(), document.removeEventListener("dynamic-content:open", v), E().disposeStrategyPageReturn(), S(u))
162
+ document.addEventListener("dynamic-content:open", S);
163
+ }), me(() => {
164
+ if (c == null || c.disconnect(), document.removeEventListener("dynamic-content:open", S), E().disposeStrategyPageReturn(), v(u))
152
165
  try {
153
166
  w().isStripoInitialized = !1;
154
- } catch (t) {
155
- console.debug("Failed to close the editor readiness gate on unmount", t);
167
+ } catch (o) {
168
+ console.debug("Failed to close the editor readiness gate on unmount", o);
156
169
  }
157
- T(async () => {
158
- if (S(u))
170
+ L(async () => {
171
+ if (v(u))
159
172
  try {
160
173
  window.UIEditor.removeEditor();
161
174
  } catch {
162
175
  console.debug("Failed to remove Stripo editor: No editor found");
163
176
  }
164
- }), o.reset();
165
- }), q({
177
+ }), t.reset();
178
+ }), j({
166
179
  dynamicContent: {
167
180
  insert: B,
168
- close: N
181
+ close: P
169
182
  },
170
183
  hasChanges: l,
171
- saveSilent: k,
172
- setLoading: F
173
- }), { __sfc: !0, PreviewContainer: K, OnboardingWrapper: j, AssignStrategyDrawer: J, RemoveStrategyModal: Q, LegacyStrategyUpdatedModal: X, headerWrapperRef: D, wrapperRef: f, dynamicContentStore: y, unsubscribeStore: C, props: s, configStore: o, editorStore: c, previewStore: Y, hasChanges: l, isTestPartner: Z, isSaveValidationEnabled: ee, saveSilent: k, setLoading: F, emit: r, buildMetadata: g, initPlugin: R, preloadRuntime: M, runExclusive: T, beginMount: I, isCurrentMount: S, mountGeneration: u, getDefaultTemplate: L, cloneTimersOnSave: U, hasTimerBlocks: A, noHeader: te, isRrsEnabled: oe, hasAssignedStrategy: ne, insertDynamicContent: B, closeDynamicContent: N, handleDynamicContentOpen: v, ribbonObserver: i, updateRibbonOffset: b, startEditor: h, AutoSaveController: ve, AuthErrorModal: be, Toaster: he, FilterSelectionDrawer: Ee, HeaderWrapper: we, LoadingWrapper: De, SaveAsTemplateDrawer: Ce, UnsubscribeWrapper: ke, ValidationErrorDrawer: Fe };
184
+ saveSilent: F,
185
+ setLoading: M
186
+ }), { __sfc: !0, PreviewContainer: J, OnboardingWrapper: Q, AssignStrategyDrawer: X, RemoveStrategyModal: Y, autoSaveControllerRef: T, LegacyStrategyUpdatedModal: Z, wrapperRef: f, dynamicContentStore: y, unsubscribeStore: k, props: a, configStore: t, editorStore: s, previewStore: ee, hasChanges: l, isTestPartner: oe, isSaveValidationEnabled: te, showToaster: C, trans: D, saveSilent: F, setLoading: M, emit: r, buildMetadata: g, initPlugin: R, preloadRuntime: I, runExclusive: L, beginMount: O, isCurrentMount: v, mountGeneration: u, getDefaultTemplate: A, cloneTimersOnSave: U, hasTimerBlocks: N, noHeader: ne, isRrsEnabled: re, hasAssignedStrategy: se, insertDynamicContent: B, closeDynamicContent: P, handleDynamicContentOpen: S, ribbonObserver: c, updateRibbonOffset: b, startEditor: h, AutoSaveController: Te, AuthErrorModal: ke, Toaster: Ce, FilterSelectionDrawer: De, HeaderWrapper: Fe, LoadingWrapper: Me, SaveAsTemplateDrawer: Re, UnsubscribeWrapper: Ie, ValidationErrorDrawer: Le };
174
187
  }
175
188
  });
176
189
  export {
177
- lt as default
190
+ ho as default
178
191
  };
@@ -1,14 +1,24 @@
1
- import { defineComponent as r } from "vue";
2
- import { useAutoSave as s } from "../../composables/useAutoSave.js";
3
- import { useSave as n } from "../../composables/useSave.js";
4
- import { useSaveValidationRollout as u } from "../../composables/useSaveValidationRollout.js";
5
- const v = /* @__PURE__ */ r({
1
+ import { defineComponent as i } from "vue";
2
+ import { useAutoSave as l } from "../../composables/useAutoSave.js";
3
+ import { useSave as m } from "../../composables/useSave.js";
4
+ import { useSaveValidationRollout as c } from "../../composables/useSaveValidationRollout.js";
5
+ import { useToaster as p } from "../../composables/useToaster.js";
6
+ const b = /* @__PURE__ */ i({
6
7
  __name: "AutoSaveController",
7
- setup(m) {
8
- const { save: e, saveRawOnly: o } = n(), { isEnabled: t } = u(), a = () => t.value ? o() : e(!1, !0);
9
- return s(a), { __sfc: !0, save: e, saveRawOnly: o, isEnabled: t, backgroundSave: a };
8
+ setup(v, { expose: n }) {
9
+ const { save: e, saveRawOnly: t } = m(), { isEnabled: o } = c(), { handleError: r } = p(), a = () => o.value ? t() : e(!1, !0);
10
+ l(a);
11
+ const s = async () => {
12
+ try {
13
+ return await e(!0);
14
+ } catch (u) {
15
+ r(u, "Failed to save template");
16
+ return;
17
+ }
18
+ };
19
+ return n({ saveSilent: s }), { __sfc: !0, save: e, saveRawOnly: t, isEnabled: o, handleError: r, backgroundSave: a, saveSilent: s };
10
20
  }
11
21
  });
12
22
  export {
13
- v as default
23
+ b as default
14
24
  };
@@ -0,0 +1,17 @@
1
+ import t from "./AutoSaveStatus.vue2.js";
2
+ import r from "../../../_virtual/_plugin-vue2_normalizer.js";
3
+ var _ = function() {
4
+ var s = this, e = s._self._c, a = s._self._setupProxy;
5
+ return a.isFeatureEnabled("autosave") ? e("div", { staticClass: "d-f a-i-c auto-save-status" }, [a.autosaveStore.status === a.AUTOSAVE_STATUS.SAVING ? e("span", { staticClass: "d-f a-i-c f-s-1" }, [e(a.InLoading, { attrs: { "color-class": "i-c-53", size: "16" } }), e("span", { staticClass: "ml-1 t-c-53" }, [s._v(s._s(a.trans("newsletter.saving")))])], 1) : a.savedLabel ? e("span", { staticClass: "f-s-1 t-c-53" }, [s._v(s._s(a.savedLabel.before)), a.savedLabel.word ? e("span", { staticClass: "f-w-600" }, [s._v(s._s(a.savedLabel.word))]) : s._e(), s._v(s._s(a.savedLabel.after))]) : s._e()]) : s._e();
6
+ }, n = [], o = /* @__PURE__ */ r(
7
+ t,
8
+ _,
9
+ n,
10
+ !1,
11
+ null,
12
+ null
13
+ );
14
+ const v = o.exports;
15
+ export {
16
+ v as default
17
+ };
@@ -0,0 +1,25 @@
1
+ import { defineComponent as p, computed as S } from "vue";
2
+ import { useConfig as A } from "../../../composables/useConfig.js";
3
+ import { useTranslations as T } from "../../../composables/useTranslations.js";
4
+ import { useAutosaveStore as v, AUTOSAVE_STATUS as m } from "../../../stores/autosave.js";
5
+ import { autoSaveTimestamp as b } from "../../../utils/timeUtil.js";
6
+ import { InLoading as D } from "@useinsider/design-system-vue";
7
+ const j = /* @__PURE__ */ p({
8
+ __name: "AutoSaveStatus",
9
+ setup(O) {
10
+ const { isFeatureEnabled: u } = A(), a = v(), n = T(), t = "__BOLD_START__", o = "__BOLD_END__", s = (i) => i.split(t).join("").split(o).join(""), _ = S(() => {
11
+ if (a.status !== m.SAVED || !a.lastSavedAt)
12
+ return null;
13
+ const { isToday: i, time: c, date: f } = b(a.lastSavedAt), l = { boldStart: t, boldEnd: o }, e = i ? n("email-editor.autosaved-at-today", { ...l, time: c }) : n("email-editor.autosaved-at-date", { ...l, date: f }), r = e.indexOf(t), d = e.indexOf(o, r + t.length);
14
+ return r === -1 || d === -1 ? { before: s(e), word: "", after: "" } : {
15
+ before: s(e.slice(0, r)),
16
+ word: s(e.slice(r + t.length, d)),
17
+ after: s(e.slice(d + o.length))
18
+ };
19
+ });
20
+ return { __sfc: !0, isFeatureEnabled: u, autosaveStore: a, trans: n, BOLD_START: t, BOLD_END: o, stripMarkers: s, savedLabel: _, AUTOSAVE_STATUS: m, InLoading: D };
21
+ }
22
+ });
23
+ export {
24
+ j as default
25
+ };
@@ -1,23 +1,23 @@
1
- import l from "./EditorActions.vue2.js";
1
+ import a from "./EditorActions.vue2.js";
2
2
  /* empty css */
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) {
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) {
8
8
  return t.handleSave(!1);
9
- } } }), e(t.MigrationConfirmModal, { ref: "migrationModalRef", on: { confirm: function(r) {
9
+ } } }), e(t.MigrationConfirmModal, { ref: "migrationModalRef", on: { confirm: function(n) {
10
10
  return t.executeSave(!1);
11
11
  } } })], 1);
12
- }, c = [], p = /* @__PURE__ */ d(
12
+ }, l = [], c = /* @__PURE__ */ r(
13
+ a,
14
+ d,
13
15
  l,
14
- u,
15
- c,
16
16
  !1,
17
17
  null,
18
- "2cccbd44"
18
+ "f36a9d0c"
19
19
  );
20
- const v = p.exports;
20
+ const p = c.exports;
21
21
  export {
22
- v as default
22
+ p as default
23
23
  };