@useinsider/guido 3.21.0-beta.1bd7edd → 3.21.0-beta.c433290

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 (106) hide show
  1. package/README.md +1 -1
  2. package/dist/@types/config/schemas.js +37 -38
  3. package/dist/components/Guido.vue.js +6 -6
  4. package/dist/components/Guido.vue2.js +112 -103
  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 +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 +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/composables/useAccessibilityApi.js +51 -0
  29. package/dist/composables/useBlocksConfig.js +24 -32
  30. package/dist/composables/useCustomInterfaceAppearance.js +42 -41
  31. package/dist/config/i18n/en/labels.json.js +36 -4
  32. package/dist/config/i18n/en/tooltips.json.js +2 -1
  33. package/dist/enums/academy.js +0 -1
  34. package/dist/guido.css +1 -1
  35. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +92 -93
  36. package/dist/node_modules/valibot/dist/index.js +261 -297
  37. package/dist/sprite.svg +10 -0
  38. package/dist/src/@types/config/schemas.d.ts +2 -4
  39. package/dist/src/components/organisms/AutoSaveController.vue.d.ts +19 -1
  40. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -19
  41. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -19
  42. package/dist/src/components/organisms/onboarding/EditorTabBarOnboarding.vue.d.ts +2 -0
  43. package/dist/src/composables/useAccessibilityApi.d.ts +13 -0
  44. package/dist/src/composables/useActionsApi.d.ts +2 -2
  45. package/dist/src/composables/useConfig.d.ts +2 -2
  46. package/dist/src/enums/academy.d.ts +0 -1
  47. package/dist/src/stores/autosave.d.ts +73 -1
  48. package/dist/src/stores/config.d.ts +20 -166
  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/version-history.d.ts +1 -1
  52. package/dist/src/utils/timeUtil.d.ts +5 -8
  53. package/dist/static/styles/components/accessibility.css.js +234 -0
  54. package/dist/static/styles/variables.css.js +2 -0
  55. package/dist/stores/autosave.js +12 -7
  56. package/dist/stores/config.js +6 -13
  57. package/dist/stores/editor.js +8 -3
  58. package/dist/stores/onboarding.js +48 -22
  59. package/dist/utils/pairProductVariables.js +14 -15
  60. package/dist/utils/timeUtil.js +6 -17
  61. package/package.json +1 -1
  62. package/dist/@types/display-condition.js +0 -25
  63. package/dist/components/organisms/display-conditions/CodeEditorField.vue.js +0 -20
  64. package/dist/components/organisms/display-conditions/CodeEditorField.vue2.js +0 -30
  65. package/dist/components/organisms/display-conditions/DisplayConditionCreateDrawer.vue.js +0 -30
  66. package/dist/components/organisms/display-conditions/DisplayConditionCreateDrawer.vue2.js +0 -71
  67. package/dist/components/organisms/display-conditions/DisplayConditionSelectDrawer.vue.js +0 -34
  68. package/dist/components/organisms/display-conditions/DisplayConditionSelectDrawer.vue2.js +0 -57
  69. package/dist/components/organisms/display-conditions/DisplayConditionsHost.vue.js +0 -17
  70. package/dist/components/organisms/display-conditions/DisplayConditionsHost.vue2.js +0 -22
  71. package/dist/components/organisms/header/AutoSaveToggle.vue.js +0 -22
  72. package/dist/components/organisms/header/AutoSaveToggle.vue2.js +0 -19
  73. package/dist/composables/useDisplayConditions.js +0 -102
  74. package/dist/enums/display-condition.js +0 -12
  75. package/dist/extensions/DisplayConditions/bridge.js +0 -17
  76. package/dist/extensions/DisplayConditions/constants.js +0 -17
  77. package/dist/extensions/DisplayConditions/control.js +0 -178
  78. package/dist/extensions/DisplayConditions/display-conditions.css.js +0 -201
  79. package/dist/extensions/DisplayConditions/extension.js +0 -28
  80. package/dist/extensions/DisplayConditions/iconsRegistry.js +0 -20
  81. package/dist/extensions/DisplayConditions/library.js +0 -27
  82. package/dist/extensions/DisplayConditions/settingsPanel.js +0 -17
  83. package/dist/services/displayConditionApi.js +0 -39
  84. package/dist/src/@types/display-condition.d.ts +0 -59
  85. package/dist/src/components/organisms/display-conditions/CodeEditorField.vue.d.ts +0 -43
  86. package/dist/src/composables/useDisplayConditions.d.ts +0 -16
  87. package/dist/src/enums/display-condition.d.ts +0 -15
  88. package/dist/src/extensions/DisplayConditions/bridge.d.ts +0 -6
  89. package/dist/src/extensions/DisplayConditions/constants.d.ts +0 -14
  90. package/dist/src/extensions/DisplayConditions/control.d.ts +0 -23
  91. package/dist/src/extensions/DisplayConditions/extension.d.ts +0 -2
  92. package/dist/src/extensions/DisplayConditions/iconsRegistry.d.ts +0 -4
  93. package/dist/src/extensions/DisplayConditions/library.d.ts +0 -8
  94. package/dist/src/extensions/DisplayConditions/settingsPanel.d.ts +0 -5
  95. package/dist/src/mock/api/display-conditions.d.ts +0 -2
  96. package/dist/src/services/displayConditionApi.d.ts +0 -8
  97. package/dist/src/stores/display-condition.d.ts +0 -81
  98. package/dist/src/utils/displayCondition.d.ts +0 -10
  99. package/dist/src/utils/protectTableText.d.ts +0 -2
  100. package/dist/stores/display-condition.js +0 -28
  101. package/dist/utils/displayCondition.js +0 -26
  102. package/dist/utils/protectTableText.js +0 -22
  103. /package/dist/src/components/organisms/{display-conditions/DisplayConditionCreateDrawer.vue.d.ts → header/AutoSaveStatus.vue.d.ts} +0 -0
  104. /package/dist/src/components/organisms/{display-conditions/DisplayConditionSelectDrawer.vue.d.ts → header/EditorActionsMenu.vue.d.ts} +0 -0
  105. /package/dist/src/components/organisms/{display-conditions/DisplayConditionsHost.vue.d.ts → header/accessibility/AccessibilityToolbar.vue.d.ts} +0 -0
  106. /package/dist/src/components/organisms/header/{AutoSaveToggle.vue.d.ts → accessibility/ColorVisionSelect.vue.d.ts} +0 -0
