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

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 +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 +117 -106
  5. package/dist/components/organisms/AutoSaveController.vue2.js +20 -10
  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 +58 -73
  10. package/dist/components/organisms/header/EditorActionsMenu.vue.js +20 -0
  11. package/dist/components/organisms/header/EditorActionsMenu.vue2.js +99 -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 +11 -10
  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/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +5 -5
  29. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +9 -9
  30. package/dist/composables/useAccessibilityApi.js +51 -0
  31. package/dist/composables/useCustomInterfaceAppearance.js +42 -41
  32. package/dist/config/i18n/en/labels.json.js +36 -4
  33. package/dist/config/i18n/en/tooltips.json.js +2 -1
  34. package/dist/guido.css +1 -1
  35. package/dist/sprite.svg +10 -0
  36. package/dist/src/@types/config/schemas.d.ts +2 -0
  37. package/dist/src/components/organisms/AutoSaveController.vue.d.ts +19 -1
  38. package/dist/src/components/organisms/header/EditorActionsMenu.vue.d.ts +2 -0
  39. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -19
  40. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -19
  41. package/dist/src/components/organisms/header/accessibility/AccessibilityToolbar.vue.d.ts +2 -0
  42. package/dist/src/components/organisms/header/accessibility/ColorVisionSelect.vue.d.ts +2 -0
  43. package/dist/src/components/organisms/onboarding/EditorTabBarOnboarding.vue.d.ts +2 -0
  44. package/dist/src/composables/useAccessibilityApi.d.ts +13 -0
  45. package/dist/src/composables/useActionsApi.d.ts +2 -2
  46. package/dist/src/composables/useConfig.d.ts +2 -0
  47. package/dist/src/stores/autosave.d.ts +73 -1
  48. package/dist/src/stores/config.d.ts +20 -0
  49. package/dist/src/stores/editor.d.ts +109 -0
  50. package/dist/src/stores/onboarding.d.ts +966 -35
  51. package/dist/src/stores/unsubscribe.d.ts +0 -10
  52. package/dist/src/stores/version-history.d.ts +1 -1
  53. package/dist/src/utils/templatePreparation.d.ts +1 -1
  54. package/dist/src/utils/timeUtil.d.ts +5 -8
  55. package/dist/static/styles/components/accessibility.css.js +234 -0
  56. package/dist/static/styles/variables.css.js +2 -0
  57. package/dist/stores/autosave.js +12 -7
  58. package/dist/stores/editor.js +8 -3
  59. package/dist/stores/onboarding.js +48 -22
  60. package/dist/stores/unsubscribe.js +24 -28
  61. package/dist/utils/timeUtil.js +6 -17
  62. package/package.json +1 -1
  63. package/dist/components/organisms/header/AutoSaveToggle.vue.js +0 -22
  64. package/dist/components/organisms/header/AutoSaveToggle.vue2.js +0 -19
  65. /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
- "c5146fc5"
15
+ "f0ba01bc"
16
16
  );
17
17
  const v = n.exports;
