@useinsider/guido 2.1.0-beta.7ffef92 → 2.1.0-beta.84a7014

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 (64) hide show
  1. package/README.md +41 -2
  2. package/dist/@types/config/schemas.js +1 -1
  3. package/dist/components/Guido.vue.js +1 -1
  4. package/dist/components/Guido.vue2.js +66 -66
  5. package/dist/components/organisms/extensions/recommendation/FilterItem.vue.js +13 -11
  6. package/dist/components/organisms/extensions/recommendation/FilterItem.vue2.js +24 -55
  7. package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue.js +3 -3
  8. package/dist/components/organisms/extensions/recommendation/FilterSelectionDrawer.vue2.js +21 -34
  9. package/dist/components/organisms/extensions/recommendation/Filters.vue.js +9 -9
  10. package/dist/components/organisms/extensions/recommendation/Filters.vue2.js +35 -44
  11. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue.js +1 -1
  12. package/dist/components/organisms/unsubscribe/UnsubscribePageSelection.vue2.js +19 -19
  13. package/dist/composables/useSave.js +16 -12
  14. package/dist/composables/useStripo.js +63 -57
  15. package/dist/composables/useStripoEventHandler.js +27 -12
  16. package/dist/composables/useSyncModuleExtractor.js +45 -0
  17. package/dist/composables/useVersionHistoryApi.js +1 -1
  18. package/dist/config/i18n/en/index.js +11 -0
  19. package/dist/config/i18n/en/labels.json.js +7 -0
  20. package/dist/config/i18n/en/toasters.json.js +56 -0
  21. package/dist/config/i18n/en/tooltips.json.js +82 -0
  22. package/dist/config/i18n/index.js +7 -0
  23. package/dist/config/migrator/itemsBlockMigrator.js +65 -64
  24. package/dist/enums/unsubscribe.js +25 -21
  25. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +39 -58
  26. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +57 -93
  27. package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +8 -8
  28. package/dist/extensions/Blocks/Unsubscribe/block.js +29 -29
  29. package/dist/extensions/Blocks/Unsubscribe/control.js +12 -9
  30. package/dist/extensions/Blocks/Unsubscribe/elements/preview.js +13 -11
  31. package/dist/extensions/Blocks/Unsubscribe/styles.css.js +31 -1
  32. package/dist/guido.css +1 -1
  33. package/dist/services/stripoApi.js +55 -19
  34. package/dist/src/@types/config/schemas.d.ts +1 -1
  35. package/dist/src/@types/events.d.ts +38 -2
  36. package/dist/src/components/Guido.vue.d.ts +2 -2
  37. package/dist/src/components/organisms/extensions/recommendation/FilterItem.vue.d.ts +0 -1
  38. package/dist/src/components/organisms/extensions/recommendation/Filters.vue.d.ts +1 -15
  39. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -1
  40. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -1
  41. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
  42. package/dist/src/composables/useGuidoActions.d.ts +1 -1
  43. package/dist/src/composables/useSave.d.ts +2 -2
  44. package/dist/src/composables/useStripo.d.ts +2 -2
  45. package/dist/src/composables/useSyncModuleExtractor.d.ts +4 -0
  46. package/dist/src/config/i18n/en/index.d.ts +1 -0
  47. package/dist/src/config/i18n/index.d.ts +16 -0
  48. package/dist/src/enums/unsubscribe.d.ts +3 -0
  49. package/dist/src/extensions/Blocks/Recommendation/controls/main/index.d.ts +0 -5
  50. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +2 -18
  51. package/dist/src/extensions/Blocks/Unsubscribe/control.d.ts +1 -0
  52. package/dist/src/mock/api/settings.d.ts +2 -0
  53. package/dist/src/services/stripoApi.d.ts +5 -0
  54. package/dist/src/stores/editor.d.ts +23 -0
  55. package/dist/src/utils/templatePreparation.d.ts +1 -1
  56. package/dist/static/styles/components/notification.css.js +18 -0
  57. package/dist/static/styles/components/tools.css.js +6 -2
  58. package/dist/static/styles/variables.css.js +2 -0
  59. package/dist/stores/editor.js +2 -1
  60. package/dist/stores/unsubscribe.js +37 -34
  61. package/dist/utils/templatePreparation.js +1 -1
  62. package/package.json +1 -1
  63. package/dist/extensions/Blocks/Recommendation/validation/filterSchema.js +0 -29
  64. package/dist/src/extensions/Blocks/Recommendation/validation/filterSchema.d.ts +0 -15
