@useinsider/guido 2.1.0-beta.e13d291 → 2.1.0-beta.e2153c2

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 (138) hide show
  1. package/README.md +36 -0
  2. package/dist/@types/config/schemas.js +70 -65
  3. package/dist/components/Guido.vue.js +1 -1
  4. package/dist/components/Guido.vue2.js +69 -58
  5. package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue2.js +15 -14
  6. package/dist/components/organisms/header/HeaderWrapper.vue.js +9 -9
  7. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +1 -1
  8. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +19 -19
  9. package/dist/composables/useActionsApi.js +15 -13
  10. package/dist/composables/useBlocksConfig.js +26 -16
  11. package/dist/composables/useHtmlValidator.js +114 -104
  12. package/dist/composables/useRecommendation.js +54 -21
  13. package/dist/composables/useStripo.js +25 -23
  14. package/dist/composables/useVersionHistoryApi.js +1 -1
  15. package/dist/config/compiler/recommendationCompilerRules.js +45 -39
  16. package/dist/config/compiler/utils/recommendationCompilerUtils.js +121 -0
  17. package/dist/config/i18n/en/index.js +11 -0
  18. package/dist/config/i18n/en/labels.json.js +7 -0
  19. package/dist/config/i18n/en/toasters.json.js +56 -0
  20. package/dist/config/i18n/en/tooltips.json.js +82 -0
  21. package/dist/config/i18n/index.js +7 -0
  22. package/dist/config/migrator/itemsBlockMigrator.js +142 -120
  23. package/dist/enums/defaults.js +8 -4
  24. package/dist/enums/extensions/recommendationBlock.js +1 -1
  25. package/dist/enums/recommendation.js +16 -15
  26. package/dist/extensions/Blocks/Items/block.js +19 -28
  27. package/dist/extensions/Blocks/Items/controls/button/link.js +19 -31
  28. package/dist/extensions/Blocks/Items/controls/cardComposition.js +124 -85
  29. package/dist/extensions/Blocks/Items/controls/image/link.js +19 -31
  30. package/dist/extensions/Blocks/Items/controls/name/trimming.js +28 -40
  31. package/dist/extensions/Blocks/Items/controls/price/currencyLocation.js +35 -47
  32. package/dist/extensions/Blocks/Items/controls/price/currencySymbol.js +49 -54
  33. package/dist/extensions/Blocks/Items/controls/price/formattedPrice.js +42 -51
  34. package/dist/extensions/Blocks/Items/controls/price/hideDiscount.js +23 -36
  35. package/dist/extensions/Blocks/Items/controls/price/priceOrientation.js +45 -57
  36. package/dist/extensions/Blocks/Items/controls/price/singlePrice.js +42 -60
  37. package/dist/extensions/Blocks/Items/controls/settingsControl.js +189 -196
  38. package/dist/extensions/Blocks/Items/enums/settingsEnums.js +0 -2
  39. package/dist/extensions/Blocks/Items/extension.js +8 -9
  40. package/dist/extensions/Blocks/Items/settingsPanel.js +10 -15
  41. package/dist/extensions/Blocks/Items/template.js +181 -175
  42. package/dist/extensions/Blocks/Items/utils/nodeConfigUtils.js +65 -65
  43. package/dist/extensions/Blocks/Recommendation/block.js +117 -27
  44. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +33 -31
  45. package/dist/extensions/Blocks/Recommendation/constants/layout.js +6 -4
  46. package/dist/extensions/Blocks/Recommendation/constants/selectors.js +12 -10
  47. package/dist/extensions/Blocks/Recommendation/controls/layout/index.js +10 -14
  48. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +19 -27
  49. package/dist/extensions/Blocks/Recommendation/controls/main/currency.js +49 -44
  50. package/dist/extensions/Blocks/Recommendation/controls/main/filters.js +1 -3
  51. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +147 -102
  52. package/dist/extensions/Blocks/Recommendation/controls/main/locale.js +1 -5
  53. package/dist/extensions/Blocks/Recommendation/controls/main/productLayout.js +85 -43
  54. package/dist/extensions/Blocks/Recommendation/controls/main/shuffle.js +9 -13
  55. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +138 -117
  56. package/dist/extensions/Blocks/Recommendation/controls/mobileLayout/cssRules.js +21 -0
  57. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +66 -34
  58. package/dist/extensions/Blocks/Recommendation/controls/spacing/index.js +2 -2
  59. package/dist/extensions/Blocks/Recommendation/services/configService.js +2 -1
  60. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +248 -206
  61. package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +26 -31
  62. package/dist/extensions/Blocks/Recommendation/templates/grid/migration.js +1 -1
  63. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +31 -34
  64. package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +20 -25
  65. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +22 -22
  66. package/dist/extensions/Blocks/Recommendation/templates/utils.js +52 -39
  67. package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +10 -10
  68. package/dist/extensions/Blocks/Unsubscribe/block.js +29 -29
  69. package/dist/extensions/Blocks/Unsubscribe/control.js +12 -9
  70. package/dist/extensions/Blocks/Unsubscribe/elements/preview.js +13 -11
  71. package/dist/extensions/Blocks/Unsubscribe/styles.css.js +31 -1
  72. package/dist/extensions/Blocks/common-control.js +91 -92
  73. package/dist/extensions/ModulesTabIcons/extension.js +17 -0
  74. package/dist/guido.css +1 -1
  75. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +257 -187
  76. package/dist/package.json.js +1 -1
  77. package/dist/services/recommendationApi.js +11 -9
  78. package/dist/services/stripoApi.js +20 -17
  79. package/dist/services/templateLibraryApi.js +16 -13
  80. package/dist/src/@types/config/schemas.d.ts +8 -0
  81. package/dist/src/composables/useConfig.d.ts +4 -0
  82. package/dist/src/composables/useRecommendation.d.ts +1 -0
  83. package/dist/src/config/compiler/utils/recommendationCompilerUtils.d.ts +17 -0
  84. package/dist/src/config/i18n/en/index.d.ts +1 -0
  85. package/dist/src/config/i18n/index.d.ts +16 -0
  86. package/dist/src/enums/defaults.d.ts +4 -0
  87. package/dist/src/extensions/Blocks/Items/block.d.ts +0 -1
  88. package/dist/src/extensions/Blocks/Items/controls/button/link.d.ts +0 -1
  89. package/dist/src/extensions/Blocks/Items/controls/cardComposition.d.ts +5 -5
  90. package/dist/src/extensions/Blocks/Items/controls/image/link.d.ts +0 -1
  91. package/dist/src/extensions/Blocks/Items/controls/name/trimming.d.ts +0 -1
  92. package/dist/src/extensions/Blocks/Items/controls/price/currencyLocation.d.ts +0 -1
  93. package/dist/src/extensions/Blocks/Items/controls/price/currencySymbol.d.ts +0 -1
  94. package/dist/src/extensions/Blocks/Items/controls/price/formattedPrice.d.ts +0 -1
  95. package/dist/src/extensions/Blocks/Items/controls/price/hideDiscount.d.ts +0 -1
  96. package/dist/src/extensions/Blocks/Items/controls/price/priceOrientation.d.ts +0 -1
  97. package/dist/src/extensions/Blocks/Items/controls/price/singlePrice.d.ts +0 -5
  98. package/dist/src/extensions/Blocks/Items/controls/settingsControl.d.ts +10 -12
  99. package/dist/src/extensions/Blocks/Items/utils/nodeConfigUtils.d.ts +2 -1
  100. package/dist/src/extensions/Blocks/Recommendation/block.d.ts +44 -11
  101. package/dist/src/extensions/Blocks/Recommendation/constants/index.d.ts +2 -2
  102. package/dist/src/extensions/Blocks/Recommendation/constants/layout.d.ts +6 -0
  103. package/dist/src/extensions/Blocks/Recommendation/constants/selectors.d.ts +4 -0
  104. package/dist/src/extensions/Blocks/Recommendation/controls/main/currency.d.ts +8 -1
  105. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +27 -5
  106. package/dist/src/extensions/Blocks/Recommendation/controls/main/productLayout.d.ts +22 -4
  107. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.d.ts +9 -2
  108. package/dist/src/extensions/Blocks/Recommendation/controls/mobileLayout/cssRules.d.ts +29 -0
  109. package/dist/src/extensions/Blocks/Recommendation/controls/name/textTrim.d.ts +19 -1
  110. package/dist/src/extensions/Blocks/Recommendation/controls/spacing/index.d.ts +2 -2
  111. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +138 -469
  112. package/dist/src/extensions/Blocks/Recommendation/templates/grid/elementRenderer.d.ts +2 -2
  113. package/dist/src/extensions/Blocks/Recommendation/templates/grid/template.d.ts +4 -4
  114. package/dist/src/extensions/Blocks/Recommendation/templates/index.d.ts +2 -0
  115. package/dist/src/extensions/Blocks/Recommendation/templates/list/elementRenderer.d.ts +2 -2
  116. package/dist/src/extensions/Blocks/Recommendation/templates/list/template.d.ts +2 -2
  117. package/dist/src/extensions/Blocks/Recommendation/templates/utils.d.ts +16 -4
  118. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +14 -2
  119. package/dist/src/extensions/Blocks/Recommendation/utils/stylePreserver.d.ts +1 -1
  120. package/dist/src/extensions/Blocks/Unsubscribe/control.d.ts +1 -0
  121. package/dist/src/extensions/Blocks/common-control.d.ts +4 -5
  122. package/dist/src/extensions/ModulesTabIcons/extension.d.ts +2 -0
  123. package/dist/src/stores/config.d.ts +36 -0
  124. package/dist/static/styles/components/notification.css.js +19 -0
  125. package/dist/static/styles/components/tools.css.js +6 -2
  126. package/dist/static/styles/components/version-history.css.js +10 -2
  127. package/dist/static/styles/components/wide-panel.css.js +18 -2
  128. package/dist/static/styles/customEditorStyle.css.js +10 -9
  129. package/dist/static/styles/variables.css.js +2 -0
  130. package/dist/static/templates/empty/index.html.js +74 -0
  131. package/dist/static/templates/empty/style.css.js +779 -0
  132. package/dist/stores/unsubscribe.js +37 -34
  133. package/dist/utils/pairProductVariables.js +57 -56
  134. package/dist/utils/templatePreparation.js +15 -14
  135. package/package.json +2 -2
  136. package/dist/extensions/Blocks/Items/store/items-block.js +0 -79
  137. package/dist/src/extensions/Blocks/Items/store/items-block.d.ts +0 -45
  138. package/dist/src/extensions/Blocks/Recommendation/controls/nameTextTrimControl.d.ts +0 -16
