@useinsider/guido 3.9.1-beta.fdaa66f → 3.10.0-beta.06d1f41

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 (38) 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 +53 -51
  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/compiler/htmlCompilerRules.js +30 -7
  13. package/dist/config/compiler/utils/recommendationCompilerUtils.js +137 -119
  14. package/dist/enums/defaults.js +7 -4
  15. package/dist/enums/toaster.js +2 -2
  16. package/dist/extensions/Blocks/Items/controls/price/currencySymbol.js +1 -1
  17. package/dist/extensions/Blocks/Recommendation/useRecommendationBlockWarning.js +7 -7
  18. package/dist/extensions/Blocks/Recommendation/utils/captureStyleTemplates.js +75 -69
  19. package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMap.js +0 -2
  20. package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +18 -17
  21. package/dist/services/blankTemplate.js +34 -0
  22. package/dist/services/stripoApi.js +13 -18
  23. package/dist/services/templateLibraryApi.js +8 -7
  24. package/dist/src/composables/useStripoNotifications.d.ts +10 -0
  25. package/dist/src/enums/defaults.d.ts +3 -0
  26. package/dist/src/enums/toaster.d.ts +2 -2
  27. package/dist/src/extensions/Blocks/Recommendation/utils/captureStyleTemplates.d.ts +6 -0
  28. package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMap.d.ts +0 -1
  29. package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +1 -0
  30. package/dist/src/services/blankTemplate.d.ts +11 -0
  31. package/dist/src/stores/toaster.d.ts +2 -3
  32. package/dist/stores/toaster.js +10 -10
  33. package/dist/utils/pairProductVariables.js +64 -65
  34. package/dist/utils/templatePreparation.js +16 -20
  35. package/package.json +2 -2
  36. package/dist/static/styles/components/notification.css.js +0 -74
  37. package/dist/static/templates/empty/index.html.js +0 -74
  38. package/dist/static/templates/empty/style.css.js +0 -779