18
18
  export {
@@ -1,179 +1,190 @@
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";
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";
27
30
  import { useEditorStore as E } from "../stores/editor.js";
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({
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({
34
37
  __name: "Guido",
35
38
  props: {
36
39
  config: null,
37
40
  ready: { type: Boolean, default: !0 }
38
41
  },
39
42
  emits: ["dynamic-content:open", "back", "save:start", "save:complete", "on-change", "ready", "onboarding:finished", "test-email:click"],
40
- setup(q, { expose: K, emit: r }) {
41
- const s = q, j = m(
43
+ setup(j, { expose: J, emit: r }) {
44
+ const i = j, Q = m(
42
45
  () => import("./organisms/email-preview/PreviewContainer.vue.js")
43
- ), J = m(
46
+ ), X = m(
44
47
  () => import("./organisms/onboarding/OnboardingWrapper.vue.js")
45
- ), Q = m(
48
+ ), Y = m(
46
49
  () => import("./organisms/extensions/recommendation/AssignStrategyDrawer.vue.js")
47
- ), X = m(
50
+ ), Z = m(
48
51
  () => import("./organisms/extensions/recommendation/RemoveStrategyModal.vue.js")
49
- ), Y = m(
52
+ ), w = W(), ee = m(
50
53
  () => import("./organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js")
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;
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;
58
68
  };
59
- me(), pe();
69
+ ue(), ye();
60
70
  const g = () => {
61
- var t, e;
71
+ var o, e;
62
72
  return {
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
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
69
79
  };
70
- }, { initPlugin: F, preloadRuntime: L } = ge(), { runExclusive: M, beginMount: T, isCurrentMount: S } = le();
80
+ }, { initPlugin: L, preloadRuntime: M } = Se(), { runExclusive: I, beginMount: U, isCurrentMount: v } = pe();
71
81
  let u = 0;
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
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
77
87
  );
78
- ue({
88
+ fe({
79
89
  onBack: () => {
80
90
  console.debug("guido:back"), r("back");
81
91
  },
82
92
  onSaveStart: () => {
83
93
  console.debug("guido:save:start"), r("save:start");
84
94
  },
85
- onSaveComplete: (t) => {
86
- const e = { ...t, metadata: g() };
95
+ onSaveComplete: (o) => {
96
+ const e = { ...o, metadata: g() };
87
97
  console.debug("guido:save:complete", e), r("save:complete", e);
88
98
  },
89
99
  onTestEmailClick: () => {
90
100
  console.debug("guido:test-email:click"), r("test-email:click");
91
101
  }
92
102
  });
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 = () => {
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 = () => {
96
106
  console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
97
107
  };
98
108
  G(() => l.value, () => {
99
109
  r("on-change", l.value);
100
110
  });
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);
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);
104
114
  };
105
- let i = null;
115
+ let c = null;
106
116
  const b = () => {
107
117
  var e;
108
- const t = document.querySelector(ve);
109
- (e = f.value) == null || e.style.setProperty("--ribbon-offset", `${(t == null ? void 0 : t.offsetHeight) ?? 0}px`);
118
+ const o = document.querySelector(we);
119
+ (e = f.value) == null || e.style.setProperty("--ribbon-offset", `${(o == null ? void 0 : o.offsetHeight) ?? 0}px`);
110
120
  }, h = async () => {
111
- var t;
121
+ var o;
112
122
  try {
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) || [];
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) || [];
115
125
  D.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
116
- const _ = ((t = e == null ? void 0 : e.migration) == null ? void 0 : t.recommendationConfigs) ?? {}, O = o.isFeatureEnabled("linkTrackingIds"), x = {
117
- partnerName: o.partnerName,
126
+ const V = ((o = e == null ? void 0 : e.migration) == null ? void 0 : o.recommendationConfigs) ?? {}, x = t.isFeatureEnabled("linkTrackingIds"), H = {
127
+ partnerName: t.partnerName,
118
128
  campaignUrls: e == null ? void 0 : e.recommendationCampaignUrls,
119
- rrsEnabled: o.isFeatureEnabled("reusableRecommendationStrategy")
129
+ rrsEnabled: t.isFeatureEnabled("reusableRecommendationStrategy")
120
130
  };
121
131
  let n = {
122
- html: a && await V(a, _, x),
132
+ html: s && await $(s, V, H),
123
133
  css: d
124
134
  };
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,
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: _,
130
140
  onReady: () => {
131
141
  console.debug("guido:ready"), r("ready");
132
142
  }
133
143
  };
134
- u = T(), await F(n, g(), se), y.selectedDynamicContentList = P;
144
+ u = U(), await L(n, g(), ce), y.selectedDynamicContentList = _;
135
145
  } catch (e) {
136
146
  console.error("Failed to initialize Stripo editor:", e);
137
147
  }
138
148
  };
139
- return ce(async () => {
149
+ return me(async () => {
140
150
  var e;
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)
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)
144
154
  await h();
145
155
  else {
146
- const a = G(() => s.ready, (d) => {
147
- d && (a(), h());
156
+ const s = G(() => i.ready, (d) => {
157
+ d && (s(), h());
148
158
  });
149
159
  }
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))
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))
153
163
  try {
154
- E().isStripoInitialized = !1;
155
- } catch (t) {
156
- console.debug("Failed to close the editor readiness gate on unmount", t);
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);
157
168
  }
158
- M(async () => {
159
- if (S(u))
169
+ I(async () => {
170
+ if (v(u))
160
171
  try {
161
172
  window.UIEditor.removeEditor();
162
173
  } catch {
163
174
  console.debug("Failed to remove Stripo editor: No editor found");
164
175
  }
165
- }), o.reset();
166
- }), K({
176
+ }), t.reset();
177
+ }), J({
167
178
  dynamicContent: {
168
- insert: B,
169
- close: N
179
+ insert: N,
180
+ close: P
170
181
  },
171
182
  hasChanges: l,
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 };
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 };
175
186
  }
176
187
  });
177
188
  export {
178
- yt as default
189
+ To as default
179
190
  };
@@ -1,15 +1,25 @@
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({
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({
7
8
  __name: "AutoSaveController",
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 };
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 };
11
21
  }
12
22
  });
13
23
  export {
14
- d as default
24
+ A as default
15
25
  };
@@ -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
- }, p = [], c = /* @__PURE__ */ d(
12
+ }, l = [], c = /* @__PURE__ */ r(
13
+ a,
14
+ d,
13
15
  l,
14
- u,
15
- p,
16
16
  !1,
17
17
  null,
18
- "baf7a5dd"
18
+ "9a028d08"
19
19
  );
20
- const v = c.exports;
20
+ const p = c.exports;
21
21
  export {
22
- v as default
22
+ p as default
23
23
  };