@@ -1,4 +1,4 @@
1
- const o = { stripo: { version: "2.52.0" } }, s = {
1
+ const o = { stripo: { version: "2.54.0" } }, s = {
2
2
  guido: o
3
3
  };
4
4
  export {
@@ -1,7 +1,7 @@
1
- import { useHttp as a } from "../composables/useHttp.js";
2
- import { URLS as s } from "../enums/extensions/recommendationBlock.js";
3
- const u = () => {
4
- const { get: o } = a();
1
+ import { useHttp as c } from "../composables/useHttp.js";
2
+ import { URLS as m } from "../enums/extensions/recommendationBlock.js";
3
+ const f = () => {
4
+ const { get: o } = c();
5
5
  return {
6
6
  fetchRecommendationCreateData: async () => {
7
7
  try {
@@ -18,13 +18,15 @@ const u = () => {
18
18
  throw console.error("fetchRecommendationFilters error:", e), e;
19
19
  }
20
20
  },
21
- fetchRecommendationProducts: async (e, c) => {
21
+ fetchRecommendationProducts: async (e, a) => {
22
22
  var n;
23
23
  try {
24
- const t = decodeURIComponent(new URLSearchParams(Object.entries(c)).toString());
24
+ const t = decodeURIComponent(new URLSearchParams(Object.entries(a)).toString());
25
25
  console.debug("🏁 Recommendation API Query:", t);
26
- const r = await o(
27
- `${s.RECOMMENDATION_API_URL}/v2/${e}?${t}`
26
+ const { get: s } = c({
27
+ headers: {}
28
+ }), r = await s(
29
+ `${m.RECOMMENDATION_API_URL}/v2/${e}?${t}`
28
30
  );
29
31
  return ((n = r == null ? void 0 : r.data) == null ? void 0 : n.data) ?? [];
30
32
  } catch (t) {
@@ -34,5 +36,5 @@ const u = () => {
34
36
  };
35
37
  };
36
38
  export {
37
- u as useRecommendationApi
39
+ f as useRecommendationApi
38
40
  };
@@ -1,44 +1,47 @@
1
- import { useHttp as m } from "../composables/useHttp.js";
2
- import { useToaster as i } from "../composables/useToaster.js";
3
- import { MAX_DEFAULT_TEMPLATE_ID as p } from "../enums/defaults.js";
4
- const y = () => {
5
- const { get: r } = m(), { handleError: o } = i();
1
+ import { useHttp as l } from "../composables/useHttp.js";
2
+ import { useToaster as u } from "../composables/useToaster.js";
3
+ import { MAX_DEFAULT_TEMPLATE_ID as d } from "../enums/defaults.js";
4
+ import f from "../static/templates/empty/index.html.js";
5
+ import g from "../static/templates/empty/style.css.js";
6
+ const D = () => {
7
+ const { get: o } = l(), { handleError: a } = u();
6
8
  return {
7
9
  getToken: async () => {
8
10
  try {
9
- const t = Number(localStorage.getItem("ins-guido-test-instance")), { data: e } = await r(`/stripo/get-user-token?test=${t}`);
11
+ const t = Number(localStorage.getItem("ins-guido-test-instance")), { data: e } = await o(`/stripo/get-user-token?test=${t}`);
10
12
  return e.body.token;
11
13
  } catch (t) {
12
- return o(t, "Failed to fetch token"), "";
14
+ return a(t, "Failed to fetch token"), "";
13
15
  }
14
16
  },
15
17
  getCustomFonts: async () => {
16
18
  try {
17
- const { data: t = [] } = await r("/stripo/get-partner-custom-fonts");
19
+ const { data: t = [] } = await o("/stripo/get-partner-custom-fonts");
18
20
  return t.map((e) => ({
19
21
  ...e,
20
22
  active: !0
21
23
  }));
22
24
  } catch (t) {
23
- return o(t, "Failed to fetch custom fonts"), [];
25
+ return a(t, "Failed to fetch custom fonts"), [];
24
26
  }
25
27
  },
26
28
  getDefaultTemplate: async () => {
27
29
  const t = {
28
- html: "",
29
- css: ""
30
+ html: f,
31
+ css: g
30
32
  };
31
33
  try {
32
- const c = new URLSearchParams(window.location.search).get("default-template"), s = c ? parseInt(c) : 0, l = s >= 1 && s <= p ? s : 0, { data: n } = await r(
33
- `/stripo/default-template/${l}`
34
- ), a = typeof n == "string" ? JSON.parse(n) : n;
35
- return !a || typeof a != "object" || !("html" in a) || !("css" in a) ? t : a;
34
+ const e = new URLSearchParams(window.location.search), c = e.get("default-template"), p = e.get("master"), s = c ? parseInt(c) : 0, m = s >= 1 && s <= d ? s : 0;
35
+ if (!m && !p)
36
+ return t;
37
+ const i = `/stripo/default-template/${m}`, { data: n } = await o(i), r = typeof n == "string" ? JSON.parse(n) : n;
38
+ return !r || typeof r != "object" || !("html" in r) || !("css" in r) ? t : r;
36
39
  } catch (e) {
37
- return o(e, "Failed to fetch default template"), t;
40
+ return a(e, "Failed to fetch default template"), t;
38
41
  }
39
42
  }
40
43
  };
41
44
  };
42
45
  export {
43
- y as useStripoApi
46
+ D as useStripoApi
44
47
  };
@@ -3,29 +3,30 @@ import { useHttp as f } from "../composables/useHttp.js";
3
3
  import { useToaster as w } from "../composables/useToaster.js";
4
4
  import { useTranslations as b } from "../composables/useTranslations.js";
5
5
  import { EditorType as h } from "../enums/defaults.js";
6
- import { useSaveAsTemplateStore as C } from "../stores/save-as-template.js";
6
+ import { useRecommendationExtensionStore as C } from "../extensions/Blocks/Recommendation/store/recommendation.js";
7
+ import { useSaveAsTemplateStore as v } from "../stores/save-as-template.js";
7
8
  import { base64EncodeWithSpecialChars as a } from "../utils/base64.js";
8
- import { useTemplatePreparation as v } from "../utils/templatePreparation.js";
9
- const L = () => {
10
- const { get: m, post: n } = f(), { handleError: o, showToaster: i } = w(), { config: l } = T(), p = b();
9
+ import { useTemplatePreparation as S } from "../utils/templatePreparation.js";
10
+ const R = () => {
11
+ const { get: n, post: c } = f(), { handleError: o, showToaster: i } = w(), { config: l } = T(), p = b();
11
12
  return {
12
13
  getCategories: async () => {
13
14
  try {
14
- const { data: e = [] } = await m("/newsletter/template-library/get-template-categories");
15
+ const { data: e = [] } = await n("/newsletter/template-library/get-template-categories");
15
16
  return e;
16
17
  } catch (e) {
17
18
  return o(e, "Failed to fetch template categories"), [];
18
19
  }
19
20
  },
20
21
  checkTemplateNameAvailability: async (e) => {
21
- const { data: { status: t = !1 } } = await m(
22
+ const { data: { status: t = !1 } } = await n(
22
23
  `/newsletter/template-library/template-name-exists?name=${e}`
23
24
  );
24
25
  return !t;
25
26
  },
26
27
  createCategory: async (e) => {
27
28
  try {
28
- const { data: { id: t } } = await n(
29
+ const { data: { id: t } } = await c(
29
30
  "/newsletter/template-library/create-category",
30
31
  { name: e }
31
32
  );
@@ -37,7 +38,7 @@ const L = () => {
37
38
  createTemplate: async () => {
38
39
  var e, t, g, y;
39
40
  try {
40
- const { prepareTemplateDetails: c } = v(), r = C(), s = await c(), u = {
41
+ const { prepareTemplateDetails: m } = S(), r = v(), s = await m(), u = {
41
42
  name: r.getTemplateName,
42
43
  categories: r.getSelectedCategoryIds,
43
44
  productId: ((t = (e = l.value) == null ? void 0 : e.partner) == null ? void 0 : t.productType) || 0,
@@ -47,7 +48,9 @@ const L = () => {
47
48
  css: a(s.css),
48
49
  unsubscriptionPreferencePageStatus: !1,
49
50
  unsubscriptionPreferencePages: [],
50
- recommendationCampaignUrls: a({}),
51
+ recommendationCampaignUrls: a(
52
+ C().recommendationCampaignUrls
53
+ ),
51
54
  recommendationConfigs: a({}),
52
55
  isGuido: !0,
53
56
  stripoConfig: a({
@@ -55,7 +58,7 @@ const L = () => {
55
58
  html: s.rawHtml,
56
59
  css: s.css
57
60
  })
58
- }, { data: { type: d } } = await n(
61
+ }, { data: { type: d } } = await c(
59
62
  "/newsletter/template-library/create-template",
60
63
  u
61
64
  );
@@ -76,12 +79,12 @@ const L = () => {
76
79
  ),
77
80
  type: "success"
78
81
  });
79
- } catch (c) {
80
- o(c, "Failed to create template");
82
+ } catch (m) {
83
+ o(m, "Failed to create template");
81
84
  }
82
85
  }
83
86
  };
84
87
  };
85
88
  export {
86
- L as useTemplateLibraryApi
89
+ R as useTemplateLibraryApi
87
90
  };
@@ -129,6 +129,10 @@ export declare const EditorSchema: v.ObjectSchema<{
129
129
  readonly senderName: "";
130
130
  readonly subject: "";
131
131
  }>;
132
+ /** Folder name for user-saved modules (used by Stripo plugin panel for path construction) */
133
+ readonly savedModulesFolderName: v.OptionalSchema<v.StringSchema<undefined>, "savedModules">;
134
+ /** Folder name for default/prebuilt modules (used by Stripo plugin panel for path construction) */
135
+ readonly defaultModulesFolderName: v.OptionalSchema<v.StringSchema<undefined>, "defaultModules">;
132
136
  }, undefined>;
133
137
  /**
134
138
  * UI configuration - visual elements and layout
@@ -441,6 +445,10 @@ export declare const GuidoConfigSchema: v.ObjectSchema<{
441
445
  readonly senderName: "";
442
446
  readonly subject: "";
443
447
  }>;
448
+ /** Folder name for user-saved modules (used by Stripo plugin panel for path construction) */
449
+ readonly savedModulesFolderName: v.OptionalSchema<v.StringSchema<undefined>, "savedModules">;
450
+ /** Folder name for default/prebuilt modules (used by Stripo plugin panel for path construction) */
451
+ readonly defaultModulesFolderName: v.OptionalSchema<v.StringSchema<undefined>, "defaultModules">;
444
452
  }, undefined>, {}>;
445
453
  /** UI configuration */
446
454
  readonly ui: v.OptionalSchema<v.ObjectSchema<{
@@ -41,6 +41,8 @@ export declare const useConfig: () => {
41
41
  senderName: string;
42
42
  subject: string;
43
43
  };
44
+ savedModulesFolderName: string;
45
+ defaultModulesFolderName: string;
44
46
  };
45
47
  ui: {
46
48
  showHeader: boolean;
@@ -130,6 +132,8 @@ export declare const useConfig: () => {
130
132
  senderName: string;
131
133
  subject: string;
132
134
  };
135
+ savedModulesFolderName: string;
136
+ defaultModulesFolderName: string;
133
137
  } | null>;
134
138
  ui: import("vue").ComputedRef<{
135
139
  showHeader: boolean;
@@ -15,5 +15,6 @@ interface CampaignData extends CardWidthParams {
15
15
  export declare const useRecommendation: () => {
16
16
  calculateCardWidth: ({ mobileLeftPadding, mobileRightPadding, cardsInRow, unresponsive, }: CardWidthParams) => number;
17
17
  getRecommendationCampaignData: (id: string) => CampaignData;
18
+ buildCampaignUrl: (campaignId: string) => string;
18
19
  };
19
20
  export {};
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Formats a price template variable with the correct currency alignment.
3
+ * @param campaignId - The recommendation block campaign ID
4
+ * @param productIndex - Zero-based product index
5
+ * @param attribute - Price attribute name (e.g., 'price', 'original_price')
6
+ * @param alignment - Currency alignment from block config: 'before' or 'after'
7
+ * @returns Formatted price string with currency variable in correct position
8
+ */
9
+ export declare function formatPriceVariable(campaignId: string, productIndex: number, attribute: string, alignment: string): string;
10
+ /**
11
+ * Transforms recommendation block HTML by replacing product data with
12
+ * template variables.
13
+ * Preserves the full document structure (DOCTYPE, html, head, body).
14
+ * @param html - The raw template HTML
15
+ * @returns HTML with template variables replacing product data
16
+ */
17
+ export declare function prepareRecommendationBlocks(html: string): string;
@@ -0,0 +1 @@
1
+ export declare const en: Record<string, string>;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Stripo Editor Translation Overrides
3
+ *
4
+ * Custom translations for Stripo editor UI elements.
5
+ * Each language has its own folder with categorized JSON files.
6
+ *
7
+ * Reference: https://email-static.useinsider.com/guido/{version}/assets/i18n/en.json
8
+ * @module config/i18n
9
+ */
10
+ /**
11
+ * Combined locale patch for Stripo editor initialization.
12
+ * Maps language codes to their translation overrides.
13
+ */
14
+ export declare const localePatch: {
15
+ en: Record<string, string>;
16
+ };
@@ -9,3 +9,7 @@ export declare const TemplateTypes: {
9
9
  export declare const EditorType: number;
10
10
  export declare const MAX_DEFAULT_TEMPLATE_ID = 13;
11
11
  export declare const ProductIds: Record<string, number>;
12
+ export declare const ModuleFolderDefaults: {
13
+ readonly SAVED_MODULES: "savedModules";
14
+ readonly DEFAULT_MODULES: "defaultModules";
15
+ };
@@ -23,5 +23,4 @@ export declare class ItemsBlock extends Block {
23
23
  getTemplate(): string;
24
24
  allowInnerBlocksDND(): boolean;
25
25
  onCreated(node: ImmutableHtmlNode): void;
26
- onSelect(node: ImmutableHtmlNode): void;
27
26
  }
@@ -3,7 +3,6 @@ import { CommonControl } from '../../../common-control';
3
3
  import { ItemsBlockControlId } from '../../enums/controlEnums';
4
4
  export declare const CONTROL_BLOCK_ID = ItemsBlockControlId.BUTTON_LINK;
5
5
  export declare class ButtonLinkControl extends CommonControl {
6
- private store;
7
6
  getId(): string;
8
7
  getTemplate(): string;
9
8
  onRender(): void;
@@ -2,7 +2,6 @@ import { ImmutableHtmlNode } from '@stripoinc/ui-editor-extensions';
2
2
  import { CommonControl } from '../../common-control';
3
3
  export declare const COMPOSITION_CONTROL_BLOCK_ID = "ui-elements-items-card-composition-block";
4
4
  export declare class ItemsBlockCardCompositionControl extends CommonControl {
5
- private store;
6
5
  private visibilityState;
7
6
  getId(): string;
8
7
  getTemplate(): string;
@@ -19,10 +18,11 @@ export declare class ItemsBlockCardCompositionControl extends CommonControl {
19
18
  * If itemsType is not BROWSED_ITEMS, show quantity
20
19
  * If itemsType is BROWSED_ITEMS, hide quantity
21
20
  * and mark it as '0'
21
+ * @param syncOnly - If true, only sync local state and UI without modifying the document
22
22
  */
23
- _handleBrowsedItemsQuantity(): void;
24
- _applyVisibilityStyles(): void;
25
- _updateVisibilityAttribute(elementName: string, isVisible: boolean): void;
23
+ _handleBrowsedItemsQuantity(syncOnly?: boolean): void;
24
+ _applyVisibilityStyles(modifier?: ReturnType<typeof this.api.getDocumentModifier>): void;
25
+ _updateVisibilityAttribute(elementName: string, isVisible: boolean, modifier?: ReturnType<typeof this.api.getDocumentModifier>): void;
26
26
  _listenToFormUpdates(): void;
27
27
  _onProductImageChange(value: boolean): void;
28
28
  _onProductNameChange(value: boolean): void;
@@ -37,6 +37,6 @@ export declare class ItemsBlockCardCompositionControl extends CommonControl {
37
37
  * - When price is hidden, original price cell expands to 100%
38
38
  * - When both are visible, they share 50% each
39
39
  */
40
- _updatePriceCellWidthsForVerticalLayout(): void;
40
+ _updatePriceCellWidthsForVerticalLayout(modifier?: ReturnType<typeof this.api.getDocumentModifier>): void;
41
41
  _onProductButtonChange(value: boolean): void;
42
42
  }
@@ -3,7 +3,6 @@ import { CommonControl } from '../../../common-control';
3
3
  import { ItemsBlockControlId } from '../../enums/controlEnums';
4
4
  export declare const CONTROL_BLOCK_ID = ItemsBlockControlId.IMAGE_LINK;
5
5
  export declare class ImageLinkControl extends CommonControl {
6
- private store;
7
6
  getId(): string;
8
7
  getTemplate(): string;
9
8
  onRender(): void;
@@ -3,7 +3,6 @@ import { CommonControl } from '../../../common-control';
3
3
  import { ItemsBlockControlId } from '../../enums/controlEnums';
4
4
  export declare const CONTROL_BLOCK_ID = ItemsBlockControlId.NAME_TRIMMING;
5
5
  export declare class NameTrimmingControl extends CommonControl {
6
- private store;
7
6
  getId(): string;
8
7
  getTemplate(): string;
9
8
  onRender(): void;
@@ -3,7 +3,6 @@ import { CommonControl } from '../../../common-control';
3
3
  import { ItemsBlockControlId } from '../../enums/controlEnums';
4
4
  export declare const CONTROL_BLOCK_ID = ItemsBlockControlId.PRICE_CURRENCY_LOCATION;
5
5
  export declare class PriceCurrencyLocationControl extends CommonControl {
6
- private store;
7
6
  getId(): string;
8
7
  getTemplate(): string;
9
8
  onRender(): void;
@@ -3,7 +3,6 @@ import { CommonControl } from '../../../common-control';
3
3
  import { ItemsBlockControlId } from '../../enums/controlEnums';
4
4
  export declare const CONTROL_BLOCK_ID = ItemsBlockControlId.PRICE_CURRENCY_SYMBOL;
5
5
  export declare class PriceCurrencySymbolControl extends CommonControl {
6
- private store;
7
6
  private originalPriceContents;
8
7
  getId(): string;
9
8
  getTemplate(): string;
@@ -3,7 +3,6 @@ import { CommonControl } from '../../../common-control';
3
3
  import { ItemsBlockControlId } from '../../enums/controlEnums';
4
4
  export declare const CONTROL_BLOCK_ID = ItemsBlockControlId.PRICE_FORMATTED_PRICE;
5
5
  export declare class PriceFormattedPriceControl extends CommonControl {
6
- private store;
7
6
  getId(): string;
8
7
  getTemplate(): string;
9
8
  onRender(): void;
@@ -3,7 +3,6 @@ import { CommonControl } from '../../../common-control';
3
3
  import { ItemsBlockControlId } from '../../enums/controlEnums';
4
4
  export declare const CONTROL_BLOCK_ID = ItemsBlockControlId.PRICE_HIDE_DISCOUNT;
5
5
  export declare class PriceHideDiscountControl extends CommonControl {
6
- private store;
7
6
  getId(): string;
8
7
  getTemplate(): string;
9
8
  onRender(): void;
@@ -3,7 +3,6 @@ import { CommonControl } from '../../../common-control';
3
3
  import { ItemsBlockControlId } from '../../enums/controlEnums';
4
4
  export declare const CONTROL_BLOCK_ID = ItemsBlockControlId.PRICE_ORIENTATION;
5
5
  export declare class PriceOrientationControl extends CommonControl {
6
- private store;
7
6
  getId(): string;
8
7
  getTemplate(): string;
9
8
  onRender(): void;
@@ -3,15 +3,10 @@ import { CommonControl } from '../../../common-control';
3
3
  import { ItemsBlockControlId } from '../../enums/controlEnums';
4
4
  export declare const CONTROL_BLOCK_ID = ItemsBlockControlId.PRICE_SINGLE_PRICE;
5
5
  export declare class PriceSinglePriceControl extends CommonControl {
6
- private store;
7
6
  getId(): string;
8
7
  getTemplate(): string;
9
8
  onRender(): void;
10
9
  onTemplateNodeUpdated(node: ImmutableHtmlNode): void;
11
- /**
12
- * Syncs single price state from nodeConfig.
13
- */
14
- private _syncSinglePriceFromNodeConfig;
15
10
  _onSinglePriceChange(value: boolean): void;
16
11
  private _updatePriceBlock;
17
12
  _getSinglePrice(): string;
@@ -3,12 +3,10 @@ import { ImmutableHtmlNode } from '@stripoinc/ui-editor-extensions';
3
3
  import { CommonControl } from '../../common-control';
4
4
  export declare const CONTROL_BLOCK_ID = "ui-elements-items-block";
5
5
  export declare class ItemsBlockControl extends CommonControl {
6
- private store;
7
6
  getId(): string;
8
7
  getTemplate(): string;
9
8
  onRender(): void;
10
9
  onTemplateNodeUpdated(node: ImmutableHtmlNode): void;
11
- onDestroy(): void;
12
10
  _getItemsType(): string;
13
11
  _getOrientation(): string;
14
12
  _getItemInCart(): string;
@@ -18,7 +16,7 @@ export declare class ItemsBlockControl extends CommonControl {
18
16
  _initializeSelectItems(): void;
19
17
  _listenToFormUpdates(): void;
20
18
  _renderTemplate(): void;
21
- _getTemplateData(): {
19
+ _getTemplateData(itemsTypeOverride?: ProductType, itemIdOverride?: string): {
22
20
  imageSrc: string;
23
21
  name: string;
24
22
  price: string;
@@ -26,15 +24,15 @@ export declare class ItemsBlockControl extends CommonControl {
26
24
  quantity: string;
27
25
  button: string;
28
26
  };
29
- _updateImageSrc(imageSrc: string): void;
30
- _updateName(name: string): void;
31
- _updatePrice(price: string): void;
32
- _updateOriginalPrice(originalPrice: string): void;
33
- _updateQuantity(quantity: string): void;
34
- _reOrderTemplate(): void;
35
- _updateDataTypeAttributes(itemsType: ProductType): void;
36
- _updateDataNumberAttributes(itemId: string): void;
37
- _reFillTemplate(): void;
27
+ _updateImageSrc(imageSrc: string, modifier: ReturnType<typeof this.api.getDocumentModifier>): void;
28
+ _updateName(name: string, modifier: ReturnType<typeof this.api.getDocumentModifier>): void;
29
+ _updatePrice(price: string, modifier: ReturnType<typeof this.api.getDocumentModifier>): void;
30
+ _updateOriginalPrice(originalPrice: string, modifier: ReturnType<typeof this.api.getDocumentModifier>): void;
31
+ _updateQuantity(quantity: string, itemsTypeOverride: ProductType | undefined, modifier: ReturnType<typeof this.api.getDocumentModifier>): void;
32
+ _reOrderTemplate(modifier?: ReturnType<typeof this.api.getDocumentModifier>): void;
33
+ _updateDataTypeAttributes(itemsType: ProductType, modifier: ReturnType<typeof this.api.getDocumentModifier>): void;
34
+ _updateDataNumberAttributes(itemId: string, modifier: ReturnType<typeof this.api.getDocumentModifier>): void;
35
+ _reFillTemplate(itemsType?: ProductType): void;
38
36
  _recalculateTrimming(): void;
39
37
  private _getParagraphFromBlock;
40
38
  private _escapeRegex;
@@ -66,8 +66,9 @@ export declare function getItemsBlockConfig(currentNode: ImmutableHtmlNode | und
66
66
  * @param currentNode - The current node from the control
67
67
  * @param api - The API object (ControlApi or BlockApi)
68
68
  * @param config - The configuration to set (partial update supported)
69
+ * @param modifier - Optional document modifier for batching updates
69
70
  */
70
- export declare function setItemsBlockConfig(currentNode: ImmutableHtmlNode | undefined, api: ControlApi | BlockApi, config: Partial<ItemsBlockConfig>): void;
71
+ export declare function setItemsBlockConfig(currentNode: ImmutableHtmlNode | undefined, api: ControlApi | BlockApi, config: Partial<ItemsBlockConfig>, modifier?: ReturnType<typeof api.getDocumentModifier>): void;
71
72
  /**
72
73
  * Gets the block instance ID from the node config.
73
74
  * @param currentNode - The current node from the control
@@ -3,43 +3,76 @@
3
3
  *
4
4
  * Main block class for the Recommendation extension.
5
5
  * Handles block lifecycle including configuration initialization and migration.
6
+ * Supports multiple block instances with unique recommendation-id attributes.
6
7
  */
7
8
  import type { ImmutableHtmlNode } from '@stripoinc/ui-editor-extensions';
8
9
  import { Block, BlockCompositionType } from '@stripoinc/ui-editor-extensions';
9
10
  export declare const BLOCK_ID = "recommendation-block";
10
11
  export declare class RecommendationBlock extends Block {
12
+ /**
13
+ * Stores the ID generated in getTemplate() so onCreated() can reuse it.
14
+ * This avoids generating a new (different) ID in onCreated().
15
+ */
16
+ private _pendingBlockId;
11
17
  constructor();
12
18
  getId(): string;
13
19
  getIcon(): string;
14
20
  getBlockCompositionType(): BlockCompositionType;
15
21
  getName(): string;
16
22
  getDescription(): string;
23
+ /**
24
+ * Returns the template HTML for a new recommendation block.
25
+ * Generates a unique recommendation ID and embeds the instance class
26
+ * (ins-recommendation-v3-block-{id}) directly in the template HTML.
27
+ * This is necessary because Stripo's Angular rendering manages the class
28
+ * attribute and overwrites dynamically added classes via setAttribute.
29
+ */
17
30
  getTemplate(): string;
18
31
  /**
19
32
  * Called when a new block is dropped into the template
20
33
  *
21
- * Initializes the block with default configuration stored via node config.
22
- * This ensures the configuration persists with the template.
34
+ * Uses the ID from getTemplate() (which already embedded the instance class)
35
+ * and assigns the recommendation-id attribute + initializes configuration.
23
36
  * @param node - The newly created block node
24
37
  */
25
38
  onCreated(node: ImmutableHtmlNode): void;
26
39
  /**
27
40
  * Called when the document changes or template is loaded
28
41
  *
29
- * Handles migration from legacy templates that don't have node config.
30
- * Also handles config version upgrades for future migrations.
42
+ * Handles migration from legacy templates that don't have node config
43
+ * and assigns recommendation-id to legacy blocks that lack one.
31
44
  * @param node - The block node that may need migration
32
45
  */
33
46
  onDocumentChanged(node: ImmutableHtmlNode): void;
34
47
  /**
35
- * Migrate configuration from legacy format
48
+ * Called when a block is deleted from the template
36
49
  *
37
- * Legacy templates may store configuration in:
38
- * - data-attributes (data-layout, data-card-composition, etc.)
39
- * - Pinia store (lost on reload - this is what we're fixing)
40
- *
41
- * This method reads what we can from the DOM and initializes proper node config.
42
- * @param node - The block node to migrate
50
+ * Cleans up the per-block state from the Pinia store.
51
+ * @param node - The block node being deleted
52
+ */
53
+ onDelete(node: ImmutableHtmlNode): void;
54
+ /**
55
+ * Generates the next unique recommendation ID by scanning all existing blocks
56
+ * in the document and finding the maximum existing ID + 1.
57
+ */
58
+ private _generateNextId;
59
+ /**
60
+ * Assigns a recommendation-id attribute to the block element.
61
+ * The instance class (ins-recommendation-v3-block-{id}) is embedded in the template
62
+ * HTML by getTemplate(), since Stripo's Angular rendering overwrites dynamically
63
+ * added classes via setAttribute.
64
+ */
65
+ private _assignRecommendationId;
66
+ /**
67
+ * Gets the recommendation-id from a block node
68
+ */
69
+ private _getRecommendationId;
70
+ /**
71
+ * Gets the block element (the element with BLOCK_CLASS)
72
+ */
73
+ private _getBlockElement;
74
+ /**
75
+ * Migrate configuration from legacy format
43
76
  */
44
77
  private _migrateFromLegacy;
45
78
  }
@@ -8,6 +8,6 @@
8
8
  */
9
9
  export { RecommendationBlockId } from './blockIds';
10
10
  export { RecommendationControlId } from './controlIds';
11
- export { CONTAINER_SELECTOR, CURRENCY_ATTR, ATTR_PRODUCT_IMAGE, ATTR_PRODUCT_NAME, ATTR_PRODUCT_PRICE, ATTR_PRODUCT_OLD_PRICE, ATTR_PRODUCT_OMNIBUS_PRICE, ATTR_PRODUCT_OMNIBUS_DISCOUNT, ATTR_PRODUCT_BUTTON, } from './selectors';
12
- export { LAYOUT_VALUES, LAYOUT_OPTIONS, DEFAULT_PRODUCTS_PER_ROW, DEFAULT_CARDS_IN_ROW, MAX_PRODUCT_COUNT, MIN_PRODUCT_COUNT, MAX_PRODUCTS_PER_ROW, MIN_PRODUCTS_PER_ROW, DEFAULT_COLUMN_SPACING, DEFAULT_ROW_SPACING, MIN_SPACING, MAX_SPACING, SPACING_STEP, } from './layout';
11
+ export { CONTAINER_SELECTOR, DESKTOP_CONTAINER_SELECTOR, MOBILE_CONTAINER_SELECTOR, CURRENCY_ATTR, ATTR_PRODUCT_IMAGE, ATTR_PRODUCT_NAME, ATTR_PRODUCT_PRICE, ATTR_PRODUCT_OLD_PRICE, ATTR_PRODUCT_OMNIBUS_PRICE, ATTR_PRODUCT_OMNIBUS_DISCOUNT, ATTR_PRODUCT_BUTTON, } from './selectors';
12
+ export { LAYOUT_VALUES, LAYOUT_OPTIONS, DEFAULT_PRODUCTS_PER_ROW, DEFAULT_CARDS_IN_ROW, DEFAULT_MOBILE_CARDS_IN_ROW, MAX_PRODUCT_COUNT, MIN_PRODUCT_COUNT, MAX_PRODUCTS_PER_ROW, MIN_PRODUCTS_PER_ROW, MAX_MOBILE_PRODUCTS_PER_ROW, MIN_MOBILE_PRODUCTS_PER_ROW, DEFAULT_COLUMN_SPACING, DEFAULT_ROW_SPACING, MIN_SPACING, MAX_SPACING, SPACING_STEP, } from './layout';
13
13
  export { DEFAULT_NODE_CONFIG, DEFAULT_CURRENCY, DEFAULT_COMPOSITION, DEFAULT_VISIBILITY, CURRENT_CONFIG_VERSION, } from './defaultConfig';
@@ -23,6 +23,12 @@ export declare const MIN_PRODUCT_COUNT = 1;
23
23
  export declare const MAX_PRODUCTS_PER_ROW = 4;
24
24
  /** Minimum number of products per row in grid layout */
25
25
  export declare const MIN_PRODUCTS_PER_ROW = 1;
26
+ /** Default number of products per row on mobile */
27
+ export declare const DEFAULT_MOBILE_CARDS_IN_ROW = 1;
28
+ /** Maximum products per row on mobile */
29
+ export declare const MAX_MOBILE_PRODUCTS_PER_ROW = 2;
30
+ /** Minimum products per row on mobile */
31
+ export declare const MIN_MOBILE_PRODUCTS_PER_ROW = 1;
26
32
  /** Default column spacing between product cards (5px on each side = 10px total) */
27
33
  export declare const DEFAULT_COLUMN_SPACING = 10;
28
34
  /** Default row spacing between product rows */
@@ -6,6 +6,10 @@
6
6
  * Used across controls to target elements within the recommendation block
7
7
  */
8
8
  export declare const CONTAINER_SELECTOR = ".ins-recommendation-product-container";
9
+ /** Desktop product container selector */
10
+ export declare const DESKTOP_CONTAINER_SELECTOR = ".ins-recommendation-desktop-container";
11
+ /** Mobile product container selector */
12
+ export declare const MOBILE_CONTAINER_SELECTOR = ".ins-recommendation-mobile-container";
9
13
  /**
10
14
  * Currency HTML attributes set on the block element
11
15
  * These are read by the HTML compiler at runtime to format prices
@@ -29,7 +29,14 @@ export declare class CurrencyControl extends CommonControl {
29
29
  onDestroy(): void;
30
30
  _setFormValues(): void;
31
31
  _initializeSelectItems(): void;
32
- _updateCurrency(updates: Partial<CurrencyConfig>): void;
32
+ /**
33
+ * Applies currency updates to node config, HTML attributes, Pinia store, and DOM.
34
+ * @param updates - Partial currency config to merge
35
+ * @param triggerRefetch - Whether to trigger a product API refetch.
36
+ * true for currency code changes (different prices from API),
37
+ * false for display-only changes (symbol, separators, alignment, decimal count).
38
+ */
39
+ _updateCurrency(updates: Partial<CurrencyConfig>, triggerRefetch?: boolean): void;
33
40
  _onCurrencyChange(value: string): void;
34
41
  _onCurrencyLocationChange(value: string): void;
35
42
  _onCurrencySymbolChange(value: string): void;