@@ -0,0 +1,82 @@
1
+ const e = {
2
+ "Add template/pre-built modules, or structures with containers": "Structures and Modules lets you add templates, pre-built modules or structures with containers.",
3
+ "Allows uploading and editing images": "Image lets you add and edit images.",
4
+ "Allows working on text styles, adding merge tags and lists": "Text lets you edit text styles, add merge tags and lists.",
5
+ "Allows designing buttons of any shape, size, and color": "Button lets you edit the shape, size, and color of the buttons.",
6
+ "Meant to visually separate elements with a horizontal line": "Spacer lets you separate elements with a horizontal line.",
7
+ "Offers 70+ social media icons and chats of different design styles": "Social Networks lets you add social media icons and chat options in different design styles.",
8
+ "Helps taking users from emails to necessary pages on your site": "Menu lets you direct users from emails to the respective website.",
9
+ "Allows adding elements with custom code in emails": "HTML lets you add elements with custom code in emails.",
10
+ "Allows applying filters to images and placing text over them": "Banner lets you apply filters to images and add text over them.",
11
+ "Allows setting thumbnail images & play buttons for videos": "Video lets you set thumbnail images, add video links and play buttons for videos.",
12
+ "Adds a countdown to a specific date. Use the timer in emails for promotions, launches, and events": "Timer lets you add a countdown in your emails for promotions, launches or events.",
13
+ 'The "AMP Carousel" block is currently being developed. Switch to the Old version of the Editor to access the full functionality needed to continue working on this email. Please note, that all changes you have already made to this email will be saved and available in the Old version': "Carousel lets you add templates, prebuilt modules or container-based structures via AMP HTML and HTML.",
14
+ 'The "AMP Accordion" block is currently being development. Switch to the Old version of the Editor to access the full functionality needed to continue working on this email. Please note, that all changes you have already made to this email will be saved and available in the Old version': "AMP Accordion lets you add a collapsible accordion with customizable sections via AMP HTML.",
15
+ "An AMP Form block lets users collect feedback or run surveys directly in an email. It includes input fields and can be added in the Editor, allowing recipients to respond right from their inbox": "AMP Form Block lets you add input fields to collect feedback or run surveys via AMP HTML.",
16
+ "Will be applied to the entire email": "General Background Color lets you set the background color applied to the entire email.",
17
+ "Background image for the entire email. Some email clients (Windows 10 Mail, Android 4.4, the Gmail app for iOS, and Android for non-Gmail accounts) do not support background images. Thus, we recommend choosing a background color for the entire email similar to the selected image as a fallback.": "Background Image lets you upload an image for the entire email.",
18
+ "Repetition of the email background image. In Outlook for Windows, the image will be repeated in any case, regardless of whether this option is enabled or not. To bypass the Outlook limitation, you need to create an image in a third-party editor of the needed color and size so that it fits the entire background size, apply the required graphics to it, upload it, and center-align it in the email. The dimensions of such a background image should be at least 1,920 pixels in width, and the height should be equal to the height of the email.": "Background Image Repeat lets you enable the repetition of the background image.",
19
+ 'The standard width of the email varies between 540-700 pixels. <a href="https://stripo.email/blog/email-template-size-width-height/" target="_blank" aria-label="Read more about the message width in our blog.">Read more here</a>': "Message Content Width lets you set the standard width of the email between 540 and 700 pixels.",
20
+ "Alignment of the email content area ": "Message Alignment lets you set the alignment of the email content area.",
21
+ "Your email will automatically adjust for smaller screens by displaying content in a single column. Side-by-side blocks will be stacked vertically": "Responsive Design lets your email adjust to smaller screens.",
22
+ "Your email will display the desktop version on mobile devices. Mobile-specific settings will be turned off in the Editor": "Note that Responsive Design can only be visible on the desktop version of mobile devices, and mobile settings will also be turned off when Responsive Design is disabled.",
23
+ "Enable the right-to-left (RTL) text direction to build emails easily without coding for recipients using RTL scripts, such as Arabic, Hebrew, Persian, Urdu, etc.": "Right to Left Text Direction lets you build emails in right-to-left (RTL) languages like Arabic, Hebrew, or Persian without coding.",
24
+ "Margins around the email message area": "Message on Desktop lets you set the margins around the message area.",
25
+ "The background image of the stripe. The image will not be displayed in an Outlook app on Windows email clients. We recommend choosing a stripe background color similar to the selected image as a fallback": "Background Image lets you drag and drop or add an image URL as a background image.",
26
+ 'We automatically calculate the optimal indentation for your text. It depends on font size and line spacing <a href="https://en.wikipedia.org/wiki/Leading" target="_blank">leading<a/>': "Bottom Space lets you add space automatically depending on font size and line spacing.",
27
+ 'Padding in the "Text" block makes space around the added text.': "Padding on Desktop lets you add space around the text in the Text block for desktop.",
28
+ "If an email client doesn't support the non-standard font, a similar standard font will be used instead.": "Note that a similar Safe font will be used instead of the selected font if users' devices don't support it.",
29
+ "This option ensures the most accurate display of your buttons in MS Outlook email clients by inserting a special VML-code. When this option is activated, the email message size can be increased up to kilobyte for each added button.": "Support for Outlook lets you display buttons accurately in Outlook by adding VML code, which may increase your email size.",
30
+ "Outlook for Windows does not have support for a separate button border width setting": "Style is not supported in Outlook for Windows as it doesn't allow separate button border width settings.",
31
+ "Outlook for Windows does not have a support for the border radius property. We recommend enabling the Outlook support option.": "Border is not supported in Outlook for Windows as it doesn't allow the border radius property. We recommend enabling Outlook Support.",
32
+ 'The option "hover button styles" (changing colors upon a mouseover) is supported by a limited number of email clients. <a href="{link}" target="_blank">Learn more</a>': "Hover Button Styles can be supported by a limited number of users. For more information, you can visit Academy.",
33
+ "Button padding that makes the space around the button text": "Padding on Desktop lets you set the space around the button text for desktop.",
34
+ "The icon inside the button will not show in Outlook 2002, 2007, 2010, 2013, 2016, 2019 on Windows.": "The Icon won't be visible in Outlook 2002–2019 on Windows.",
35
+ "Margins around the button": "Margins on Desktop lets you set the space around the button.",
36
+ "It only works with CSS styles, so it is not supported by Outlook on Windows. We recommend enabling the Support for Outlook option.": "Border Radius lets you round the corners of the button. Note that it only works with CSS styles, so it's not supported by Outlook on Windows. We recommend enable the Support for Outlook.",
37
+ "Not supported by Outlook on Windows, so we recommend enabling the Support for Outlook option in the General Settings tab.": "Border lets you add an outline around the element. Note that it's not supported by Outlook on Windows. We recommend you enable the Support for Outlook in the General Settings.",
38
+ "Add content to the email, click it, and choose “Save as a module”. Stripes, Structures, and Containers can be saved as a module.": "Make sure you save modules once content is added. Note that Stripes, Structures, and Containers can be saved as a module.",
39
+ "This feature is only supported by Yahoo! Mail, Ukr.net, AOL, Gmail, iCloud Mail, Outlook 2003, Outlook for Mac and macOS Apple Mail": "Rollover Effect is supported by Yahoo Mail, Ukr.net, AOL, Gmail, iCloud Mail, Outlook 2003, Outlook for Mac and Apple Mail.",
40
+ "The aspect ratio of the added image does not match the others. Please replace it to match the {ratio} format": "Note that the aspect ratio of the secondary image doesn't match the aspect ratio of the primary one. Make sure you edit the ratio of the secondary image to ensure the Rollover Effect works properly.",
41
+ "Margins around the image": "Margins on Desktop lets you set the space around the image for desktop view.",
42
+ "The image will automatically adjust to the width of the screen on mobile devices that support it": "Responsive Image lets you adjust the screen width automatically on supported mobile devices.",
43
+ "Images won't be adjusted to the width of the screen on mobile devices, which may lead to poor display of images and content": "Make sure you enable Responsive Image to adjust the width of the screen on mobile devices to display images and content properly.",
44
+ "Make the image to fit to the width of a mobile screen. Please note: It only works on devices that have support for media queries.": "Responsive Image lets you make the image fit the width of a mobile screen. Note that it only works on supported devices.",
45
+ "You have the option of displaying a different image when your countdown timer expires.": "Display a different image when the countdown timer expires.",
46
+ "Margins around the timer": "Margin on Desktop lets you adjust the spacing around the timer on desktop screens.",
47
+ 'Not all email clients support the selected link protocol. Check the <a href="https://support.stripo.email/en/articles/5332466-what-are-link-protocols-compatible-with-emails" target="_blank">compatibility guide</a> to learn more about supported clients.': "Note that not all user devices can support the selected link protocol. For more information about supported clients, you can visit Academy.",
48
+ "This forces the accordion to only allow one expanded section at any given time. Expanding one section will cause any other open sections to close.": "Ensure only one accordion section stays open by automatically collapsing the others when a new one is expanded.",
49
+ "Outlook for Windows does not have support for dashed and dotted borders": "Style lets you customize the border style of the element. Note that dashed and dotted borders aren't supported by Outlook on Windows.",
50
+ "Internal padding creates space around containers and blocks": "Padding on Desktop lets you create space around containers and blocks.",
51
+ "Margins around the separator line": "Margins on Desktop let you set the space around the separator line.",
52
+ "Use your own title and alternative text to each icon": "Title and Alternate Text Customization lets you add your own title and alternative text to each icon.",
53
+ "Margins around social network icons": "Margins on Desktop lets you set the space around social network icons.",
54
+ "Makes the menu fit to the container width": "Fit to Container lets you make the menu fit the container width.",
55
+ "Margins around elements formed by custom code": "Margins on Desktop lets you set margins around elements formed by custom code.",
56
+ "Margins around the banner": "Margins on Desktop lets you set margins around the banner.",
57
+ 'Creates an anchor for this element. Anchor links in emails are designed to make navigation easier. They help take readers to specific places in the email without the need to scroll. <a href="https://support.stripo.email/en/articles/3174098-how-to-apply-anchor-hyperlinks" target="_blank">Learn more</a> about how it works and how to create one with Stripo.': "Anchor Link lets you create a link that takes users to a specific part of the email without scrolling.",
58
+ 'Include the element in the necessary version of the email, or in both. <a target="_blank" href="https://stripo.email/blog/how-to-build-amp-emails-with-stripo/">Learn more about ⚡ HTML (AMP HTML).</a>': "Include In lets you include the element in the selected version of the email or in both versions.",
59
+ "The element will be included in both MIME versions of the email: classic HTML and AMP HTML": "The element will be included in both MIME versions of the email: classic HTML and AMP HTML",
60
+ "The element will be included only in the HTML MIME version of the email message. The item will be hidden in the AMP HTML version": "The element will be included only in the HTML MIME version of the email message. The item will be hidden in the AMP HTML version",
61
+ "The element will be included only in the AMP HTML MIME version of the email message. The item will be hidden in the HTML version": "The element will be included only in the AMP HTML MIME version of the email message. The item will be hidden in the HTML version",
62
+ "This element will not be hidden in email clients which do not support media queries.": "Hide Element on Mobile lets you hide the selected content from appearing on mobile.",
63
+ "The element will be hidden on Yahoo mobile App, as well as in mobile email client which do not support media queries.": "Hide on Desktop lets you hide the element on desktop devices that support media queries.",
64
+ "The element already hidden on Desktop. Activating this option you turning off hidden state for Desktop.": "Note that this element is already hidden on Desktop, it will be visible on desktop when you enable this.",
65
+ "The element already hidden on Mobile. Activating this option you turning off hidden state for Mobile.": "Note that this element is already hidden on mobile, it will be visible on mobile when you enable this.",
66
+ "An anchor link should not exceed more than 150 characters": "Enter an Anchor Link up to 150 characters.",
67
+ "An alternate text should not exceed more than 255 characters": "Enter an Alternate Text up to 255 characters.",
68
+ "A HEX color value should not exceed more than 8 symbols": "Enter a Hex Color value up to 8 characters to continue.",
69
+ "A keyword must have at least 2 characters": "Enter a keyword of 2 or more characters to continue.",
70
+ "Button label should not exceed more than 255 characters": "Enter a button label up to 255 characters to continue.",
71
+ "Link Name should not exceed more than 500 characters": "Enter a Link Name up to 500 characters to continue.",
72
+ "Menu Item Name should not exceed more than 255 characters": "Enter a Menu Item Name up to 255 characters to continue.",
73
+ "It is not possible to upload more than 50 files simultaneously. If possible, please try to complete this over a few iterations.": "Up to 50 files can be added at once.",
74
+ "Please enter a valid link": "Enter a valid link to continue.",
75
+ "The image with the invalid link cannot be saved to the image gallery": "Enter a valid image link to continue.",
76
+ "The data source link is unavailable. Please, make sure there is an access to the data source.": "Enter an accessible Data Source Link to contiue.",
77
+ "The file should not exceed the maximum resolution of {maxImageResolution}px.": "Upload files up to 1024x512 pixels to continue.",
78
+ "The option is disabled because was overridden in the Code editor": "The option is disabled because it was overridden in the Code Editor."
79
+ };
80
+ export {
81
+ e as default
82
+ };
@@ -0,0 +1,7 @@
1
+ import { en as o } from "./en/index.js";
2
+ const c = {
3
+ en: o
4
+ };
5
+ export {
6
+ c as localePatch
7
+ };
@@ -1,8 +1,8 @@
1
- var B = Object.defineProperty;
2
- var U = (e, t, r) => t in e ? B(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r;
3
- var M = (e, t, r) => U(e, typeof t != "symbol" ? t + "" : t, r);
4
- import { productPairs as v } from "../../extensions/Blocks/Items/enums/productEnums.js";
5
- import { ItemInCartOptions as E, DefaultConfigValues as g, SETTINGS_ENUMS as u } from "../../extensions/Blocks/Items/enums/settingsEnums.js";
1
+ var v = Object.defineProperty;
2
+ var B = (e, t, r) => t in e ? v(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r;
3
+ var M = (e, t, r) => B(e, typeof t != "symbol" ? t + "" : t, r);
4
+ import { productPairs as U } from "../../extensions/Blocks/Items/enums/productEnums.js";
5
+ import { ItemInCartOptions as T, DefaultConfigValues as g, SETTINGS_ENUMS as u } from "../../extensions/Blocks/Items/enums/settingsEnums.js";
6
6
  import { getDefaultTemplate as K } from "../../extensions/Blocks/Items/template.js";
7
7
  const w = {
8
8
  img: {
@@ -85,18 +85,19 @@ function q(e) {
85
85
  }[e] || u.ITEMS_TYPE.CART_ITEMS : u.ITEMS_TYPE.CART_ITEMS;
86
86
  }
87
87
  function R(e) {
88
- const t = (a, o) => a == null ? o : a === "1" || a === "true", r = (a, o) => a || o, c = e["data-type"] || e["data-source"], i = q(c);
89
- let n = e["data-cart_items_select_control_value"] || g.cartItemsSelectControlValue;
90
- if (n && !n.includes("{{") && /^\d+$/.test(n)) {
91
- const a = parseInt(n) - 1, o = E[i];
92
- o && o[a] && (n = o[a].value);
88
+ var a;
89
+ const t = (_, c) => _ == null ? c : _ === "1" || _ === "true", r = (_, c) => _ || c, l = e["data-type"] || e["data-source"], i = q(l), n = T[i];
90
+ let o = e["data-cart_items_select_control_value"] || ((a = n == null ? void 0 : n[0]) == null ? void 0 : a.value) || g.cartItemsSelectControlValue;
91
+ if (o && !o.includes("{{") && /^\d+$/.test(o)) {
92
+ const _ = parseInt(o) - 1, c = T[i];
93
+ c && c[_] && (o = c[_].value);
93
94
  }
94
95
  return {
95
96
  initialized: !0,
96
97
  blockInstanceId: r(e["data-block-instance-id"], F()),
97
98
  source: i,
98
99
  type: i,
99
- itemsSelectValue: n,
100
+ itemsSelectValue: o,
100
101
  orientation: e["data-card_orientation_control_value"] || u.ORIENTATION.VERTICAL,
101
102
  nameTrimming: t(e["data-product_name_control_trim"], !0),
102
103
  priceHideDiscount: t(e["data-product_price_control_nodup"], !0),
@@ -154,36 +155,36 @@ class V {
154
155
  try {
155
156
  let r = this.removeJinjaConditionals(t);
156
157
  r = this.replaceTemplateVariables(r);
157
- const c = this.parser.parseFromString(r, "text/html"), i = c.querySelectorAll(
158
+ const l = this.parser.parseFromString(r, "text/html"), i = l.querySelectorAll(
158
159
  "td.esd-cart-items-block, td.esd-browsed-items-block, td.esd-purchased-items-block"
159
160
  );
160
161
  return i.length === 0 ? (console.warn("ItemsBlockMigrator: No blocks found with items block selectors"), r) : (i.forEach((n) => {
161
- const a = this.extractConfiguration(n), o = K({
162
- orientation: a.orientation,
163
- itemsType: a.itemsType,
164
- itemId: a.itemId,
165
- currencySymbol: a.currencySymbol,
166
- currencyLocation: a.currencyLocation,
167
- formattedPrice: a.formattedPrice,
168
- configBlockAttributes: a.configBlockAttributes,
162
+ const o = this.extractConfiguration(n), a = K({
163
+ orientation: o.orientation,
164
+ itemsType: o.itemsType,
165
+ itemId: o.itemId,
166
+ currencySymbol: o.currencySymbol,
167
+ currencyLocation: o.currencyLocation,
168
+ formattedPrice: o.formattedPrice,
169
+ configBlockAttributes: o.configBlockAttributes,
169
170
  migrate: !0,
170
- nameStyles: a.nameStyles,
171
- buttonStyles: a.buttonStyles,
172
- priceStyles: a.priceStyles,
173
- originalPriceStyles: a.originalPriceStyles,
174
- quantityStyles: a.quantityStyles,
175
- nodeConfig: R(a.configBlockAttributes)
176
- }), l = this.parser.parseFromString(
177
- `<table><tbody><tr>${o}</tr></tbody></table>`,
171
+ nameStyles: o.nameStyles,
172
+ buttonStyles: o.buttonStyles,
173
+ priceStyles: o.priceStyles,
174
+ originalPriceStyles: o.originalPriceStyles,
175
+ quantityStyles: o.quantityStyles,
176
+ nodeConfig: R(o.configBlockAttributes)
177
+ }), c = this.parser.parseFromString(
178
+ `<table><tbody><tr>${a}</tr></tbody></table>`,
178
179
  "text/html"
179
180
  ).querySelector("td");
180
- if (l && n.parentNode) {
181
- const f = R(a.configBlockAttributes);
182
- l.setAttribute("esd-ext-config", JSON.stringify(f));
183
- const d = l.querySelector("esd-config-block");
184
- d && d.remove(), n.parentNode.replaceChild(l, n);
181
+ if (c && n.parentNode) {
182
+ const f = R(o.configBlockAttributes);
183
+ c.setAttribute("esd-ext-config", JSON.stringify(f));
184
+ const d = c.querySelector("esd-config-block");
185
+ d && d.remove(), n.parentNode.replaceChild(c, n);
185
186
  }
186
- }), c.documentElement.outerHTML);
187
+ }), l.documentElement.outerHTML);
187
188
  } catch (r) {
188
189
  return console.error("ItemsBlockMigrator failed:", r), t;
189
190
  }
@@ -196,14 +197,14 @@ class V {
196
197
  */
197
198
  extractConfiguration(t) {
198
199
  var C, D, P;
199
- const r = ((C = t.querySelector("[data-type]")) == null ? void 0 : C.getAttribute("data-type")) || "CART_ITEMS", c = ((D = t.querySelector("[data-number]")) == null ? void 0 : D.getAttribute("data-number")) || "1", i = parseInt(c) - 1, n = E[r], a = ((P = n == null ? void 0 : n[i]) == null ? void 0 : P.value) || n[0].value, o = t.querySelector('[product-attr="price"]'), _ = (o == null ? void 0 : o.getAttribute("data-currency_symbol")) || "USD", f = ((o == null ? void 0 : o.getAttribute("data-curency")) || "before") === "after" ? "1" : "0", d = (o == null ? void 0 : o.getAttribute("data-formated")) !== "false", s = this.extractConfigBlockAttributes(t, r, c), S = s["data-card_orientation_control_value"];
200
+ const r = ((C = t.querySelector("[data-type]")) == null ? void 0 : C.getAttribute("data-type")) || "CART_ITEMS", l = ((D = t.querySelector("[data-number]")) == null ? void 0 : D.getAttribute("data-number")) || "1", i = parseInt(l) - 1, n = T[r], o = ((P = n == null ? void 0 : n[i]) == null ? void 0 : P.value) || n[0].value, a = t.querySelector('[product-attr="price"]'), _ = (a == null ? void 0 : a.getAttribute("data-currency_symbol")) || "USD", f = ((a == null ? void 0 : a.getAttribute("data-curency")) || "before") === "after" ? "1" : "0", d = (a == null ? void 0 : a.getAttribute("data-formated")) !== "false", s = this.extractConfigBlockAttributes(t, r, l), S = s["data-card_orientation_control_value"];
200
201
  let b;
201
202
  S ? b = S === "horizontal" ? "horizontal" : "vertical" : b = t.querySelector('[colspan="2"]') !== null ? "vertical" : "horizontal";
202
- const p = t.querySelector('a[product-attr="name"]'), I = (p == null ? void 0 : p.getAttribute("style")) || void 0, y = t.querySelector('a[product-attr="button"]'), m = (y == null ? void 0 : y.getAttribute("style")) || void 0, h = (o == null ? void 0 : o.getAttribute("style")) || void 0, T = t.querySelector("p.original-price"), k = (T == null ? void 0 : T.getAttribute("style")) || void 0, A = t.querySelector('[product-attr="quantity"]'), L = (A == null ? void 0 : A.getAttribute("style")) || void 0;
203
+ const p = t.querySelector('a[product-attr="name"]'), I = (p == null ? void 0 : p.getAttribute("style")) || void 0, y = t.querySelector('a[product-attr="button"]'), m = (y == null ? void 0 : y.getAttribute("style")) || void 0, h = (a == null ? void 0 : a.getAttribute("style")) || void 0, A = t.querySelector("p.original-price"), k = (A == null ? void 0 : A.getAttribute("style")) || void 0, E = t.querySelector('[product-attr="quantity"]'), L = (E == null ? void 0 : E.getAttribute("style")) || void 0;
203
204
  return {
204
205
  orientation: b,
205
206
  itemsType: r,
206
- itemId: a,
207
+ itemId: o,
207
208
  currencySymbol: _,
208
209
  currencyLocation: f,
209
210
  formattedPrice: d,
@@ -222,27 +223,27 @@ class V {
222
223
  * @param itemsType - The type of items (CART_ITEMS, BROWSED_ITEMS, PURCHASED_ITEMS)
223
224
  * @param itemNumber - The item number (1-based index)
224
225
  */
225
- extractConfigBlockAttributes(t, r, c) {
226
+ extractConfigBlockAttributes(t, r, l) {
226
227
  const i = t.querySelector("esd-config-block"), n = {};
227
228
  if (!i)
228
229
  return this.getDefaultConfigBlockAttributes();
229
- if (Array.from(i.attributes).forEach((o) => {
230
- o.name.startsWith("data-") && (n[o.name] = o.value);
230
+ if (Array.from(i.attributes).forEach((a) => {
231
+ a.name.startsWith("data-") && (n[a.name] = a.value);
231
232
  }), n["data-cart_items_select_control_value"]) {
232
- const o = n["data-cart_items_select_control_value"];
233
- if (/^\d+$/.test(o)) {
234
- const _ = parseInt(o) - 1, l = E[r];
235
- l && l[_] && (n["data-cart_items_select_control_value"] = l[_].value);
233
+ const a = n["data-cart_items_select_control_value"];
234
+ if (/^\d+$/.test(a)) {
235
+ const _ = parseInt(a) - 1, c = T[r];
236
+ c && c[_] && (n["data-cart_items_select_control_value"] = c[_].value);
236
237
  }
237
238
  }
238
239
  if (n["data-product_price_control_curency"]) {
239
- const o = n["data-product_price_control_curency"];
240
- let _ = o;
241
- o === "before" ? _ = "0" : o === "after" && (_ = "1"), n["data-product_price_control_curency"] = _, n["data-product_price_currency_location"] = _;
240
+ const a = n["data-product_price_control_curency"];
241
+ let _ = a;
242
+ a === "before" ? _ = "0" : a === "after" && (_ = "1"), n["data-product_price_control_curency"] = _, n["data-product_price_currency_location"] = _;
242
243
  }
243
244
  (!n["data-product_price_control_currency_symbol"] || n["data-product_price_control_currency_symbol"].trim() === "") && (n["data-product_price_control_currency_symbol"] = "USD");
244
- const a = { ...this.getDefaultConfigBlockAttributes(), ...n };
245
- return a["data-type"] = r, a["data-source"] = r, a["data-product_image_link"] = $(r, c), a["data-product_button_link"] = x(r, c), a;
245
+ const o = { ...this.getDefaultConfigBlockAttributes(), ...n };
246
+ return o["data-type"] = r, o["data-source"] = r, o["data-product_image_link"] = $(r, l), o["data-product_button_link"] = x(r, l), o;
246
247
  }
247
248
  /**
248
249
  * Returns default esd-config-block attributes based on the old template structure
@@ -302,15 +303,15 @@ class V {
302
303
  * contains display condition Jinja scripts that should NOT be removed.
303
304
  */
304
305
  removeJinjaConditionals(t) {
305
- const r = "__ESD_DISPLAY_CONDITIONS_PLACEHOLDER__", c = t.match(/esd-custom-display-conditions="[^"]*"/);
306
- let i = c ? t.replace(c[0], r) : t;
306
+ const r = "__ESD_DISPLAY_CONDITIONS_PLACEHOLDER__", l = t.match(/esd-custom-display-conditions="[^"]*"/);
307
+ let i = l ? t.replace(l[0], r) : t;
307
308
  return i = i.replace(
308
309
  /\{%\s*if\s+(ins_apr|browsed_item|purchased_item)_total_product_kind\s*(&gt;|>)\s*\d+\s*%\}/g,
309
310
  ""
310
311
  ), i = i.replace(
311
312
  /\{%\s*if\s+(ins_apr|browsed_item|purchased_item)_price_\d+\s*(!&#61;|!=)\s*\1_originalprice_\d+\s*%\}/g,
312
313
  ""
313
- ), i = i.replace(/\{%\s*endif\s*%\}/g, ""), c && (i = i.replace(r, c[0])), i = i.replace(/\n\s*\n\s*\n/g, `
314
+ ), i = i.replace(/\{%\s*endif\s*%\}/g, ""), l && (i = i.replace(r, l[0])), i = i.replace(/\n\s*\n\s*\n/g, `
314
315
 
315
316
  `), i;
316
317
  }
@@ -324,26 +325,26 @@ class V {
324
325
  * - {{purchased_item_formattedprice_5}} → '1,490.49' (PURCHASED_ITEMS)
325
326
  */
326
327
  replaceTemplateVariables(t) {
327
- const { PAIRS_FOR_EXTENSION: r } = v;
328
- return t.replace(/{{([^}]+)}}/g, (c, i) => {
328
+ const { PAIRS_FOR_EXTENSION: r } = U;
329
+ return t.replace(/{{([^}]+)}}/g, (l, i) => {
329
330
  const n = i.match(/^(ins_apr|browsed_item|purchased_item)_([a-z_]+)_(\d+)$/);
330
331
  if (!n)
331
- return c;
332
- const [, a, o, _] = n, l = O[a];
333
- if (!l)
334
- return console.warn(`Unknown variable prefix: ${a}`), c;
335
- const f = w[o];
332
+ return l;
333
+ const [, o, a, _] = n, c = O[o];
334
+ if (!c)
335
+ return console.warn(`Unknown variable prefix: ${o}`), l;
336
+ const f = w[a];
336
337
  if (!f)
337
- return console.warn(`Unknown variable suffix mapping for: ${o}`), c;
338
- const { pairsKey: d, defaultKey: s, isArray: S } = f, p = r[d][l];
338
+ return console.warn(`Unknown variable suffix mapping for: ${a}`), l;
339
+ const { pairsKey: d, defaultKey: s, isArray: S } = f, p = r[d][c];
339
340
  if (!p)
340
- return console.warn(`No data found for: ${d}.${l}`), c;
341
+ return console.warn(`No data found for: ${d}.${c}`), l;
341
342
  if (S) {
342
343
  const y = parseInt(_) - 1, m = p[s];
343
- return Array.isArray(m) && m[y] ? m[y] : (console.warn(`Array value not found: ${d}.${l}.${s}[${y}]`), c);
344
+ return Array.isArray(m) && m[y] ? m[y] : (console.warn(`Array value not found: ${d}.${c}.${s}[${y}]`), l);
344
345
  }
345
346
  const I = p[s];
346
- return I !== void 0 ? String(I) : (console.warn(`Default value not found: ${d}.${l}.${s}`), c);
347
+ return I !== void 0 ? String(I) : (console.warn(`Default value not found: ${d}.${c}.${s}`), l);
347
348
  });
348
349
  }
349
350
  }
@@ -1,17 +1,17 @@
1
1
  import { useTranslations as e } from "../composables/useTranslations.js";
2
2
  import { getEnvironmentPrefix as R } from "../utils/environmentUtil.js";
3
- const I = {
3
+ const _ = {
4
4
  UNSUBSCRIBE_LINK_TYPE: 1,
5
5
  PREFERENCES_LINK_TYPE: 3
6
- }, r = {
6
+ }, I = {
7
7
  UNSUBSCRIBE_LINK_REGEX: /{{ins-unsubscribe-link}}/g,
8
8
  DATA_OGSB_BUTTON_CSS_REGEX: "\\[data-ogsb\\]\\s*\\.es-button\\.es-button-[0-9]+\\s*\\{(?:[^\\}]*)\\}",
9
9
  GLOBAL_UNSUBSCRIBE_LINK_REGEX: /{{ins-global-unsubscribe-link}}/g,
10
10
  PREFERENCES_UNSUBSCRIBE_LINK_REGEX: /{{ins-preferences-unsubscribe-link}}/g
11
- }, s = R(), _ = {
12
- UNSUBSCRIBE_URL: `https://mail.${s}.com/user/v1/unsub`,
13
- PREFERENCES_URL: `https://mail.${s}.com/user/v1/prefs`
14
- }, i = "iid", B = {
11
+ }, n = R(), r = {
12
+ UNSUBSCRIBE_URL: `https://mail.${n}.com/user/v1/unsub`,
13
+ PREFERENCES_URL: `https://mail.${n}.com/user/v1/prefs`
14
+ }, B = "iid", i = {
15
15
  name: "Global Unsubscribe",
16
16
  sendGridId: "G"
17
17
  }, C = "/email/unsubscribe-pages", E = {
@@ -20,6 +20,9 @@ const I = {
20
20
  SUBSCRIPTION_PREFERENCE_CENTER: 3,
21
21
  SUBSCRIPTION_PREFERENCE_CONFIRMATION: 4,
22
22
  RESUBSCRIBE: 5
23
+ }, U = {
24
+ [E.GLOBAL_UNSUBSCRIBE]: "custom-unsubscribe",
25
+ [E.SUBSCRIPTION_PREFERENCE_CENTER]: "custom-preferences"
23
26
  }, t = {
24
27
  [E.GLOBAL_UNSUBSCRIBE]: [
25
28
  E.GLOBAL_UNSUBSCRIBE,
@@ -30,29 +33,30 @@ const I = {
30
33
  E.SUBSCRIPTION_PREFERENCE_CENTER,
31
34
  E.SUBSCRIPTION_PREFERENCE_CONFIRMATION
32
35
  ]
33
- }, U = () => {
34
- const n = e();
36
+ }, c = () => {
37
+ const s = e();
35
38
  return {
36
- [E.GLOBAL_UNSUBSCRIBE]: n("unsubscription-preference.type-global-unsubscribe"),
37
- [E.GLOBAL_UNSUBSCRIBE_CONFIRMATION_PAGE]: n("unsubscription-preference.type-global-unsubscription-confirmation"),
38
- [E.RESUBSCRIBE]: n("unsubscription-preference.type-resubscribe"),
39
- [E.SUBSCRIPTION_PREFERENCE_CENTER]: n("unsubscription-preference.type-subscription-preferences-center"),
40
- [E.SUBSCRIPTION_PREFERENCE_CONFIRMATION]: n("unsubscription-preference.type-subscription-preferences-confirmation")
39
+ [E.GLOBAL_UNSUBSCRIBE]: s("unsubscription-preference.type-global-unsubscribe"),
40
+ [E.GLOBAL_UNSUBSCRIBE_CONFIRMATION_PAGE]: s("unsubscription-preference.type-global-unsubscription-confirmation"),
41
+ [E.RESUBSCRIBE]: s("unsubscription-preference.type-resubscribe"),
42
+ [E.SUBSCRIPTION_PREFERENCE_CENTER]: s("unsubscription-preference.type-subscription-preferences-center"),
43
+ [E.SUBSCRIPTION_PREFERENCE_CONFIRMATION]: s("unsubscription-preference.type-subscription-preferences-confirmation")
41
44
  };
42
- }, c = {
45
+ }, o = {
43
46
  default: "{{ins-unsubscribe-link}}",
44
47
  [E.GLOBAL_UNSUBSCRIBE]: "{{ins-global-unsubscribe-link}}",
45
48
  [E.SUBSCRIPTION_PREFERENCE_CENTER]: "{{ins-preferences-unsubscribe-link}}"
46
49
  };
47
50
  export {
48
- B as DEFAULT_UNSUBSCRIBE_GROUP,
49
- i as INSIDER_ID,
50
- r as LINK_REGEXES,
51
- I as LINK_TYPES,
52
- c as MERGE_TAGS,
51
+ i as DEFAULT_UNSUBSCRIBE_GROUP,
52
+ B as INSIDER_ID,
53
+ I as LINK_REGEXES,
54
+ _ as LINK_TYPES,
55
+ o as MERGE_TAGS,
53
56
  E as PAGE_TYPES,
54
57
  t as TYPE_COLLECTIONS,
55
58
  C as UNSUBSCRIBE_PAGES_LINK,
56
- _ as URLS,
57
- U as getTypeTranslations
59
+ U as UNSUBSCRIBE_SYNC_MODULE_TYPES,
60
+ r as URLS,
61
+ c as getTypeTranslations
58
62
  };
@@ -1,8 +1,8 @@
1
- var m = Object.defineProperty;
2
- var h = (c, s, t) => s in c ? m(c, s, { enumerable: !0, configurable: !0, writable: !0, value: t }) : c[s] = t;
3
- var n = (c, s, t) => h(c, typeof s != "symbol" ? s + "" : s, t);
4
- import { CommonControl as f } from "../../../common-control.js";
5
- import { RecommendationConfigService as l } from "../../services/configService.js";
1
+ var d = Object.defineProperty;
2
+ var m = (c, s, t) => s in c ? d(c, s, { enumerable: !0, configurable: !0, writable: !0, value: t }) : c[s] = t;
3
+ var n = (c, s, t) => m(c, typeof s != "symbol" ? s + "" : s, t);
4
+ import { CommonControl as h } from "../../../common-control.js";
5
+ import { RecommendationConfigService as f } from "../../services/configService.js";
6
6
  import { useRecommendationExtensionStore as C } from "../../store/recommendation.js";
7
7
  import { AlgorithmControl as p } from "./algorithm.js";
8
8
  import { ALGORITHM_CONTROL_ID as W } from "./algorithm.js";
@@ -10,17 +10,17 @@ import { CurrencyControl as g } from "./currency.js";
10
10
  import { CURRENCY_CONTROL_ID as H } from "./currency.js";
11
11
  import { FiltersControl as R } from "./filters.js";
12
12
  import { FILTERS_CONTROL_ID as j } from "./filters.js";
13
- import { LocaleControl as N } from "./locale.js";
13
+ import { LocaleControl as y } from "./locale.js";
14
14
  import { LOCALE_CONTROL_ID as K } from "./locale.js";
15
- import { ProductLayoutControl as y } from "./productLayout.js";
15
+ import { ProductLayoutControl as _ } from "./productLayout.js";
16
16
  import { PRODUCT_LAYOUT_CONTROL_ID as J } from "./productLayout.js";
17
- import { ShuffleControl as _ } from "./shuffle.js";
17
+ import { ShuffleControl as N } from "./shuffle.js";
18
18
  import { SHUFFLE_CONTROL_ID as X } from "./shuffle.js";
19
- import { regenerateProductRowsWithStyles as b, getBlockElement as I, updateProductContentInPlace as P } from "./utils.js";
20
- import { formatProductPrice as tt, getCardComposition as et, getCurrentLayout as ot, reapplySpacing as rt, regenerateMobileProductRows as it, regenerateProductRows as nt, setCurrencyAttributes as st, updatePricesInPlace as ct, updateSingleProductContent as at } from "./utils.js";
21
- import { useDebounceFn as u } from "../../../../../node_modules/@vueuse/shared/index.js";
19
+ import { regenerateProductRowsWithStyles as b, getBlockElement as P, updateProductContentInPlace as I } from "./utils.js";
20
+ import { formatProductPrice as tt, getCardComposition as et, getCurrentLayout as ot, reapplySpacing as rt, regenerateMobileProductRows as nt, regenerateProductRows as it, setCurrencyAttributes as st, updatePricesInPlace as ct, updateSingleProductContent as at } from "./utils.js";
21
+ import { useDebounceFn as l } from "../../../../../node_modules/@vueuse/shared/index.js";
22
22
  const T = "recommendation-id", S = "ui-elements-recommendation-block";
23
- class z extends f {
23
+ class $ extends h {
24
24
  constructor() {
25
25
  super(...arguments);
26
26
  n(this, "store", C());
@@ -36,19 +36,19 @@ class z extends f {
36
36
  /**
37
37
  * Debounced product fetch to prevent rapid API calls during config changes
38
38
  */
39
- n(this, "_debouncedFetchProducts", u(() => {
39
+ n(this, "_debouncedFetchProducts", l(() => {
40
40
  this.store.fetchRecommendationProducts();
41
41
  }, 500));
42
42
  /**
43
43
  * Debounced regeneration when products arrive from API
44
44
  * Tries in-place update first to preserve styles, falls back to full regeneration
45
45
  */
46
- n(this, "_debouncedRegenerateWithProducts", u(() => {
46
+ n(this, "_debouncedRegenerateWithProducts", l(() => {
47
47
  const t = this.store.recommendationProducts;
48
48
  if (!this.currentNode || !this.api)
49
49
  return;
50
50
  const e = this.api.getDocumentModifier();
51
- P({
51
+ I({
52
52
  currentNode: this.currentNode,
53
53
  documentModifier: e,
54
54
  products: t
@@ -59,7 +59,7 @@ class z extends f {
59
59
  return S;
60
60
  }
61
61
  getTemplate() {
62
- return this.algorithmControl = new p(), this.localeControl = new N(), this.currencyControl = new g(), this.productLayoutControl = new y(), this.filtersControl = new R(), this.shuffleControl = new _(), `
62
+ return this.algorithmControl = new p(), this.localeControl = new y(), this.currencyControl = new g(), this.productLayoutControl = new _(), this.filtersControl = new R(), this.shuffleControl = new N(), `
63
63
  <div class="recommendation-controls-container">
64
64
  ${this.algorithmControl.getTemplate()}
65
65
  ${this.localeControl.getTemplate()}
@@ -95,19 +95,19 @@ class z extends f {
95
95
  });
96
96
  }
97
97
  onTemplateNodeUpdated(t) {
98
- var r;
98
+ var i;
99
99
  super.onTemplateNodeUpdated(t);
100
100
  const e = this._getRecommendationIdFromNode(t);
101
- e !== null && e !== this.store.currentRecommendationId && this.store.setCurrentBlock(e), this._syncNodeConfigToStore(), e !== null && !((r = this.store.blockStates[e]) != null && r.isInitialized) && this._fetchBlockData(e), [
101
+ e !== null && e !== this.store.currentRecommendationId && this.store.setCurrentBlock(e), this._syncNodeConfigToStore(), e !== null && !((i = this.store.blockStates[e]) != null && i.isInitialized) && this._fetchBlockData(e), [
102
102
  this.algorithmControl,
103
103
  this.localeControl,
104
104
  this.currencyControl,
105
105
  this.productLayoutControl,
106
106
  this.filtersControl,
107
107
  this.shuffleControl
108
- ].forEach((i) => {
108
+ ].forEach((r) => {
109
109
  var a;
110
- i != null && i.api && (i.currentNode = t, (a = i.onTemplateNodeUpdated) == null || a.call(i, t));
110
+ r != null && r.api && (r.currentNode = t, (a = r.onTemplateNodeUpdated) == null || a.call(r, t));
111
111
  });
112
112
  }
113
113
  onDestroy() {
@@ -152,17 +152,13 @@ class z extends f {
152
152
  * values are being prepared for the upcoming initial fetch.
153
153
  */
154
154
  _syncNodeConfigToStore() {
155
- var r;
156
- const t = l.getConfig(this.currentNode), e = this.store.currentRecommendationId, o = e !== null && ((r = this.store.blockStates[e]) == null ? void 0 : r.isInitialized);
155
+ const t = f.getConfig(this.currentNode);
157
156
  this.store.patchCurrentBlockConfig({
158
157
  strategy: t.strategy,
159
158
  language: t.language,
160
159
  size: t.size,
161
160
  productIds: t.productIds,
162
- // Only sync filters from node config during initial load.
163
- // After initialization, the Pinia store is the source of truth
164
- // for filters (edited via the filter drawer).
165
- ...o ? {} : { filters: t.filters },
161
+ filters: t.filters,
166
162
  shuffleProducts: t.shuffleProducts,
167
163
  currencySettings: {
168
164
  name: t.currency.code,
@@ -185,26 +181,26 @@ class z extends f {
185
181
  this.store.fetchRecommendationFilters(),
186
182
  this.store.fetchRecommendationCreateData(),
187
183
  this.store.fetchRecommendationProducts()
188
- ])).forEach((o, r) => {
184
+ ])).forEach((o, i) => {
189
185
  o.status === "rejected" && console.warn(`Recommendation block: ${[
190
186
  "fetchRecommendationFilters",
191
187
  "fetchRecommendationCreateData",
192
188
  "fetchRecommendationProducts"
193
- ][r]} failed`, o.reason);
189
+ ][i]} failed`, o.reason);
194
190
  });
195
191
  }
196
192
  /**
197
193
  * Reads the recommendation-id attribute from the block element within the node
198
194
  */
199
195
  _getRecommendationIdFromNode(t) {
200
- const e = I(t);
196
+ const e = P(t);
201
197
  if (!e || !("getAttribute" in e))
202
198
  return null;
203
199
  const o = e.getAttribute(T);
204
200
  if (!o)
205
201
  return null;
206
- const r = parseInt(o);
207
- return Number.isNaN(r) ? null : r;
202
+ const i = parseInt(o);
203
+ return Number.isNaN(i) ? null : i;
208
204
  }
209
205
  /**
210
206
  * Listen to store changes that require product refresh or regeneration.
@@ -217,27 +213,12 @@ class z extends f {
217
213
  const { store: t } = this;
218
214
  let e = t.recommendationProducts, o = t.$state.configVersion;
219
215
  this.storeUnsubscription = t.$subscribe(() => {
220
- const r = t.$state.configVersion;
221
- r !== o && (o = r, this._persistFiltersToNodeConfig(), this._debouncedFetchProducts());
222
- const i = t.recommendationProducts, a = i !== e, d = Array.isArray(i) && i.length > 0;
223
- a && d && (e = i, this._debouncedRegenerateWithProducts());
216
+ const i = t.$state.configVersion;
217
+ i !== o && (o = i, this._debouncedFetchProducts());
218
+ const r = t.recommendationProducts, a = r !== e, u = Array.isArray(r) && r.length > 0;
219
+ a && u && (e = r, this._debouncedRegenerateWithProducts());
224
220
  });
225
221
  }
226
- /**
227
- * Persists the current filter state from Pinia store to the Stripo node config.
228
- * This ensures filters survive template save/reload cycles.
229
- */
230
- _persistFiltersToNodeConfig() {
231
- if (!this.currentNode || !this.api)
232
- return;
233
- const { filters: t } = this.store.recommendationConfigs;
234
- l.updateConfig(
235
- this.api,
236
- this.currentNode,
237
- { filters: t },
238
- "Update recommendation filters"
239
- );
240
- }
241
222
  }
242
223
  export {
243
224
  W as ALGORITHM_CONTROL_ID,
@@ -248,22 +229,22 @@ export {
248
229
  j as FILTERS_CONTROL_ID,
249
230
  R as FiltersControl,
250
231
  K as LOCALE_CONTROL_ID,
251
- N as LocaleControl,
232
+ y as LocaleControl,
252
233
  J as PRODUCT_LAYOUT_CONTROL_ID,
253
- y as ProductLayoutControl,
254
- z as RecommendationBlockControl,
234
+ _ as ProductLayoutControl,
235
+ $ as RecommendationBlockControl,
255
236
  X as SHUFFLE_CONTROL_ID,
256
- _ as ShuffleControl,
237
+ N as ShuffleControl,
257
238
  tt as formatProductPrice,
258
- I as getBlockElement,
239
+ P as getBlockElement,
259
240
  et as getCardComposition,
260
241
  ot as getCurrentLayout,
261
242
  rt as reapplySpacing,
262
- it as regenerateMobileProductRows,
263
- nt as regenerateProductRows,
243
+ nt as regenerateMobileProductRows,
244
+ it as regenerateProductRows,
264
245
  b as regenerateProductRowsWithStyles,
265
246
  st as setCurrencyAttributes,
266
247
  ct as updatePricesInPlace,
267
- P as updateProductContentInPlace,
248
+ I as updateProductContentInPlace,
268
249
  at as updateSingleProductContent
269
250
  };