@useinsider/guido 3.10.0-beta.54ff6d3 → 3.10.0-beta.9a9d2fc

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 (29) hide show
  1. package/dist/composables/useCortexBlueprintBridge.js +7 -7
  2. package/dist/composables/useCustomInterfaceAppearance.js +16 -18
  3. package/dist/composables/useEmailTemplateApplier.js +9 -9
  4. package/dist/composables/useExport.js +18 -18
  5. package/dist/composables/useHtmlValidator.js +90 -90
  6. package/dist/composables/useStripo.js +43 -40
  7. package/dist/composables/useStripoNotifications.js +26 -0
  8. package/dist/composables/useToaster.js +11 -11
  9. package/dist/composables/useVersionHistoryApi.js +2 -2
  10. package/dist/composables/validators/useLiquidValidator.js +1 -1
  11. package/dist/composables/validators/useUnsubscribeBlockValidator.js +10 -10
  12. package/dist/config/i18n/en/labels.json.js +4 -1
  13. package/dist/enums/toaster.js +2 -2
  14. package/dist/enums/unsubscribe.js +41 -36
  15. package/dist/extensions/Blocks/Checkbox/block.js +5 -3
  16. package/dist/extensions/Blocks/Checkbox/control.js +42 -28
  17. package/dist/extensions/Blocks/RadioButton/block.js +9 -7
  18. package/dist/extensions/Blocks/RadioButton/control.js +64 -50
  19. package/dist/extensions/Blocks/Recommendation/useRecommendationBlockWarning.js +7 -7
  20. package/dist/services/blankTemplate.js +1 -1
  21. package/dist/services/templateLibraryApi.js +8 -7
  22. package/dist/src/composables/useStripoNotifications.d.ts +10 -0
  23. package/dist/src/enums/toaster.d.ts +2 -2
  24. package/dist/src/enums/unsubscribe.d.ts +2 -0
  25. package/dist/src/stores/toaster.d.ts +2 -3
  26. package/dist/static/styles/components/dropdown-menu.css.js +12 -0
  27. package/dist/stores/toaster.js +10 -10
  28. package/package.json +2 -2
  29. package/dist/static/styles/components/notification.css.js +0 -74