@@ -1,85 +1,84 @@
1
- import { productPairs as L } from "../extensions/Blocks/Items/enums/productEnums.js";
2
- function q(w) {
3
- const y = w.replaceAll("{%", "<!--{%").replaceAll("%}", "%}-->"), T = new DOMParser().parseFromString(y, "text/html"), C = L.PAIRS_FOR_EXTENSION;
4
- Object.entries(C).forEach(([r, f]) => {
5
- T.querySelectorAll(".ins-product-td").forEach((o) => {
6
- const A = o.getAttribute("data-number") || "1", b = o.getAttribute("data-type") || "CART_ITEMS";
7
- o.querySelectorAll(`[product-attr="${r}"]`).forEach((e) => {
8
- var k, F, I;
9
- const $ = e.getAttribute("data-type") || b, d = e.getAttribute("data-number") || A, u = f[$];
10
- if (u)
1
+ import { productPairs as q } from "../extensions/Blocks/Items/enums/productEnums.js";
2
+ import { DefaultConfigValues as N } from "../extensions/Blocks/Items/enums/settingsEnums.js";
3
+ function W(M) {
4
+ const S = M.replaceAll("{%", "<!--{%").replaceAll("%}", "%}-->"), g = new DOMParser().parseFromString(S, "text/html"), m = q.PAIRS_FOR_EXTENSION;
5
+ Object.entries(m).forEach(([r, f]) => {
6
+ g.querySelectorAll(".ins-product-td").forEach((c) => {
7
+ const A = c.getAttribute("data-number") || "1", C = c.getAttribute("data-type") || "CART_ITEMS";
8
+ c.querySelectorAll(`[product-attr="${r}"]`).forEach((e) => {
9
+ var F, I, w;
10
+ const $ = e.getAttribute("data-type") || C, u = e.getAttribute("data-number") || A, d = f[$];
11
+ if (d)
11
12
  switch (r) {
12
13
  case "imageSrc": {
13
14
  let t = null, i = null;
14
15
  if (e.tagName === "IMG" ? (t = e, i = t.closest("a")) : (t = e.querySelector("img"), i = e.querySelector("a") || e.closest("a")), !t)
15
16
  break;
16
- const a = u.DEFAULT, s = u.ATTR;
17
+ const a = d.DEFAULT, s = d.ATTR;
17
18
  if (a && t.src) {
18
- const c = t.src;
19
+ const o = t.src;
19
20
  a.some((h) => {
20
- const l = h.split("/").pop() || "", g = c.split("/").pop() || "";
21
- return c.includes(h) || c.includes(l) || g === l;
22
- }) && (t.src = `{{${s}_${d}}}`);
21
+ const l = h.split("/").pop() || "", b = o.split("/").pop() || "";
22
+ return o.includes(h) || o.includes(l) || b === l;
23
+ }) && (t.src = `{{${s}_${u}}}`);
23
24
  }
24
- const n = (F = (k = C.name) == null ? void 0 : k[$]) == null ? void 0 : F.ATTR;
25
- if (n && t.setAttribute("alt", `{{${n}_${d}}}`), i) {
26
- const c = (I = C.itemLink) == null ? void 0 : I[$];
27
- if (c) {
28
- const E = c.HREF, h = c.DEFAULT_HREF || "#!", l = i.href;
29
- (l === "#" || l === "" || l.endsWith("#!") || l.endsWith(h) || l === `${window.location.href}${h}` || !l || l === window.location.href) && (i.href = `{{${E}_${d}}}`);
25
+ const n = (I = (F = m.name) == null ? void 0 : F[$]) == null ? void 0 : I.ATTR;
26
+ if (n && t.setAttribute("alt", `{{${n}_${u}}}`), i) {
27
+ const o = (w = m.itemLink) == null ? void 0 : w[$];
28
+ if (o) {
29
+ const E = o.HREF, h = o.DEFAULT_HREF || "#!", l = i.href;
30
+ (l === "#" || l === "" || l.endsWith("#!") || l.endsWith(h) || l === `${window.location.href}${h}` || !l || l === window.location.href) && (i.href = `{{${E}_${u}}}`);
30
31
  }
31
32
  }
32
33
  break;
33
34
  }
34
35
  case "name": {
35
- const t = u, i = t.ATTR, a = t.DEFAULT_HREF || "#!", s = t.HREF;
36
- e.textContent && (e.textContent = `{{${i}_${d}}}`);
36
+ const t = d, i = t.ATTR, a = t.DEFAULT_HREF || "#!", s = t.HREF;
37
+ e.textContent && (e.textContent = `{{${i}_${u}}}`);
37
38
  const n = e.closest("a") || (e.tagName === "A" ? e : null);
38
39
  if (n && s) {
39
- const c = n.href, E = `${window.location.href}${a}`;
40
- (c === E || c.endsWith(a)) && (n.href = `{{${s}_${d}}}`);
40
+ const o = n.href, E = `${window.location.href}${a}`;
41
+ (o === E || o.endsWith(a)) && (n.href = `{{${s}_${u}}}`);
41
42
  }
42
43
  break;
43
44
  }
44
45
  case "price":
45
46
  case "originalPrice": {
46
- const t = u, i = e.getAttribute("data-formated"), a = e.getAttribute("data-single_price"), s = i === "true", n = a === "true", c = e.getAttribute("data-curency") || "before";
47
+ const t = d, i = e.getAttribute("data-formated"), a = e.getAttribute("data-single_price"), s = i === "true", n = a === "true", o = e.getAttribute("data-curency") || "before";
47
48
  let E;
48
49
  n ? E = s ? t.SINGLE_PRICE_FORMATTED : t.SINGLE_PRICE : E = s ? t.PRICE_FORMATTED : t.PRICE;
49
50
  const h = t.CURRENCY;
50
- let l = `{{${E}_${d}}}`;
51
- if (h) {
52
- const g = `{{${h}_${d}}}`;
53
- l = c === "after" ? `${l} ${g}` : `${g} ${l}`;
54
- }
55
- e.textContent = l;
51
+ let l = `{{${E}_${u}}}`;
52
+ const b = (e.getAttribute("data-currency_symbol") || "").trim(), x = b !== "" && b !== N.productPriceCurrencySymbolControlValue;
53
+ let T = "";
54
+ x ? T = b : h && (T = `{{${h}_${u}}}`), T && (l = o === "after" ? `${l} ${T}` : `${T} ${l}`), e.textContent = l;
56
55
  break;
57
56
  }
58
57
  case "quantity": {
59
- const t = u, i = t.ATTR, a = t.DEFAULT;
60
- e.textContent && e.textContent.trim() === a && (e.textContent = `{{${i}_${d}}}`);
58
+ const t = d, i = t.ATTR, a = t.DEFAULT;
59
+ e.textContent && e.textContent.trim() === a && (e.textContent = `{{${i}_${u}}}`);
61
60
  break;
62
61
  }
63
62
  case "button": {
64
- const t = u, i = t.HREF, a = t.DEFAULT_HREF || "#!", s = e.tagName === "A" ? e : e.querySelector("a");
63
+ const t = d, i = t.HREF, a = t.DEFAULT_HREF || "#!", s = e.tagName === "A" ? e : e.querySelector("a");
65
64
  if (s) {
66
- const n = s.href || "", c = `${window.location.href}${a}`;
67
- (n === "" || n === "#" || n === c || n.endsWith(a) || n.endsWith("#!") || n === window.location.href) && (s.href = `{{${i}_${d}}}`);
65
+ const n = s.href || "", o = `${window.location.href}${a}`;
66
+ (n === "" || n === "#" || n === o || n.endsWith(a) || n.endsWith("#!") || n === window.location.href) && (s.href = `{{${i}_${u}}}`);
68
67
  }
69
68
  break;
70
69
  }
71
70
  case "itemLink": {
72
- const t = u, i = t.HREF, a = t.DEFAULT_HREF || "#!", s = e;
71
+ const t = d, i = t.HREF, a = t.DEFAULT_HREF || "#!", s = e;
73
72
  if (s.href) {
74
- const n = s.href, c = `${window.location.href}${a}`;
75
- (n === c || n.endsWith(a)) && (s.href = `{{${i}_${d}}}`);
73
+ const n = s.href, o = `${window.location.href}${a}`;
74
+ (n === o || n.endsWith(a)) && (s.href = `{{${i}_${u}}}`);
76
75
  }
77
76
  break;
78
77
  }
79
78
  default: {
80
- if ("ATTR" in u) {
81
- const t = u.ATTR;
82
- e.textContent && (e.textContent = `{{${t}_${d}}}`);
79
+ if ("ATTR" in d) {
80
+ const t = d.ATTR;
81
+ e.textContent && (e.textContent = `{{${t}_${u}}}`);
83
82
  }
84
83
  break;
85
84
  }
@@ -87,48 +86,48 @@ function q(w) {
87
86
  });
88
87
  });
89
88
  });
90
- const S = y.match(/<!DOCTYPE[^>]*>/i), M = S ? `${S[0]}
91
- ` : "", P = T.querySelectorAll(".ins-product-td"), H = [];
92
- P.forEach((r) => {
93
- const f = r.getAttribute("data-type") || "CART_ITEMS", p = r.getAttribute("data-number") || "1", o = r.getAttribute("data-nodup"), A = r.outerHTML;
94
- H.push({
89
+ const H = S.match(/<!DOCTYPE[^>]*>/i), P = H ? `${H[0]}
90
+ ` : "", D = g.querySelectorAll(".ins-product-td"), k = [];
91
+ D.forEach((r) => {
92
+ const f = r.getAttribute("data-type") || "CART_ITEMS", p = r.getAttribute("data-number") || "1", c = r.getAttribute("data-nodup"), A = r.outerHTML;
93
+ k.push({
95
94
  element: r,
96
95
  outerHtml: A,
97
96
  type: f,
98
97
  number: p,
99
- nodup: o || void 0
98
+ nodup: c || void 0
100
99
  });
101
100
  });
102
- let _ = M + T.documentElement.outerHTML;
103
- H.reverse().forEach(({ outerHtml: r, type: f, number: p }) => {
104
- let o = "";
101
+ let _ = P + g.documentElement.outerHTML;
102
+ k.reverse().forEach(({ outerHtml: r, type: f, number: p }) => {
103
+ let c = "";
105
104
  switch (f) {
106
105
  case "CART_ITEMS":
107
- o = "ins_apr_total_product_kind";
106
+ c = "ins_apr_total_product_kind";
108
107
  break;
109
108
  case "BROWSED_ITEMS":
110
- o = "browsed_item_total_product_kind";
109
+ c = "browsed_item_total_product_kind";
111
110
  break;
112
111
  case "PURCHASED_ITEMS":
113
- o = "purchased_item_total_product_kind";
112
+ c = "purchased_item_total_product_kind";
114
113
  break;
115
114
  }
116
- if (o) {
117
- const b = parseInt(p) - 1, $ = `${`{% if ${o} > ${b} %}`}${r}{% endif %}`;
115
+ if (c) {
116
+ const C = parseInt(p) - 1, $ = `${`{% if ${c} > ${C} %}`}${r}{% endif %}`;
118
117
  _ = _.replace(r, $);
119
118
  }
120
119
  });
121
- const D = T.querySelectorAll('[product-attr="originalPrice"][data-type="CART_ITEMS"]'), R = [];
122
- return D.forEach((r) => {
120
+ const L = g.querySelectorAll('[product-attr="originalPrice"][data-type="CART_ITEMS"]'), y = [];
121
+ return L.forEach((r) => {
123
122
  const f = r.getAttribute("data-number"), p = r.getAttribute("data-type");
124
123
  if (!f || p !== "CART_ITEMS")
125
124
  return;
126
- const o = r.closest(".product-original-price-class");
127
- if (o) {
128
- const A = o.outerHTML;
129
- R.some((m) => m.tdOuterHtml === A) || R.push({ tdOuterHtml: A, number: f });
125
+ const c = r.closest(".product-original-price-class");
126
+ if (c) {
127
+ const A = c.outerHTML;
128
+ y.some((R) => R.tdOuterHtml === A) || y.push({ tdOuterHtml: A, number: f });
130
129
  }
131
- }), R.reverse().forEach(({ tdOuterHtml: r, number: f }) => {
130
+ }), y.reverse().forEach(({ tdOuterHtml: r, number: f }) => {
132
131
  const p = `{% if ins_apr_price_${f} != ins_apr_originalprice_${f} %}`;
133
132
  if (!_.includes(p) && !r.includes("{% if")) {
134
133
  const A = `${p}${r}{% endif %}`;
@@ -137,5 +136,5 @@ function q(w) {
137
136
  }), _.replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("&lt;!--{%", "{%").replaceAll("%}--&gt;", "%}");
138
137
  }
139
138
  export {
140
- q as pairProductVariables
139
+ W as pairProductVariables
141
140
  };
@@ -2,16 +2,15 @@ import { useActionsApi as P } from "../composables/useActionsApi.js";
2
2
  import { useHtmlCompiler as w } from "../composables/useHtmlCompiler.js";
3
3
  import { DEFAULT_CURRENCY as l, DEFAULT_NODE_CONFIG as i } from "../extensions/Blocks/Recommendation/constants/defaultConfig.js";
4
4
  import { useRecommendationExtensionStore as b } from "../extensions/Blocks/Recommendation/store/recommendation.js";
5
- import { mapLegacyStrategy as E } from "../extensions/Blocks/Recommendation/utils/legacyStrategyMap.js";
6
5
  import { DATA_ATTRIBUTES as h } from "../extensions/Blocks/Unsubscribe/utils/constants.js";
7
- import { parsePageList as H } from "../extensions/Blocks/Unsubscribe/utils/utils.js";
8
- import { useDynamicContentStore as U } from "../stores/dynamic-content.js";
9
- import { useUnsubscribeStore as F } from "../stores/unsubscribe.js";
10
- function L(s) {
6
+ import { parsePageList as E } from "../extensions/Blocks/Unsubscribe/utils/utils.js";
7
+ import { useDynamicContentStore as H } from "../stores/dynamic-content.js";
8
+ import { useUnsubscribeStore as U } from "../stores/unsubscribe.js";
9
+ function F(s) {
11
10
  const o = new DOMParser().parseFromString(s, "text/html").querySelectorAll(`[${h.PAGE_LIST}]`), t = [];
12
- return o.forEach((a) => {
13
- const n = a.getAttribute(h.PAGE_LIST);
14
- n && t.push(...H(n));
11
+ return o.forEach((n) => {
12
+ const a = n.getAttribute(h.PAGE_LIST);
13
+ a && t.push(...E(a));
15
14
  }), [...new Set(t)];
16
15
  }
17
16
  async function R(s) {
@@ -21,8 +20,8 @@ async function R(s) {
21
20
  const o = b();
22
21
  m.forEach((t) => {
23
22
  var c, p, g, f, r;
24
- const a = t.getAttribute("recommendation-id"), n = a ? Number(a) : NaN;
25
- if (!Number.isFinite(n))
23
+ const n = t.getAttribute("recommendation-id"), a = n ? Number(n) : NaN;
24
+ if (!Number.isFinite(a))
26
25
  return;
27
26
  const d = t.getAttribute("esd-ext-config");
28
27
  if (!d)
@@ -36,10 +35,7 @@ async function R(s) {
36
35
  if (!e || typeof e != "object" || Array.isArray(e))
37
36
  return;
38
37
  const y = {
39
- // Normalize legacy strategy keys (e.g. `mostViewed` → `mostPopular`) so
40
- // already-saved blocks that never re-run the migrator don't emit a
41
- // strategy-less campaign URL. `||` also catches '' / undefined (SD-144882).
42
- strategy: E(e.strategy) || i.strategy,
38
+ strategy: e.strategy ?? i.strategy,
43
39
  language: e.language ?? i.language,
44
40
  size: e.size ?? i.size,
45
41
  // Spread the default arrays so each block gets a fresh reference
@@ -53,7 +49,7 @@ async function R(s) {
53
49
  currencyDecimalSeparator: ((f = e.currency) == null ? void 0 : f.decimalSeparator) ?? l.decimalSeparator,
54
50
  currencyThousandSeparator: ((r = e.currency) == null ? void 0 : r.thousandSeparator) ?? l.thousandSeparator
55
51
  };
56
- o.seedBlockUrlConfig(n, y);
52
+ o.seedBlockUrlConfig(a, y);
57
53
  });
58
54
  try {
59
55
  await o.fetchRecommendationCreateData();
@@ -64,8 +60,8 @@ async function R(s) {
64
60
  );
65
61
  }
66
62
  }
67
- const G = () => {
68
- const s = U(), u = F(), { getCompiledEmail: m, getTemplateData: o } = P(), { compileHtml: t, compileAmpHtml: a } = w();
63
+ const v = () => {
64
+ const s = H(), u = U(), { getCompiledEmail: m, getTemplateData: o } = P(), { compileHtml: t, compileAmpHtml: n } = w();
69
65
  return {
70
66
  prepareTemplateDetails: async () => {
71
67
  const { html: d, ampHtml: e = "", ampErrors: y = [] } = await m({
@@ -73,7 +69,7 @@ const G = () => {
73
69
  resetDataSavedFlag: !1
74
70
  }), { html: c, css: p, syncModulesIds: g = [] } = await o();
75
71
  u.selectedUnsubscribePages.length && await u.fetchTemplates(), await R(c);
76
- const { compiledHtml: f, stats: r, appliedRules: A } = t(d), C = e && a(e).compiledHtml, T = s.getSelectedDynamicContentList, D = b(), S = L(c);
72
+ const { compiledHtml: f, stats: r, appliedRules: A } = t(d), C = e && n(e).compiledHtml, T = s.getSelectedDynamicContentList, D = b(), S = F(c);
77
73
  return console.debug("HTML Compilation Stats:", {
78
74
  originalSize: r.originalSize,
79
75
  compiledSize: r.compiledSize,
@@ -101,6 +97,6 @@ const G = () => {
101
97
  };
102
98
  };
103
99
  export {
104
- L as getHtmlReferencedUnsubscribePages,
105
- G as useTemplatePreparation
100
+ F as getHtmlReferencedUnsubscribePages,
101
+ v as useTemplatePreparation
106
102
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useinsider/guido",
3
- "version": "3.9.1-beta.fdaa66f",
3
+ "version": "3.10.0-beta.06d1f41",
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
- };
@@ -1,74 +0,0 @@
1
- const t = `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
- <html>
3
-
4
- <head>
5
- <meta charset="UTF-8">
6
- <meta content="width=device-width, initial-scale=1" name="viewport">
7
- <meta name="x-apple-disable-message-reformatting">
8
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
9
- <meta content="telephone=no" name="format-detection">
10
- <title></title>
11
- <!--[if (mso 16)]><style type="text/css">a{text-decoration:none}</style><![endif]-->
12
- <!--[if gte mso 9]><style>sup{font-size:100% !important}</style><![endif]-->
13
- <!--[if gte mso 9]><style>sup{font-size:100% !important}</style><![endif]-->
14
- <!--[if gte mso 9]><style>sup{font-size:100% !important}</style><![endif]-->
15
- <!--[if gte mso 9]><style>sup{font-size:100% !important}</style><![endif]-->
16
- <!--[if gte mso 9]><style>sup { font-size: 100% !important; }</style><![endif]-->
17
- </head>
18
-
19
- <body>
20
- <div class="es-wrapper-color">
21
- <!--[if gte mso 9]>
22
- <v:background xmlns:v="urn:schemas-microsoft-com:vml" fill="t">
23
- <v:fill type="tile" color="#f6f6f6"></v:fill>
24
- </v:background>
25
- <![endif]-->
26
- <table class="es-wrapper" width="100%" cellspacing="0" cellpadding="0">
27
- <tbody>
28
- <tr>
29
- <td class="esd-email-paddings" valign="top">
30
- <table class="es-content esd-footer-popover" cellspacing="0" cellpadding="0" align="center">
31
- <tbody>
32
- <tr>
33
- <td class="esd-stripe" align="center">
34
- <table class="es-content-body" width="600" cellspacing="0" cellpadding="0" bgcolor="#ffffff" align="center">
35
- <tbody>
36
- <tr>
37
- <td class="esd-structure es-p20" align="left">
38
- <table cellpadding="0" cellspacing="0" width="100%">
39
- <tbody>
40
- <tr>
41
- <td width="560" class="esd-container-frame" align="center" valign="top">
42
- <table cellpadding="0" cellspacing="0" width="100%">
43
- <tbody>
44
- <tr>
45
- <td align="center" class="esd-empty-container" style="display: none;"></td>
46
- </tr>
47
- </tbody>
48
- </table>
49
- </td>
50
- </tr>
51
- </tbody>
52
- </table>
53
- </td>
54
- </tr>
55
- </tbody>
56
- </table>
57
- </td>
58
- </tr>
59
- </tbody>
60
- </table>
61
- </td>
62
- </tr>
63
- </tbody>
64
- </table>
65
- </div>
66
- <div style="position: absolute; left: -9999px; top: -9999px; margin: 0px;"></div>
67
- <div style="position: absolute; left: -9999px; top: -9999px; margin: 0px; padding: 0px; border: 0px none; width: 1px;"></div>
68
- </body>
69
-
70
- </html>
71
- `;
72
- export {
73
- t as default
74
- };