package/README.md CHANGED
@@ -150,7 +150,6 @@ const config: GuidoConfigInput = {
150
150
  ui?: {
151
151
  showHeader?: boolean, // Default: true
152
152
  backButtonLabel?: string,
153
- externalDisplayConditions?: boolean, // Default: false - Replace Stripo's display-condition UI with a Conditions tab in the settings panel and create/select drawers for reusable Liquid/Pongo display conditions.
154
153
  },
155
154
 
156
155
  // Optional: Feature toggles (defaults apply once initialized — see `ready` prop below)
@@ -167,6 +166,7 @@ const config: GuidoConfigInput = {
167
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).
168
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).
169
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
170
  },
171
171
 
172
172
  // Optional: Callbacks
@@ -1,5 +1,5 @@
1
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 n, 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";
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,30 +76,30 @@ const p = {
76
76
  value: t()
77
77
  })
78
78
  )
79
- }), f = 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(n(f)),
84
+ children: e(c(f)),
85
85
  // eslint-disable-next-line camelcase -- backend field name
86
- select_items: e(n(f))
87
- })), x = g(
86
+ select_items: e(c(f))
87
+ })), N = g(
88
88
  t(),
89
- R(n(f), [])
90
- ), D = C({
89
+ R(c(f), [])
90
+ ), P = C({
91
91
  /** Block ID (matches the dictionary key and the legacy HTML element id) */
92
92
  id: e(s()),
93
93
  /** Decimal places for price display (legacy data may use string or number) */
94
94
  decimalCount: e(h([t(), s()])),
95
95
  /** Pinned product IDs (empty array when filter-driven) */
96
- productIds: e(n(r())),
96
+ productIds: e(c(r())),
97
97
  /** Whether the block requested live products at send time */
98
98
  sendProductRequestFlag: e(o()),
99
99
  /** Whether to randomize product order */
100
100
  shuffleProducts: e(o()),
101
101
  /** Filter rules driving product selection */
102
- filters: e(n(r())),
102
+ filters: e(c(r())),
103
103
  /** Currency code (e.g. 'EUR') — sometimes absent in legacy data */
104
104
  currency: e(t()),
105
105
  /** Currency display settings (separators, alignment, decimals) */
@@ -109,7 +109,7 @@ const p = {
109
109
  /** Recommendation strategy key (e.g. 'newArrivals') */
110
110
  strategy: e(t()),
111
111
  /** Snapshot of products as rendered by the legacy block */
112
- recommendedProducts: e(n(r())),
112
+ recommendedProducts: e(c(r())),
113
113
  /** Number of product cards per row */
114
114
  cardsInRow: e(s()),
115
115
  /** Mobile-only padding (right) */
@@ -132,7 +132,7 @@ const p = {
132
132
  isPriceMovedToNextLine: e(o()),
133
133
  /** Legacy "Hide if same as discounted" / delete-price-for-zero-sale toggle */
134
134
  isPriceDeletedForZeroSale: e(o())
135
- }), N = a({
135
+ }), v = a({
136
136
  /**
137
137
  * Legacy recommendation block configs keyed by block ID.
138
138
  * Pass this when loading a template authored with the v1
@@ -140,17 +140,17 @@ const p = {
140
140
  * strategy, currency, locale, and layout data.
141
141
  */
142
142
  recommendationConfigs: e(
143
- g(t(), D),
143
+ g(t(), P),
144
144
  {}
145
145
  )
146
- }), P = a({
146
+ }), x = a({
147
147
  /** Initial HTML content */
148
148
  html: e(t(), ""),
149
149
  /** Initial CSS content */
150
150
  css: e(t(), ""),
151
151
  /** Preselected dynamic content items */
152
152
  preselectedDynamicContent: e(
153
- n(M),
153
+ c(M),
154
154
  []
155
155
  ),
156
156
  /**
@@ -159,11 +159,11 @@ const p = {
159
159
  * (first) partner's leaf attributes into the label→token map that repairs
160
160
  * label-form placeholders (`{{ Phone Number }}`) in dropped saved modules.
161
161
  */
162
- dynamicContentList: e(x, {}),
162
+ dynamicContentList: e(N, {}),
163
163
  /** Valid custom field attribute names from the partner's categorized fields */
164
- customFieldAttributes: e(n(t()), []),
164
+ customFieldAttributes: e(c(t()), []),
165
165
  /** Selected unsubscribe page IDs */
166
- selectedUnsubscribePages: e(n(s()), []),
166
+ selectedUnsubscribePages: e(c(s()), []),
167
167
  /** Force recreate template in Stripo storage (use true when updating externally modified templates) */
168
168
  forceRecreate: e(o(), !1),
169
169
  /**
@@ -176,7 +176,7 @@ const p = {
176
176
  trackIdCounter: e(
177
177
  i(
178
178
  s(),
179
- y((c) => Number.isFinite(c) ? Math.max(0, Math.floor(c)) : 0)
179
+ y((n) => Number.isFinite(n) ? Math.max(0, Math.floor(n)) : 0)
180
180
  ),
181
181
  0
182
182
  ),
@@ -190,12 +190,12 @@ const p = {
190
190
  recommendationCampaignUrls: e(
191
191
  i(
192
192
  r(),
193
- y((c) => c && typeof c == "object" ? { ...c } : void 0)
193
+ y((n) => n && typeof n == "object" ? { ...n } : void 0)
194
194
  )
195
195
  ),
196
196
  /** Migration-only inputs (legacy block configs) */
197
- migration: e(N, {})
198
- }), v = a({
197
+ migration: e(v, {})
198
+ }), D = a({
199
199
  /** Sender display name */
200
200
  senderName: e(t(), ""),
201
201
  /** Email subject line */
@@ -208,7 +208,7 @@ const p = {
208
208
  /** Migration date for template compatibility */
209
209
  migrationDate: e(s(), 1759696858),
210
210
  /** Email header settings */
211
- emailHeader: e(v, { senderName: "", subject: "" }),
211
+ emailHeader: e(D, { senderName: "", subject: "" }),
212
212
  /** Folder name for user-saved modules (used by Stripo plugin panel for path construction) */
213
213
  savedModulesFolderName: e(t(), S.SAVED_MODULES),
214
214
  /** Folder name for default/prebuilt modules (used by Stripo plugin panel for path construction) */
@@ -217,9 +217,7 @@ const p = {
217
217
  /** Whether to show the header bar */
218
218
  showHeader: e(o(), !0),
219
219
  /** Custom label for back button (if shown) */
220
- backButtonLabel: e(t()),
221
- /** Replace Stripo's display-condition UI with the Conditions tab and create/select drawers */
222
- externalDisplayConditions: e(o(), !1)
220
+ backButtonLabel: e(t())
223
221
  }), U = a({
224
222
  /** Enable dynamic content insertion */
225
223
  dynamicContent: e(o(), !0),
@@ -239,6 +237,7 @@ const p = {
239
237
  liquidSyntax: e(o(), !1),
240
238
  /** Enable autosave (3-min interval + tab-hide). User toggles on/off from the header. */
241
239
  autosave: e(o(), !1),
240
+ accessibilityTesting: e(o(), !1),
242
241
  /** Enable pre-save domain-allowlist validation (opt-in; Guido self-serves the block toaster) */
243
242
  allowlistEnabled: e(o(), !1),
244
243
  /** Enable persistent link tracking-id assignment for the click heatmap (opt-in) */
@@ -271,12 +270,12 @@ const p = {
271
270
  ]), j = a({
272
271
  /** Default blocks to exclude from the editor */
273
272
  excludeDefaults: e(
274
- n(w),
273
+ c(w),
275
274
  []
276
275
  ),
277
276
  /** Custom blocks to include in the editor */
278
277
  includeCustoms: e(
279
- n(B),
278
+ c(B),
280
279
  []
281
280
  )
282
281
  }), d = a({
@@ -308,23 +307,23 @@ const p = {
308
307
  ...d.entries,
309
308
  type: u("remove"),
310
309
  /** Strings or patterns to remove */
311
- targets: n(t())
310
+ targets: c(t())
312
311
  }), G = a({
313
312
  ...d.entries,
314
313
  type: u("custom"),
315
314
  /** Custom processor function */
316
315
  processor: k(
317
- (c) => typeof c == "function",
316
+ (n) => typeof n == "function",
318
317
  "processor must be a function"
319
318
  )
320
- }), V = I("type", [
319
+ }), V = T("type", [
321
320
  H,
322
321
  _,
323
322
  q,
324
323
  G
325
324
  ]), z = a({
326
325
  /** Custom compiler rules to apply */
327
- customRules: e(n(V), []),
326
+ customRules: e(c(V), []),
328
327
  /** Skip default compiler rules */
329
328
  ignoreDefaultRules: e(o(), !1)
330
329
  }), W = a({
@@ -334,7 +333,7 @@ const p = {
334
333
  */
335
334
  externalValidation: e(
336
335
  k(
337
- (c) => typeof c == "function",
336
+ (n) => typeof n == "function",
338
337
  "externalValidation must be a function"
339
338
  )
340
339
  )
@@ -346,7 +345,7 @@ const p = {
346
345
  partner: E,
347
346
  // Optional sections (with defaults)
348
347
  /** Template content and presets */
349
- template: e(P, {}),
348
+ template: e(x, {}),
350
349
  /** Editor settings */
351
350
  editor: e(O, {}),
352
351
  /** UI configuration */
@@ -368,23 +367,23 @@ export {
368
367
  B as CustomBlockTypeSchema,
369
368
  G as CustomRuleSchema,
370
369
  w as DefaultBlockTypeSchema,
371
- x as DynamicContentListSchema,
370
+ N as DynamicContentListSchema,
372
371
  f as DynamicContentNodeSchema,
373
372
  M as DynamicContentSchema,
374
373
  O as EditorSchema,
375
- v as EmailHeaderSchema,
374
+ D as EmailHeaderSchema,
376
375
  L as FallbackFontSchema,
377
376
  U as FeaturesSchema,
378
377
  K as GuidoConfigSchema,
379
378
  A as IdentitySchema,
380
- D as LegacyRecommendationConfigSchema,
379
+ P as LegacyRecommendationConfigSchema,
381
380
  p as MessageType,
382
381
  E as PartnerSchema,
383
382
  l as ProductType,
384
383
  _ as RegexRuleSchema,
385
384
  q as RemoveRuleSchema,
386
385
  H as ReplaceRuleSchema,
387
- N as TemplateMigrationSchema,
388
- P as TemplateSchema,
386
+ v as TemplateMigrationSchema,
387
+ x as TemplateSchema,
389
388
  F as UISchema
390
389
  };
@@ -1,18 +1,18 @@
1
- import i from "./Guido.vue2.js";
1
+ import o from "./Guido.vue2.js";
2
2
  /* empty css */
3
- import o from "../_virtual/_plugin-vue2_normalizer.js";
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.isExternalDisplayConditionsEnabled ? r(e.DisplayConditionsHost) : 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
- }, s = [], n = /* @__PURE__ */ o(
10
- i,
9
+ }, s = [], n = /* @__PURE__ */ i(
10
+ o,
11
11
  t,
12
12
  s,
13
13
  !1,
14
14
  null,
15
- "5d5e32de"
15
+ "f0ba01bc"
16
16
  );
17
17
  const v = n.exports;
18
18
  export {
@@ -1,81 +1,89 @@
1
- import { defineComponent as de, defineAsyncComponent as c, ref as W, computed as l, watch as G, onMounted as me, onUnmounted as le } from "vue";
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
2
  import { useCortexBlueprintBridge as ue } from "../composables/useCortexBlueprintBridge.js";
3
3
  import { useEditorLock as pe } from "../composables/useEditorLock.js";
4
4
  import { provideGuidoActions as fe } from "../composables/useGuidoActions.js";
5
5
  import { useGuidoStateBridge as ye } from "../composables/useGuidoStateBridge.js";
6
6
  import { usePartner as ge } from "../composables/usePartner.js";
7
- import { useSaveValidationRollout as Se } from "../composables/useSaveValidationRollout.js";
8
- import { useStripo as ve } from "../composables/useStripo.js";
7
+ import { useSaveValidationRollout as ve } from "../composables/useSaveValidationRollout.js";
8
+ import { useStripo as Se } from "../composables/useStripo.js";
9
9
  import { useTimerClone as be } from "../composables/useTimerClone.js";
10
- import { migrate as H } from "../config/migrator/index.js";
11
- import { ModuleFolderDefaults as V } from "../enums/defaults.js";
12
- import { RIBBON_SELECTOR as he } from "../enums/onboarding.js";
13
- import { useRecommendationExtensionStore as $, disposeStrategyPageReturnListeners as Ee } from "../extensions/Blocks/Recommendation/store/recommendation.js";
14
- import { disposeUnsubscribeListeners as De } from "../extensions/Blocks/Unsubscribe/block.js";
15
- import we from "./organisms/AutoSaveController.vue.js";
16
- import Ce from "./organisms/base/AuthErrorModal.vue.js";
17
- import ke from "./organisms/base/Toaster.vue.js";
18
- import Re from "./organisms/extensions/recommendation/FilterSelectionDrawer.vue.js";
19
- import Fe from "./organisms/header/HeaderWrapper.vue.js";
20
- import Le from "./organisms/LoadingWrapper.vue.js";
21
- import Me from "./organisms/save-as-template/SaveAsTemplateDrawer.vue.js";
22
- import Te from "./organisms/unsubscribe/UnsubscribeWrapper.vue.js";
23
- import Ie from "./organisms/validation/ValidationErrorDrawer.vue.js";
24
- import { useStripoApi as Ue } from "../services/stripoApi.js";
25
- import { useConfigStore as Ae } from "../stores/config.js";
26
- import { useDynamicContentStore as Be } from "../stores/dynamic-content.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 Ne } from "../stores/preview.js";
29
- import { useSaveValidationStore as xe } from "../stores/save-validation.js";
30
- import { useTemplateStore as Pe } from "../stores/template.js";
31
- import { useUnsubscribeStore as _e } from "../stores/unsubscribe.js";
32
- import { readTrackFloor as z } from "../utils/linkTrackingIds.js";
33
- const St = /* @__PURE__ */ de({
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 a = q, j = c(
43
+ setup(j, { expose: J, emit: r }) {
44
+ const i = j, Q = m(
42
45
  () => import("./organisms/email-preview/PreviewContainer.vue.js")
43
- ), J = c(
46
+ ), X = m(
44
47
  () => import("./organisms/onboarding/OnboardingWrapper.vue.js")
45
- ), Q = c(
48
+ ), Y = m(
46
49
  () => import("./organisms/extensions/recommendation/AssignStrategyDrawer.vue.js")
47
- ), X = c(
50
+ ), Z = m(
48
51
  () => import("./organisms/extensions/recommendation/RemoveStrategyModal.vue.js")
49
- ), Y = c(
50
- () => import("./organisms/display-conditions/DisplayConditionsHost.vue.js")
51
- ), Z = c(
52
+ ), w = W(), ee = m(
52
53
  () => import("./organisms/extensions/recommendation/LegacyStrategyUpdatedModal.vue.js")
53
- ), D = W(), f = W(), y = Be(), w = _e(), o = Ae();
54
- a.ready && o.init(a.config);
55
- const d = E(), ee = Ne(), u = l(() => d.hasChanges), { isTestPartner: te } = ge(), { isEnabled: oe, loadRollout: C } = Se(), k = () => {
56
- var t;
57
- return (t = D.value) == null ? void 0 : t.handleSave(!0);
58
- }, R = (t) => {
59
- d.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;
60
68
  };
61
69
  ue(), ye();
62
70
  const g = () => {
63
- var t, e;
71
+ var o, e;
64
72
  return {
65
- emailId: o.templateId,
66
- userId: o.userId,
67
- username: o.username,
68
- partnerName: o.partnerName,
69
- savedModulesFolderName: ((t = o.editor) == null ? void 0 : t.savedModulesFolderName) || V.SAVED_MODULES,
70
- defaultModulesFolderName: ((e = o.editor) == null ? void 0 : e.defaultModulesFolderName) || V.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
71
79
  };
72
- }, { initPlugin: F, preloadRuntime: L } = ve(), { runExclusive: M, beginMount: T, isCurrentMount: S } = pe();
73
- let p = 0;
74
- const { getDefaultTemplate: I } = Ue(), { cloneTimersOnSave: U, hasTimerBlocks: A } = be(), ne = l(() => {
75
- var t;
76
- return !((t = o.ui) != null && t.showHeader);
77
- }), re = l(() => o.isFeatureEnabled("reusableRecommendationStrategy")), se = l(() => o.externalDisplayConditions), ae = l(
78
- () => !!$().recommendationConfigs.strategyId
80
+ }, { initPlugin: L, preloadRuntime: M } = Se(), { runExclusive: I, beginMount: U, isCurrentMount: v } = pe();
81
+ 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
79
87
  );
80
88
  fe({
81
89
  onBack: () => {
@@ -84,98 +92,99 @@ const St = /* @__PURE__ */ de({
84
92
  onSaveStart: () => {
85
93
  console.debug("guido:save:start"), r("save:start");
86
94
  },
87
- onSaveComplete: (t) => {
88
- const e = { ...t, metadata: g() };
95
+ onSaveComplete: (o) => {
96
+ const e = { ...o, metadata: g() };
89
97
  console.debug("guido:save:complete", e), r("save:complete", e);
90
98
  },
91
99
  onTestEmailClick: () => {
92
100
  console.debug("guido:test-email:click"), r("test-email:click");
93
101
  }
94
102
  });
95
- const B = (t) => {
96
- console.debug("dynamic-content:close", t), y.setSelectedDynamicContent(t), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: t }));
97
- }, 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 = () => {
98
106
  console.debug("dynamic-content:close", "Without Data"), document.dispatchEvent(new CustomEvent("dynamic-content:close", { detail: { text: "", value: "" } }));
99
107
  };
100
- G(() => u.value, () => {
101
- r("on-change", u.value);
108
+ G(() => l.value, () => {
109
+ r("on-change", l.value);
102
110
  });
103
- const v = (t) => {
104
- const e = t, { attribute: s, position: m } = e.detail;
105
- console.debug("dynamic-content:open", e.detail), r("dynamic-content:open", s, m);
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);
106
114
  };
107
- let i = null;
115
+ let c = null;
108
116
  const b = () => {
109
117
  var e;
110
- const t = document.querySelector(he);
111
- (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`);
112
120
  }, h = async () => {
113
- var t;
121
+ var o;
114
122
  try {
115
- o.initialized || o.init(a.config), d.templateId = o.templateId;
116
- const e = o.template, s = (e == null ? void 0 : e.html) || "", m = (e == null ? void 0 : e.css) || "", x = (e == null ? void 0 : e.preselectedDynamicContent) || [];
117
- w.selectedUnsubscribePages = (e == null ? void 0 : e.selectedUnsubscribePages) || [];
118
- const P = ((t = e == null ? void 0 : e.migration) == null ? void 0 : t.recommendationConfigs) ?? {}, _ = o.isFeatureEnabled("linkTrackingIds"), O = {
119
- partnerName: o.partnerName,
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) || [];
125
+ 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,
120
128
  campaignUrls: e == null ? void 0 : e.recommendationCampaignUrls,
121
- rrsEnabled: o.isFeatureEnabled("reusableRecommendationStrategy")
129
+ rrsEnabled: t.isFeatureEnabled("reusableRecommendationStrategy")
122
130
  };
123
131
  let n = {
124
- html: s && await H(s, P, O),
125
- css: m
132
+ html: s && await $(s, V, H),
133
+ css: d
126
134
  };
127
- n.html || (n = await I(), n.html = await H(n.html, P, O));
128
- const ie = _ ? z(n.html, (e == null ? void 0 : e.trackIdCounter) || 0) : 0;
129
- A(n.html) && (n.html = await U(n.html)), _ && (d.trackIdSessionFloor = Math.max(ie, z(n.html)));
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)));
130
138
  const ce = {
131
- preselectedDynamicContentList: x,
139
+ preselectedDynamicContentList: _,
132
140
  onReady: () => {
133
141
  console.debug("guido:ready"), r("ready");
134
142
  }
135
143
  };
136
- p = T(), await F(n, g(), ce), y.selectedDynamicContentList = x;
144
+ u = U(), await L(n, g(), ce), y.selectedDynamicContentList = _;
137
145
  } catch (e) {
138
146
  console.error("Failed to initialize Stripo editor:", e);
139
147
  }
140
148
  };
141
149
  return me(async () => {
142
150
  var e;
143
- console.debug("Guido says happy coding 🎉"), console.debug("🚗 Ka-Chow"), $().$reset(), E().$reset(), Pe().$reset(), xe().$reset(), C(), b();
144
- const t = (e = f.value) == null ? void 0 : e.parentElement;
145
- if (t && (i = new ResizeObserver(b), i.observe(t)), L(), a.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)
146
154
  await h();
147
155
  else {
148
- const s = G(() => a.ready, (m) => {
149
- m && (s(), h());
156
+ const s = G(() => i.ready, (d) => {
157
+ d && (s(), h());
150
158
  });
151
159
  }
152
- document.addEventListener("dynamic-content:open", v);
160
+ document.addEventListener("dynamic-content:open", S);
153
161
  }), le(() => {
154
- if (De(), Ee(), i == null || i.disconnect(), document.removeEventListener("dynamic-content:open", v), S(p))
162
+ if (ke(), Te(), c == null || c.disconnect(), document.removeEventListener("dynamic-content:open", S), v(u))
155
163
  try {
156
- E().isStripoInitialized = !1;
157
- } catch (t) {
158
- 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);
159
168
  }
160
- M(async () => {
161
- if (S(p))
169
+ I(async () => {
170
+ if (v(u))
162
171
  try {
163
172
  window.UIEditor.removeEditor();
164
173
  } catch {
165
174
  console.debug("Failed to remove Stripo editor: No editor found");
166
175
  }
167
- }), o.reset();
168
- }), K({
176
+ }), t.reset();
177
+ }), J({
169
178
  dynamicContent: {
170
- insert: B,
171
- close: N
179
+ insert: N,
180
+ close: P
172
181
  },
173
- hasChanges: u,
174
- saveSilent: k,
175
- setLoading: R
176
- }), { __sfc: !0, PreviewContainer: j, OnboardingWrapper: J, AssignStrategyDrawer: Q, RemoveStrategyModal: X, DisplayConditionsHost: Y, LegacyStrategyUpdatedModal: Z, headerWrapperRef: D, wrapperRef: f, dynamicContentStore: y, unsubscribeStore: w, props: a, configStore: o, editorStore: d, previewStore: ee, hasChanges: u, isTestPartner: te, isSaveValidationEnabled: oe, loadRollout: C, saveSilent: k, setLoading: R, emit: r, buildMetadata: g, initPlugin: F, preloadRuntime: L, runExclusive: M, beginMount: T, isCurrentMount: S, mountGeneration: p, getDefaultTemplate: I, cloneTimersOnSave: U, hasTimerBlocks: A, noHeader: ne, isRrsEnabled: re, isExternalDisplayConditionsEnabled: se, hasAssignedStrategy: ae, insertDynamicContent: B, closeDynamicContent: N, handleDynamicContentOpen: v, ribbonObserver: i, updateRibbonOffset: b, startEditor: h, AutoSaveController: we, AuthErrorModal: Ce, Toaster: ke, FilterSelectionDrawer: Re, HeaderWrapper: Fe, LoadingWrapper: Le, SaveAsTemplateDrawer: Me, UnsubscribeWrapper: Te, ValidationErrorDrawer: Ie };
182
+ 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 };
177
186
  }
178
187
  });
179
188
  export {
180
- St as default
189
+ To as default
181
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
+ };