@@ -1,93 +1,107 @@
1
- var E = Object.defineProperty;
2
- var d = (r, n, t) => n in r ? E(r, n, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[n] = t;
3
- var o = (r, n, t) => d(r, typeof n != "symbol" ? n + "" : n, t);
4
- import { useHttp as l } from "../../../composables/useHttp.js";
5
- import { getDefaultUnsubscribeGroup as L, DEFAULT_UNSUBSCRIBE_GROUP_SEND_GRID_ID as p } from "../../../enums/unsubscribe.js";
6
- import { Control as h, UIElementType as i, UEAttr as e, ModificationDescription as m } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
7
- const b = "ui-elements-radio-button", u = "select", { get: $ } = l();
8
- class I extends h {
1
+ var p = Object.defineProperty;
2
+ var L = (i, n, e) => n in i ? p(i, n, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[n] = e;
3
+ var a = (i, n, e) => L(i, typeof n != "symbol" ? n + "" : n, e);
4
+ import { useHttp as T } from "../../../composables/useHttp.js";
5
+ import { getDefaultUnsubscribeGroup as h, PIXEL_TRACKING_SEND_GRID_ID as I, UNSUBSCRIBE_SENTINEL_SEND_GRID_IDS as m } from "../../../enums/unsubscribe.js";
6
+ import { Control as C, UIElementType as r, UEAttr as t, ModificationDescription as S } from "../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
7
+ const b = "ui-elements-radio-button", E = "select", { get: _ } = T();
8
+ class G extends C {
9
9
  constructor() {
10
10
  super(...arguments);
11
- o(this, "currentNode");
12
- o(this, "selectedUnsubGroup");
13
- o(this, "unsubList", []);
11
+ a(this, "currentNode");
12
+ a(this, "selectedUnsubGroup");
13
+ a(this, "unsubList", []);
14
14
  }
15
15
  getId() {
16
16
  return b;
17
17
  }
18
18
  _setFormValues() {
19
19
  if (this.selectedUnsubGroup = "", this.currentNode && "getAttribute" in this.currentNode) {
20
- const t = this.currentNode.getAttribute("id");
21
- if (t) {
22
- const s = t === p ? t : Number(t);
20
+ const e = this.currentNode.getAttribute("id");
21
+ if (e) {
22
+ const s = m.includes(e) ? e : Number(e);
23
23
  s && (this.selectedUnsubGroup = s);
24
24
  }
25
25
  }
26
26
  this.api.updateValues({
27
- [u]: this.selectedUnsubGroup
27
+ [E]: this.selectedUnsubGroup
28
28
  });
29
29
  }
30
- _getLabel(t, s = `${Math.random()}`) {
30
+ _getLabel(e, s = `${Math.random()}`) {
31
31
  return `
32
- <${i.LABEL}
33
- ${e.LABEL.text}="${t}"
34
- ${e.LABEL.name}="${s}">
35
- </${i.LABEL}>
32
+ <${r.LABEL}
33
+ ${t.LABEL.text}="${e}"
34
+ ${t.LABEL.name}="${s}">
35
+ </${r.LABEL}>
36
36
  `;
37
37
  }
38
- _getSelectItem(t, s) {
38
+ _getSelectItem(e, s) {
39
39
  return `
40
- <${i.SELECT_ITEM}
41
- ${e.SELECT_ITEM.text}="${t}"
42
- ${e.SELECT_ITEM.value}="${s}">
43
- </${i.SELECT_ITEM}>`;
40
+ <${r.SELECT_ITEM}
41
+ ${t.SELECT_ITEM.text}="${e}"
42
+ ${t.SELECT_ITEM.value}="${s}">
43
+ </${r.SELECT_ITEM}>`;
44
44
  }
45
45
  _getSelect() {
46
- return this.unsubList.map((t) => this._getSelectItem(t.name, t.sendGridId)).join("");
46
+ return this.unsubList.map((e) => this._getSelectItem(e.name, e.sendGridId)).join("");
47
47
  }
48
48
  getTemplate() {
49
+ const e = this.api.translate("Unsubscribe & Preference Center Type"), s = this.api.translate("Select Unsubscribe and Preference Type");
49
50
  return `
50
51
  <div class="checkbox-controls-container">
51
- <div class="checkbox-select-container container two-columns stretch">
52
- <${i.LABEL}
53
- ${e.LABEL.text}="${this.api.translate("Unsubscribe Group")}"
54
- ${e.LABEL.name}="${Math.random()}">
55
- </${i.LABEL}>
52
+ <div class="checkbox-select-container container one-column stretch">
53
+ <${r.LABEL}
54
+ ${t.LABEL.text}="${e}"
55
+ ${t.LABEL.name}="${Math.random()}">
56
+ </${r.LABEL}>
56
57
 
57
- <${i.SELECTPICKER}
58
- ${e.SELECTPICKER.name}="${u}"
59
- ${e.SELECTPICKER.placeholder}="${this.api.translate("Select Unsubscribe Group")}">
58
+ <${r.SELECTPICKER}
59
+ ${t.SELECTPICKER.name}="${E}"
60
+ ${t.SELECTPICKER.searchable}="true"
61
+ ${t.SELECTPICKER.placeholder}="${s}">
60
62
  ${this._getSelect()}
61
- </${i.SELECTPICKER}>
63
+ </${r.SELECTPICKER}>
62
64
  </div>
63
65
  </div>
64
66
  `;
65
67
  }
66
- _onSelectChange(t) {
67
- this.currentNode && this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute("id", t.toString()).apply(new m(`Updated text to ${t}`));
68
+ _onSelectChange(e) {
69
+ this.currentNode && this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute("id", e.toString()).apply(new S(`Updated text to ${e}`));
68
70
  }
69
71
  _listenToFormUpdates() {
70
- this.api.onValueChanged(u, (t) => this._onSelectChange(t));
72
+ this.api.onValueChanged(E, (e) => this._onSelectChange(e));
71
73
  }
72
- onTemplateNodeUpdated(t) {
73
- this.currentNode = t, this._setFormValues();
74
+ onTemplateNodeUpdated(e) {
75
+ this.currentNode = e, this._setFormValues();
74
76
  }
75
77
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
76
78
  async onRender() {
77
- const t = await $(
79
+ const e = await _(
78
80
  "/unsubscribe-groups/unsubscribe-list"
79
- ), s = [L(), ...t.data], c = s.map((a) => ({
80
- [e.SELECT_ITEM.text]: a.name,
81
- [e.SELECT_ITEM.value]: a.sendGridId
82
- }));
83
- this.unsubList = s, this.api.setUIEAttribute(
84
- u,
85
- e.SELECTPICKER.items,
86
- c
81
+ ), s = {
82
+ name: this.api.translate("Pixel Tracking Opt-in"),
83
+ sendGridId: I
84
+ }, u = [h(), ...e.data], c = (o) => ({
85
+ [t.SELECT_ITEM.text]: o.name,
86
+ [t.SELECT_ITEM.value]: o.sendGridId
87
+ }), d = (o) => ({
88
+ [t.SELECT_ITEM.text]: o,
89
+ [t.SELECT_ITEM.value]: `header:${o}`,
90
+ [t.SELECT_ITEM.disabled]: !0
91
+ }), l = [
92
+ d(this.api.translate("OPT-IN SELECTION")),
93
+ c(s),
94
+ d(this.api.translate("UNSUBSCRIBE GROUPS")),
95
+ ...u.map(c)
96
+ ];
97
+ this.unsubList = [s, ...u], this.api.setUIEAttribute(
98
+ E,
99
+ t.SELECTPICKER.items,
100
+ l
87
101
  ), this._setFormValues(), this._listenToFormUpdates();
88
102
  }
89
103
  }
90
104
  export {
91
105
  b as CONTROL_BLOCK_ID,
92
- I as RadioButtonControl
106
+ G as RadioButtonControl
93
107
  };
@@ -1,16 +1,16 @@
1
- import { useToaster as r } from "../../../composables/useToaster.js";
1
+ import { useToaster as n } from "../../../composables/useToaster.js";
2
2
  import { useTranslations as s } from "../../../composables/useTranslations.js";
3
- import { ToasterTypeOptions as n } from "../../../enums/toaster.js";
3
+ import { ToasterTypeOptions as r } from "../../../enums/toaster.js";
4
4
  import { countLiveRecommendationBlocks as i } from "./utils/recommendationBlockCount.js";
5
- const a = "newsletter.multiple-reco-blocks-warning", f = () => {
6
- const { showToaster: o } = r(), t = s();
5
+ const c = "newsletter.multiple-reco-blocks-warning", u = () => {
6
+ const { showToaster: o } = n(), t = s();
7
7
  return { warnIfMultipleBlocks: (e) => {
8
8
  i(e) > 1 && o({
9
- type: n.Dark,
10
- message: t(a)
9
+ type: r.Info,
10
+ message: t(c)
11
11
  });
12
12
  } };
13
13
  };
14
14
  export {
15
- f as useRecommendationBlockWarning
15
+ u as useRecommendationBlockWarning
16
16
  };
@@ -26,7 +26,7 @@ const u = (e) => new Promise((t) => {
26
26
  } catch (o) {
27
27
  console.error(`Failed to fetch blank template (attempt ${r}/${a}):`, o), r < a && await u(r * f);
28
28
  }
29
- return e({ type: p.Alert, message: t("errors-pages.undefined-response") }), { html: "", css: "" };
29
+ return e({ type: p.Error, message: t("errors-pages.undefined-response") }), { html: "", css: "" };
30
30
  } };
31
31
  };
32
32
  export {
@@ -4,11 +4,12 @@ import { useToaster as C } from "../composables/useToaster.js";
4
4
  import { useTranslations as h } from "../composables/useTranslations.js";
5
5
  import { useLiquidValidator as S } from "../composables/validators/useLiquidValidator.js";
6
6
  import { EditorType as v } from "../enums/defaults.js";
7
- import { useRecommendationExtensionStore as N } from "../extensions/Blocks/Recommendation/store/recommendation.js";
8
- import { useSaveAsTemplateStore as x } from "../stores/save-as-template.js";
7
+ import { ToasterTypeOptions as N } from "../enums/toaster.js";
8
+ import { useRecommendationExtensionStore as x } from "../extensions/Blocks/Recommendation/store/recommendation.js";
9
+ import { useSaveAsTemplateStore as E } from "../stores/save-as-template.js";
9
10
  import { base64EncodeWithSpecialChars as r } from "../utils/base64.js";
10
11
  import { useTemplatePreparation as A } from "../utils/templatePreparation.js";
11
- const $ = () => {
12
+ const j = () => {
12
13
  const { get: n, post: m } = b(), { handleError: o, showToaster: l } = C(), { config: c, isFeatureEnabled: p } = w(), { validateLiquidSyntax: g } = S(), u = h();
13
14
  return {
14
15
  getCategories: async () => {
@@ -39,7 +40,7 @@ const $ = () => {
39
40
  createTemplate: async () => {
40
41
  var e, t, d, y;
41
42
  try {
42
- const { prepareTemplateDetails: i } = A(), s = x(), a = await i();
43
+ const { prepareTemplateDetails: i } = A(), s = E(), a = await i();
43
44
  if (p("liquidSyntax") && !await g(a.compiledHtml))
44
45
  return !1;
45
46
  const f = {
@@ -53,7 +54,7 @@ const $ = () => {
53
54
  unsubscriptionPreferencePageStatus: !1,
54
55
  unsubscriptionPreferencePages: [],
55
56
  recommendationCampaignUrls: r(
56
- N().recommendationCampaignUrls
57
+ x().recommendationCampaignUrls
57
58
  ),
58
59
  recommendationConfigs: r({}),
59
60
  isGuido: !0,
@@ -74,7 +75,7 @@ const $ = () => {
74
75
  "newsletter.template-library-save-alert",
75
76
  { templateName: s.getTemplateName }
76
77
  ),
77
- type: "alert"
78
+ type: N.Error
78
79
  }), !1) : (l({
79
80
  message: u(
80
81
  "newsletter.template-library-save-success",
@@ -89,5 +90,5 @@ const $ = () => {
89
90
  };
90
91
  };
91
92
  export {
92
- $ as useTemplateLibraryApi
93
+ j as useTemplateLibraryApi
93
94
  };
@@ -0,0 +1,10 @@
1
+ import type { StripoNotifications } from '@@/Types/stripo';
2
+ /**
3
+ * Adapter that routes Stripo's in-editor notifications through Guido's own
4
+ * InToasts-based toaster, so the editor only ever shows one toaster style.
5
+ * Passed to `initEditor` as the `notifications` config (Stripo then delegates
6
+ * rendering to us instead of drawing its native <ue-notifications-container>).
7
+ */
8
+ export declare const useStripoNotifications: () => {
9
+ getStripoNotifications: () => StripoNotifications;
10
+ };
@@ -1,6 +1,6 @@
1
1
  export declare enum ToasterTypeOptions {
2
2
  Success = "success",
3
3
  Warning = "warning",
4
- Alert = "alert",
5
- Dark = "dark"
4
+ Error = "error",
5
+ Info = "information"
6
6
  }
@@ -19,6 +19,8 @@ export declare const PRODUCT_TYPE_URL_SEGMENTS: {
19
19
  };
20
20
  export declare const INSIDER_ID = "iid";
21
21
  export declare const DEFAULT_UNSUBSCRIBE_GROUP_SEND_GRID_ID = "G";
22
+ export declare const PIXEL_TRACKING_SEND_GRID_ID = "P";
23
+ export declare const UNSUBSCRIBE_SENTINEL_SEND_GRID_IDS: string[];
22
24
  /**
23
25
  * Get the default unsubscribe group lazily so the translated name resolves at access time.
24
26
  * Must be called within a Vue component context or after Pinia is initialized.
@@ -4,15 +4,14 @@ export declare const useToasterStore: import("pinia").StoreDefinition<"guidoToas
4
4
  status: boolean;
5
5
  type: import("@@/Types/toaster").ToasterType;
6
6
  text: string;
7
- icon: string;
8
- withIcon: boolean;
9
7
  withoutLeftMargin: boolean;
8
+ autoHide: boolean;
10
9
  actionButton?: {
11
10
  text: string;
12
11
  onClick: () => void;
13
12
  } | undefined;
14
13
  } & import("pinia").PiniaCustomStateProperties<ToasterState>) => boolean;
15
14
  }, {
16
- showToaster(this: ToasterState, { type, message, actionButton }: ToasterOptions): void;
15
+ showToaster(this: ToasterState, { type, message, actionButton, autoHide }: ToasterOptions): void;
17
16
  hideToaster(this: ToasterState): void;
18
17
  }>;
@@ -39,6 +39,18 @@ ue-dropdown .service-element.padding-t-3 {
39
39
  color: var(--guido-color-primary-500);
40
40
  }
41
41
 
42
+ /*
43
+ * SD-145233: the pixel-tracking preference dropdown has no native option groups,
44
+ * so its section titles are rendered as disabled items. Present them as
45
+ * non-interactive group headers instead of options: no hover/cursor affordance
46
+ * and a little extra vertical spacing.
47
+ */
48
+ .dropdown__menu .dropdown__item.disabled {
49
+ padding-top: 14px;
50
+ padding-bottom: 8px;
51
+ pointer-events: none;
52
+ }
53
+
42
54
  .menu {
43
55
  padding: 8px 0px;
44
56
  }
@@ -1,21 +1,21 @@
1
1
  import { ToasterTypeOptions as e } from "../enums/toaster.js";
2
- import { defineStore as i } from "pinia";
3
- const a = () => ({
2
+ import { defineStore as a } from "pinia";
3
+ const u = () => ({
4
4
  status: !1,
5
5
  type: e.Success,
6
6
  text: "",
7
- icon: "",
8
- withIcon: !0,
9
7
  withoutLeftMargin: !1,
8
+ autoHide: !0,
10
9
  actionButton: void 0
11
- }), n = i("guidoToaster", {
12
- state: () => a(),
10
+ }), h = a("guidoToaster", {
11
+ state: () => u(),
13
12
  getters: {
14
- shouldAutoHide: (t) => t.status && !!t.text
13
+ // A toast without auto-hide (e.g. Stripo `loader`) stays until hideToaster.
14
+ shouldAutoHide: (t) => t.status && !!t.text && t.autoHide
15
15
  },
16
16
  actions: {
17
- showToaster({ type: t = e.Success, message: s, actionButton: o }) {
18
- this.status = !0, this.text = s, this.type = t, this.actionButton = o;
17
+ showToaster({ type: t = e.Success, message: s, actionButton: o, autoHide: i = !0 }) {
18
+ this.status = !0, this.text = s, this.type = t, this.actionButton = o, this.autoHide = i;
19
19
  },
20
20
  hideToaster() {
21
21
  this.status = !1;
@@ -23,5 +23,5 @@ const a = () => ({
23
23
  }
24
24
  });
25
25
  export {
26
- n as useToasterStore
26
+ h as useToasterStore
27
27
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useinsider/guido",
3
- "version": "3.10.0-beta.54ff6d3",
3
+ "version": "3.10.0-beta.9a9d2fc",
4
4
  "description": "Guido is a Vue + TypeScript wrapper for Email Plugin. Easily embed the email editor in your Vue applications.",
5
5
  "main": "./dist/guido.umd.cjs",
6
6
  "module": "./dist/library.js",
@@ -37,7 +37,7 @@
37
37
  "license": "ISC",
38
38
  "dependencies": {
39
39
  "@stripoinc/ui-editor-extensions": "3.8.0",
40
- "@useinsider/design-system-vue": "1.1.0-beta.73ec2fa",
40
+ "@useinsider/design-system-vue": "1.3.0",
41
41
  "@vueuse/core": "11.3.0",
42
42
  "lodash-es": "4.17.21",
43
43
  "pinia": "2.3.1",
@@ -1,74 +0,0 @@
1
- const n = `ue-notifications-container {
2
- left: 96px;
3
- margin: 0;
4
- bottom: 32px;
5
- top: unset;
6
- width: unset;
7
- position: fixed;
8
- }
9
-
10
- ue-notifications-container ue-message + ue-message {
11
- margin-bottom: 24px;
12
- }
13
-
14
- ue-notifications-container .alert-message-wrapper {
15
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.07);
16
- border: none;
17
- padding: 16px 24px;
18
- }
19
-
20
- ue-notifications-container .alert-message-wrapper.info,
21
- ue-notifications-container .alert-message-wrapper.loader {
22
- background-color: var(--guido-color-background-toaster-info) !important;
23
- color: inherit;
24
- }
25
-
26
- .alert-message-wrapper .alert-message-main {
27
- align-items: center;
28
- }
29
-
30
- ue-notifications-container ue-caption .caption {
31
- color: var(--guido-color-white) !important;
32
- }
33
-
34
- ue-block-thumb-hint {
35
- text-align: left;
36
- }
37
-
38
- ue-notifications-container .alert-message-wrapper .alert-message-main .alert-message-content {
39
- width: calc(100% - 64px);
40
- }
41
-
42
- ue-notifications-container .alert-message-wrapper .alert-message-main .alert-message-text {
43
- font-size: 15px;
44
- font-weight: 600;
45
- }
46
-
47
- ue-notifications-container .alert-message-text,
48
- ue-notifications-container .alert-message-wrapper ue-icon-component.icon,
49
- ue-notifications-container .alert-message-wrapper ue-icon-component.icon-button {
50
- color: var(--guido-color-white);
51
- }
52
-
53
- ue-notifications-container ue-message ue-button.close {
54
- margin: 0 0 0 16px;
55
- }
56
-
57
- ue-notifications-container .alert-message-wrapper.success {
58
- background: var(--guido-color-background-toaster-success);
59
- color: inherit;
60
- }
61
-
62
- ue-notifications-container .alert-message-wrapper.error {
63
- background: var(--guido-color-background-toaster-error);
64
- color: inherit;
65
- }
66
-
67
- ue-notifications-container .alert-message-wrapper.warn {
68
- background: var(--guido-color-background-toaster-warn);
69
- color: inherit;
70
- }
71
- `;
72
- export {
73
- n as default
74
- };