@useinsider/guido 3.2.1-beta.d58ee72 → 3.3.0-beta.1778fd7

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 (158) hide show
  1. package/README.md +117 -1
  2. package/dist/@types/config/schemas.js +153 -95
  3. package/dist/components/Guido.vue.js +4 -4
  4. package/dist/components/Guido.vue2.js +106 -90
  5. package/dist/components/organisms/AutoSaveController.vue.js +17 -0
  6. package/dist/components/organisms/AutoSaveController.vue2.js +13 -0
  7. package/dist/components/organisms/extensions/recommendation/FilterItem.vue.js +9 -11
  8. package/dist/components/organisms/extensions/recommendation/FilterItem.vue2.js +70 -35
  9. package/dist/components/organisms/header/AutoSaveToggle.vue.js +22 -0
  10. package/dist/components/organisms/header/AutoSaveToggle.vue2.js +19 -0
  11. package/dist/components/organisms/header/MiddleSlot.vue.js +7 -7
  12. package/dist/components/organisms/header/RightSlot.vue.js +8 -8
  13. package/dist/components/organisms/header/RightSlot.vue2.js +9 -8
  14. package/dist/components/organisms/onboarding/AMPOnboarding.vue2.js +51 -31
  15. package/dist/components/organisms/onboarding/GenericOnboarding.vue.js +1 -1
  16. package/dist/components/organisms/onboarding/GenericOnboarding.vue2.js +23 -22
  17. package/dist/components/organisms/onboarding/ItemsOnboarding.vue.js +1 -1
  18. package/dist/components/organisms/onboarding/ItemsOnboarding.vue2.js +37 -39
  19. package/dist/components/organisms/onboarding/TextBlockOnboarding.vue.js +3 -3
  20. package/dist/components/organisms/onboarding/TextBlockOnboarding.vue2.js +30 -41
  21. package/dist/components/organisms/onboarding/VersionHistoryOnboarding.vue2.js +15 -14
  22. package/dist/composables/useAutoSave.js +71 -0
  23. package/dist/composables/useCortexBlueprintBridge.js +66 -0
  24. package/dist/composables/useEmailTemplateApplier.js +41 -0
  25. package/dist/composables/useFullStoryBridge.js +14 -0
  26. package/dist/composables/useGuidoStateBridge.js +48 -0
  27. package/dist/composables/useHtmlValidator.js +41 -36
  28. package/dist/composables/useRecommendation.js +46 -26
  29. package/dist/composables/useRibbonOffset.js +21 -0
  30. package/dist/composables/useSave.js +19 -16
  31. package/dist/composables/useStripo.js +66 -62
  32. package/dist/composables/validators/useCouponBlockValidator.js +24 -0
  33. package/dist/config/compiler/recommendationCompilerRules.js +25 -25
  34. package/dist/config/compiler/unsubscribeCompilerRules.js +40 -37
  35. package/dist/config/compiler/utils/recommendationCompilerUtils.js +107 -71
  36. package/dist/config/migrator/index.js +20 -9
  37. package/dist/config/migrator/radioButtonMigrator.js +92 -47
  38. package/dist/config/migrator/recommendation/compositionMapper.js +98 -0
  39. package/dist/config/migrator/recommendation/extractors.js +27 -0
  40. package/dist/config/migrator/recommendation/htmlBuilder.js +496 -0
  41. package/dist/config/migrator/recommendation/parseLegacyConfig.js +33 -0
  42. package/dist/config/migrator/recommendation/settingsMapper.js +70 -0
  43. package/dist/config/migrator/recommendation/themeMapper.js +93 -0
  44. package/dist/config/migrator/recommendationMigrator.js +74 -290
  45. package/dist/enums/extensions/recommendationBlock.js +103 -47
  46. package/dist/enums/onboarding.js +7 -2
  47. package/dist/enums/unsubscribe.js +39 -31
  48. package/dist/extensions/Blocks/Checkbox/control.js +23 -23
  49. package/dist/extensions/Blocks/RadioButton/control.js +15 -15
  50. package/dist/extensions/Blocks/RadioButton/template.js +7 -7
  51. package/dist/extensions/Blocks/Recommendation/block.js +60 -50
  52. package/dist/extensions/Blocks/Recommendation/constants/controlIds.js +1 -1
  53. package/dist/extensions/Blocks/Recommendation/constants/defaultConfig.js +5 -5
  54. package/dist/extensions/Blocks/Recommendation/controls/customAttribute/index.js +21 -18
  55. package/dist/extensions/Blocks/Recommendation/controls/customAttribute/textTrim.js +99 -0
  56. package/dist/extensions/Blocks/Recommendation/controls/main/algorithm.js +27 -26
  57. package/dist/extensions/Blocks/Recommendation/controls/main/index.js +3 -1
  58. package/dist/extensions/Blocks/Recommendation/controls/main/utils.js +228 -181
  59. package/dist/extensions/Blocks/Recommendation/controls/name/textTrim.js +27 -57
  60. package/dist/extensions/Blocks/Recommendation/controls/shared/textTrimCssRules.js +14 -0
  61. package/dist/extensions/Blocks/Recommendation/services/configService.js +76 -33
  62. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +18 -17
  63. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +144 -91
  64. package/dist/extensions/Blocks/Recommendation/templates/grid/elementRenderer.js +19 -10
  65. package/dist/extensions/Blocks/Recommendation/templates/grid/template.js +8 -8
  66. package/dist/extensions/Blocks/Recommendation/templates/list/elementRenderer.js +25 -15
  67. package/dist/extensions/Blocks/Recommendation/templates/list/template.js +11 -11
  68. package/dist/extensions/Blocks/Recommendation/templates/utils.js +1 -1
  69. package/dist/extensions/Blocks/Recommendation/utils/filterUtil.js +31 -15
  70. package/dist/extensions/Blocks/Recommendation/utils/legacyStrategyMap.js +21 -0
  71. package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +13 -22
  72. package/dist/extensions/Blocks/Recommendation/validation/requiredFields.js +33 -0
  73. package/dist/guido.css +1 -1
  74. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +393 -264
  75. package/dist/node_modules/valibot/dist/index.js +450 -235
  76. package/dist/package.json.js +1 -1
  77. package/dist/services/templateLibraryApi.js +5 -4
  78. package/dist/services/unsubscribeApi.js +6 -6
  79. package/dist/src/@types/config/defaults.d.ts +5 -1
  80. package/dist/src/@types/config/index.d.ts +3 -3
  81. package/dist/src/@types/config/schemas.d.ts +217 -0
  82. package/dist/src/@types/config/types.d.ts +9 -1
  83. package/dist/src/components/Guido.vue.d.ts +1 -1
  84. package/dist/src/components/organisms/AutoSaveController.vue.d.ts +2 -0
  85. package/dist/src/components/organisms/header/AutoSaveToggle.vue.d.ts +2 -0
  86. package/dist/src/components/organisms/header/EditorActions.vue.d.ts +1 -1
  87. package/dist/src/components/organisms/header/HeaderWrapper.vue.d.ts +1 -1
  88. package/dist/src/components/organisms/header/RightSlot.vue.d.ts +1 -1
  89. package/dist/src/components/wrappers/WpModal.vue.d.ts +1 -1
  90. package/dist/src/composables/useAutoSave.d.ts +3 -0
  91. package/dist/src/composables/useConfig.d.ts +58 -0
  92. package/dist/src/composables/useCortexBlueprintBridge.d.ts +25 -0
  93. package/dist/src/composables/useEmailTemplateApplier.d.ts +21 -0
  94. package/dist/src/composables/useFullStoryBridge.d.ts +11 -0
  95. package/dist/src/composables/useGuidoStateBridge.d.ts +22 -0
  96. package/dist/src/composables/useRecommendation.d.ts +10 -1
  97. package/dist/src/composables/useRecommendation.test.d.ts +1 -0
  98. package/dist/src/composables/useRibbonOffset.d.ts +4 -0
  99. package/dist/src/composables/useSave.d.ts +1 -1
  100. package/dist/src/composables/validators/useCouponBlockValidator.d.ts +3 -0
  101. package/dist/src/config/migrator/index.d.ts +2 -1
  102. package/dist/src/config/migrator/recommendation/compositionMapper.d.ts +2 -0
  103. package/dist/src/config/migrator/recommendation/compositionMapper.test.d.ts +1 -0
  104. package/dist/src/config/migrator/recommendation/extractors.d.ts +7 -0
  105. package/dist/src/config/migrator/recommendation/extractors.test.d.ts +1 -0
  106. package/dist/src/config/migrator/recommendation/htmlBuilder.d.ts +11 -0
  107. package/dist/src/config/migrator/recommendation/parseLegacyConfig.d.ts +15 -0
  108. package/dist/src/config/migrator/recommendation/parseLegacyConfig.test.d.ts +1 -0
  109. package/dist/src/config/migrator/recommendation/settingsMapper.d.ts +7 -0
  110. package/dist/src/config/migrator/recommendation/settingsMapper.test.d.ts +1 -0
  111. package/dist/src/config/migrator/recommendation/themeMapper.d.ts +5 -0
  112. package/dist/src/config/migrator/recommendation/themeMapper.test.d.ts +1 -0
  113. package/dist/src/config/migrator/recommendation/types.d.ts +205 -0
  114. package/dist/src/config/migrator/recommendationMigrator.d.ts +13 -1
  115. package/dist/src/config/migrator/recommendationMigrator.test.d.ts +1 -0
  116. package/dist/src/enums/extensions/recommendationBlock.d.ts +6 -1
  117. package/dist/src/enums/onboarding.d.ts +6 -0
  118. package/dist/src/enums/unsubscribe.d.ts +13 -3
  119. package/dist/src/extensions/Blocks/RadioButton/template.d.ts +1 -1
  120. package/dist/src/extensions/Blocks/Recommendation/constants/controlIds.d.ts +1 -0
  121. package/dist/src/extensions/Blocks/Recommendation/controls/customAttribute/index.d.ts +3 -0
  122. package/dist/src/extensions/Blocks/Recommendation/controls/customAttribute/textTrim.d.ts +35 -0
  123. package/dist/src/extensions/Blocks/Recommendation/controls/main/utils.test.d.ts +1 -0
  124. package/dist/src/extensions/Blocks/Recommendation/controls/name/textTrim.d.ts +3 -20
  125. package/dist/src/extensions/Blocks/Recommendation/controls/shared/textTrimCssRules.d.ts +29 -0
  126. package/dist/src/extensions/Blocks/Recommendation/services/configService.d.ts +21 -3
  127. package/dist/src/extensions/Blocks/Recommendation/services/configService.test.d.ts +1 -0
  128. package/dist/src/extensions/Blocks/Recommendation/store/recommendation.d.ts +41 -1
  129. package/dist/src/extensions/Blocks/Recommendation/types/nodeConfig.d.ts +1 -1
  130. package/dist/src/extensions/Blocks/Recommendation/utils/filterUtil.d.ts +2 -0
  131. package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMap.d.ts +21 -0
  132. package/dist/src/extensions/Blocks/Recommendation/utils/legacyStrategyMap.test.d.ts +1 -0
  133. package/dist/src/extensions/Blocks/Recommendation/utils/preserveTextStyles.d.ts +0 -3
  134. package/dist/src/extensions/Blocks/Recommendation/validation/requiredFields.d.ts +21 -0
  135. package/dist/src/library.d.ts +1 -1
  136. package/dist/src/stores/autosave.d.ts +12 -0
  137. package/dist/src/stores/config.d.ts +522 -0
  138. package/dist/src/stores/editor.d.ts +23 -0
  139. package/dist/src/stores/guido-email-editor.d.ts +41 -0
  140. package/dist/src/stores/onboarding.d.ts +4 -0
  141. package/dist/src/utils/htmlEscape.d.ts +5 -0
  142. package/dist/src/utils/htmlEscape.test.d.ts +1 -0
  143. package/dist/src/utils/timeUtil.d.ts +8 -0
  144. package/dist/static/styles/components/button.css.js +16 -9
  145. package/dist/static/styles/components/loader.css.js +4 -0
  146. package/dist/static/styles/components/narrow-panel.css.js +52 -0
  147. package/dist/stores/autosave.js +17 -0
  148. package/dist/stores/editor.js +3 -1
  149. package/dist/stores/guido-email-editor.js +20 -0
  150. package/dist/stores/onboarding.js +4 -0
  151. package/dist/utils/htmlEscape.js +13 -0
  152. package/dist/utils/pairProductVariables.js +89 -88
  153. package/dist/utils/templatePreparation.js +74 -27
  154. package/dist/utils/timeUtil.js +19 -0
  155. package/package.json +7 -3
  156. package/dist/enums/displayConditions.js +0 -80
  157. package/dist/extensions/Blocks/Recommendation/templates/grid/migration.js +0 -251
  158. package/dist/src/enums/displayConditions.d.ts +0 -2
@@ -263,4 +263,27 @@ export declare const useEditorStore: import("pinia").StoreDefinition<"guidoEdito
263
263
  templateId: string;
264
264
  syncModulesEnabled: boolean;
265
265
  }>) => boolean;
266
+ isInSaveableState: (state: {
267
+ loadingStatus: boolean;
268
+ isCodeEditorOpen: boolean;
269
+ isSaveAsTemplateDrawerOpen: boolean;
270
+ isVersionHistoryOpen: boolean;
271
+ isPreviewModeOpen: boolean;
272
+ editorVisualMode: string;
273
+ hasChanges: boolean;
274
+ isStripoInitialized: boolean;
275
+ templateId: string;
276
+ syncModulesEnabled: boolean;
277
+ } & import("pinia").PiniaCustomStateProperties<{
278
+ loadingStatus: boolean;
279
+ isCodeEditorOpen: boolean;
280
+ isSaveAsTemplateDrawerOpen: boolean;
281
+ isVersionHistoryOpen: boolean;
282
+ isPreviewModeOpen: boolean;
283
+ editorVisualMode: string;
284
+ hasChanges: boolean;
285
+ isStripoInitialized: boolean;
286
+ templateId: string;
287
+ syncModulesEnabled: boolean;
288
+ }>) => boolean;
266
289
  }, {}>;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Outbound contract Guido publishes to the host's shared Pinia singleton so
3
+ * cortex-fe can pick up the current editor state and forward it as
4
+ * `clientState.editor` on the next chat-stream POST.
5
+ *
6
+ * State + getters only — `useGuidoStateBridge` writes via `$patch`, no actions
7
+ * live here (architecture invariant).
8
+ *
9
+ * Store id `guidoEmailEditor` is cross-MFE: cortex-fe reads it via
10
+ * `pinia._s.get('guidoEmailEditor')` at runtime. The internal Guido editor
11
+ * store keeps id `guidoEditor` — these are intentionally separate. The
12
+ * internal store carries UI state that cortex-fe should not see; this public
13
+ * store carries the contract Guido is willing to share.
14
+ */
15
+ export declare const useGuidoEmailEditorStore: import("pinia").StoreDefinition<"guidoEmailEditor", {
16
+ /** Current Stripo HTML — stripe tables only, no DOCTYPE/wrapper. */
17
+ html: string;
18
+ /** Current Stripo CSS — es-p* utility classes used by the html. */
19
+ css: string;
20
+ /** Wall-clock ms when html/css were last written by the bridge. */
21
+ lastUpdatedAt: number;
22
+ /** Template id from the editor config, for cortex-fe to scope per-template. */
23
+ templateId: string;
24
+ }, {
25
+ /** True once the bridge has published at least one snapshot. */
26
+ hasSnapshot: (state: {
27
+ html: string;
28
+ css: string;
29
+ lastUpdatedAt: number;
30
+ templateId: string;
31
+ } & import("pinia").PiniaCustomStateProperties<{
32
+ /** Current Stripo HTML — stripe tables only, no DOCTYPE/wrapper. */
33
+ html: string;
34
+ /** Current Stripo CSS — es-p* utility classes used by the html. */
35
+ css: string;
36
+ /** Wall-clock ms when html/css were last written by the bridge. */
37
+ lastUpdatedAt: number;
38
+ /** Template id from the editor config, for cortex-fe to scope per-template. */
39
+ templateId: string;
40
+ }>) => boolean;
41
+ }, {}>;
@@ -1392,6 +1392,10 @@ export declare const useOnboardingStore: import("pinia").StoreDefinition<"guidoO
1392
1392
  close(type: OnboardingType): Promise<void>;
1393
1393
  next(type: OnboardingType): void;
1394
1394
  previous(type: OnboardingType): void;
1395
+ updateCardPosition(type: OnboardingType, cardIndex: number, position: {
1396
+ top: string;
1397
+ position: string;
1398
+ }): void;
1395
1399
  setConfig(type: OnboardingType, config: OnboardingCardConfig[]): void;
1396
1400
  onDiscoverNowClicked(): Promise<void>;
1397
1401
  onRemindMeLater(): void;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Escape HTML special characters for safe inclusion in attribute values
3
+ * or text content. Use for any string that may contain untrusted input.
4
+ */
5
+ export declare function escapeHtml(text: string): string;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Formats a Date as local time in 24-hour format.
3
+ * Pass `useTimezone = true` to append the UTC offset and city name — useful when the
4
+ * timestamp must clearly communicate the client's timezone.
5
+ * @example formatLocalTime(date) -> 12:20:02
6
+ * @example formatLocalTime(date, true) -> 12:20:02 (UTC+3 Istanbul)
7
+ */
8
+ export declare const formatLocalTime: (date: Date, useTimezone?: boolean) => string;
@@ -1,4 +1,4 @@
1
- const o = `.control-shadow-wrapper:has(.button) {
1
+ const n = `.control-shadow-wrapper:has(.button) {
2
2
  border-radius: 0;
3
3
  box-shadow: none;
4
4
  background-color: transparent;
@@ -99,18 +99,12 @@ ue-check-button.checked:not(.flat-white) input:checked + label .icon-button {
99
99
  color: var(--guido-color-primary-500);
100
100
  }
101
101
 
102
- ue-select.full-width .button {
103
- border: none !important;
104
- background-color: var(--guido-color-neutral-200) !important;
105
- color: var(--guido-color-neutral-800) !important;
106
- }
107
-
108
102
  ue-select.full-width .button .icon-button {
109
103
  color: var(--guido-color-gray-600) !important;
110
104
  }
111
105
 
112
106
  ue-select.full-width .button:hover:not(:disabled,.disabled) {
113
- background-color: var(--guido-color-neutral-100) !important;
107
+ background-color: var(--guido-color-gray-0) !important;
114
108
  }
115
109
 
116
110
  ue-color {
@@ -130,7 +124,20 @@ ue-select-text-input .select-text-input-toggle .button {
130
124
  justify-content: center;
131
125
  background-color: transparent !important;
132
126
  }
127
+
128
+
129
+ .control-shadow-wrapper,
130
+ ue-button:not(.no-shadow,.flat-white),
131
+ ue-toggle:not(.no-shadow,.flat-white),
132
+ :is(ue-popover-toggler,ue-toggle-icon-picker,ue-emoji-toggle),
133
+ .button-group,
134
+ ue-counter:not(.no-shadow),
135
+ :is(ue-select,ue-mergetags,ue-font-family-select):not(.no-shadow),
136
+ ue-check-button:not(.no-shadow,.flat-white) {
137
+ background: none;
138
+ padding: 0;
139
+ }
133
140
  `;
134
141
  export {
135
- o as default
142
+ n as default
136
143
  };
@@ -4,6 +4,10 @@ const n = `ue-loader-component.full-height {
4
4
  z-index: 9;
5
5
  backdrop-filter: blur(2px);
6
6
  }
7
+
8
+ ue-loader-component .service-element.loader {
9
+ box-shadow: var(--guido-color-primary-500) 1px 1px 0 0 !important;
10
+ }
7
11
  `;
8
12
  export {
9
13
  n as default
@@ -28,6 +28,58 @@ ue-stripe-thumb:hover:not(.disabled),
28
28
  border-color: var(--guido-color-primary-500);
29
29
  }
30
30
 
31
+ /* Module search — initial */
32
+ .module-search-container {
33
+ background-color: var(--guido-color-gray-0);
34
+ border: 1px solid var(--guido-color-gray-300);
35
+ border-radius: 4px;
36
+ }
37
+
38
+ .module-search-container .service-element {
39
+ background-color: unset;
40
+ }
41
+
42
+ .module-filter-toggle {
43
+ top: -1px !important;
44
+ right: -1px !important;
45
+ }
46
+
47
+ .module-filter-toggle > .button,
48
+ .module-search-container:hover .module-filter-toggle > .button {
49
+ border: none;
50
+ background: transparent;
51
+ }
52
+
53
+ /* Module search — hover */
54
+ .module-search-container:has(.module-search-chip-input:hover) {
55
+ border-color: var(--guido-color-primary-500);
56
+ }
57
+
58
+ .module-search-container .module-search-chip-input .service-element:hover {
59
+ background-color: var(--guido-color-gray-0);
60
+ border-radius: 4px;
61
+ }
62
+
63
+ .module-search-container .module-filter-toggle:hover > .button {
64
+ background-color: var(--guido-color-gray-1);
65
+ }
66
+
67
+ /* Module search — selected (.on) */
68
+ .module-search-container:has(.module-search-chip-input.on),
69
+ .module-search-container:has(.module-search-chip-input.on):hover {
70
+ border-color: var(--guido-color-primary-500);
71
+ box-shadow: 0 0 0 3px var(--guido-color-primary-200) !important;
72
+ }
73
+
74
+ .module-search-container .module-search-chip-input.on .input-section {
75
+ background-color: unset;
76
+ box-shadow: unset;
77
+ }
78
+
79
+ .module-categories-list .menu-item {
80
+ padding: 8px 20px !important;
81
+ }
82
+
31
83
  .modules-layout-wrapper {
32
84
  padding: 0 16px 16px;
33
85
  grid-row-gap: 16px;
@@ -0,0 +1,17 @@
1
+ import { defineStore as e } from "pinia";
2
+ const t = {
3
+ IDLE: "idle",
4
+ SAVING: "saving",
5
+ SAVED: "saved",
6
+ ERROR: "error"
7
+ }, o = e("guidoAutosave", {
8
+ state: () => ({
9
+ isOn: !1,
10
+ lastSavedAt: null,
11
+ status: t.IDLE
12
+ })
13
+ });
14
+ export {
15
+ t as AUTOSAVE_STATUS,
16
+ o as useAutosaveStore
17
+ };
@@ -25,7 +25,9 @@ const o = e("guidoEditor", {
25
25
  isExportButtonDisabled: (i) => i.loadingStatus || i.isVersionHistoryOpen,
26
26
  isSaveAsButtonDisabled: (i) => i.loadingStatus || i.isVersionHistoryOpen,
27
27
  isTestButtonDisabled: (i) => i.loadingStatus || i.isVersionHistoryOpen,
28
- isSaveButtonDisabled: (i) => i.loadingStatus || i.isVersionHistoryOpen || i.isPreviewModeOpen
28
+ isSaveButtonDisabled: (i) => i.loadingStatus || i.isVersionHistoryOpen || i.isPreviewModeOpen,
29
+ // Autosave
30
+ isInSaveableState: (i) => !i.loadingStatus && !i.isVersionHistoryOpen && !i.isPreviewModeOpen && !i.isCodeEditorOpen
29
31
  }
30
32
  });
31
33
  export {
@@ -0,0 +1,20 @@
1
+ import { defineStore as e } from "pinia";
2
+ const d = e("guidoEmailEditor", {
3
+ state: () => ({
4
+ /** Current Stripo HTML — stripe tables only, no DOCTYPE/wrapper. */
5
+ html: "",
6
+ /** Current Stripo CSS — es-p* utility classes used by the html. */
7
+ css: "",
8
+ /** Wall-clock ms when html/css were last written by the bridge. */
9
+ lastUpdatedAt: 0,
10
+ /** Template id from the editor config, for cortex-fe to scope per-template. */
11
+ templateId: ""
12
+ }),
13
+ getters: {
14
+ /** True once the bridge has published at least one snapshot. */
15
+ hasSnapshot: (t) => t.lastUpdatedAt > 0 && t.html !== ""
16
+ }
17
+ });
18
+ export {
19
+ d as useGuidoEmailEditorStore
20
+ };
@@ -71,6 +71,10 @@ const t = () => ({
71
71
  previous(n) {
72
72
  this.onboardings[n].cardIndex > 0 && this.onboardings[n].cardIndex--;
73
73
  },
74
+ updateCardPosition(n, i, o) {
75
+ const s = this.onboardings[n].config[i];
76
+ s && (s.top = o.top, s.position = o.position);
77
+ },
74
78
  setConfig(n, i) {
75
79
  this.onboardings[n].config = i ?? [], this.onboardings[n].cardIndex >= this.onboardings[n].config.length && (this.onboardings[n].cardIndex = 0);
76
80
  },
@@ -0,0 +1,13 @@
1
+ const c = {
2
+ "&": "&amp;",
3
+ "<": "&lt;",
4
+ ">": "&gt;",
5
+ '"': "&quot;",
6
+ "'": "&#x27;"
7
+ };
8
+ function n(t) {
9
+ return t.replace(/[&<>"']/g, (e) => c[e]);
10
+ }
11
+ export {
12
+ n as escapeHtml
13
+ };
@@ -1,84 +1,85 @@
1
- import { productPairs as P } from "../extensions/Blocks/Items/enums/productEnums.js";
2
- function L(F) {
3
- const R = F.replaceAll("{%", "<!--{%").replaceAll("%}", "%}-->"), $ = new DOMParser().parseFromString(R, "text/html"), y = P.PAIRS_FOR_EXTENSION;
4
- Object.entries(y).forEach(([n, l]) => {
5
- $.querySelectorAll(".ins-product-td").forEach((c) => {
6
- const E = c.getAttribute("data-number") || "1", T = c.getAttribute("data-type") || "CART_ITEMS";
7
- c.querySelectorAll(`[product-attr="${n}"]`).forEach((e) => {
8
- var H;
9
- const b = e.getAttribute("data-type") || T, u = e.getAttribute("data-number") || E, p = l[b];
10
- if (p)
11
- switch (n) {
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)
11
+ switch (r) {
12
12
  case "imageSrc": {
13
- let t = null, o = null;
14
- if (e.tagName === "IMG" ? (t = e, o = t.closest("a")) : (t = e.querySelector("img"), o = e.querySelector("a") || e.closest("a")), !t)
13
+ let t = null, i = null;
14
+ if (e.tagName === "IMG" ? (t = e, i = t.closest("a")) : (t = e.querySelector("img"), i = e.querySelector("a") || e.closest("a")), !t)
15
15
  break;
16
- const i = p.DEFAULT, a = p.ATTR;
17
- if (i && t.src) {
18
- const r = t.src;
19
- i.some((f) => {
20
- const s = f.split("/").pop() || "", _ = r.split("/").pop() || "";
21
- return r.includes(f) || r.includes(s) || _ === s;
22
- }) && (t.src = `{{${a}_${u}}}`);
16
+ const a = u.DEFAULT, s = u.ATTR;
17
+ if (a && t.src) {
18
+ const c = t.src;
19
+ 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}}}`);
23
23
  }
24
- if (o) {
25
- const r = (H = y.itemLink) == null ? void 0 : H[b];
26
- if (r) {
27
- const d = r.HREF, f = r.DEFAULT_HREF || "#!", s = o.href;
28
- (s === "#" || s === "" || s.endsWith("#!") || s.endsWith(f) || s === `${window.location.href}${f}` || !s || s === window.location.href) && (o.href = `{{${d}_${u}}}`);
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}}}`);
29
30
  }
30
31
  }
31
32
  break;
32
33
  }
33
34
  case "name": {
34
- const t = p, o = t.ATTR, i = t.DEFAULT_HREF || "#!", a = t.HREF;
35
- e.textContent && (e.textContent = `{{${o}_${u}}}`);
36
- const r = e.closest("a") || (e.tagName === "A" ? e : null);
37
- if (r && a) {
38
- const d = r.href, f = `${window.location.href}${i}`;
39
- (d === f || d.endsWith(i)) && (r.href = `{{${a}_${u}}}`);
35
+ const t = u, i = t.ATTR, a = t.DEFAULT_HREF || "#!", s = t.HREF;
36
+ e.textContent && (e.textContent = `{{${i}_${d}}}`);
37
+ const n = e.closest("a") || (e.tagName === "A" ? e : null);
38
+ if (n && s) {
39
+ const c = n.href, E = `${window.location.href}${a}`;
40
+ (c === E || c.endsWith(a)) && (n.href = `{{${s}_${d}}}`);
40
41
  }
41
42
  break;
42
43
  }
43
44
  case "price":
44
45
  case "originalPrice": {
45
- const t = p, o = e.getAttribute("data-formated"), i = e.getAttribute("data-single_price"), a = o === "true", r = i === "true", d = e.getAttribute("data-curency") || "before";
46
- let f;
47
- r ? f = a ? t.SINGLE_PRICE_FORMATTED : t.SINGLE_PRICE : f = a ? t.PRICE_FORMATTED : t.PRICE;
48
- const s = t.CURRENCY;
49
- let _ = `{{${f}_${u}}}`;
50
- if (s) {
51
- const k = `{{${s}_${u}}}`;
52
- _ = d === "after" ? `${_} ${k}` : `${k} ${_}`;
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
+ let E;
48
+ n ? E = s ? t.SINGLE_PRICE_FORMATTED : t.SINGLE_PRICE : E = s ? t.PRICE_FORMATTED : t.PRICE;
49
+ 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}`;
53
54
  }
54
- e.textContent = _;
55
+ e.textContent = l;
55
56
  break;
56
57
  }
57
58
  case "quantity": {
58
- const t = p, o = t.ATTR, i = t.DEFAULT;
59
- e.textContent && e.textContent.trim() === i && (e.textContent = `{{${o}_${u}}}`);
59
+ const t = u, i = t.ATTR, a = t.DEFAULT;
60
+ e.textContent && e.textContent.trim() === a && (e.textContent = `{{${i}_${d}}}`);
60
61
  break;
61
62
  }
62
63
  case "button": {
63
- const t = p, o = t.HREF, i = t.DEFAULT_HREF || "#!", a = e.tagName === "A" ? e : e.querySelector("a");
64
- if (a) {
65
- const r = a.href || "", d = `${window.location.href}${i}`;
66
- (r === "" || r === "#" || r === d || r.endsWith(i) || r.endsWith("#!") || r === window.location.href) && (a.href = `{{${o}_${u}}}`);
64
+ const t = u, i = t.HREF, a = t.DEFAULT_HREF || "#!", s = e.tagName === "A" ? e : e.querySelector("a");
65
+ 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}}}`);
67
68
  }
68
69
  break;
69
70
  }
70
71
  case "itemLink": {
71
- const t = p, o = t.HREF, i = t.DEFAULT_HREF || "#!", a = e;
72
- if (a.href) {
73
- const r = a.href, d = `${window.location.href}${i}`;
74
- (r === d || r.endsWith(i)) && (a.href = `{{${o}_${u}}}`);
72
+ const t = u, i = t.HREF, a = t.DEFAULT_HREF || "#!", s = e;
73
+ if (s.href) {
74
+ const n = s.href, c = `${window.location.href}${a}`;
75
+ (n === c || n.endsWith(a)) && (s.href = `{{${i}_${d}}}`);
75
76
  }
76
77
  break;
77
78
  }
78
79
  default: {
79
- if ("ATTR" in p) {
80
- const t = p.ATTR;
81
- e.textContent && (e.textContent = `{{${t}_${u}}}`);
80
+ if ("ATTR" in u) {
81
+ const t = u.ATTR;
82
+ e.textContent && (e.textContent = `{{${t}_${d}}}`);
82
83
  }
83
84
  break;
84
85
  }
@@ -86,55 +87,55 @@ function L(F) {
86
87
  });
87
88
  });
88
89
  });
89
- const S = R.match(/<!DOCTYPE[^>]*>/i), I = S ? `${S[0]}
90
- ` : "", w = $.querySelectorAll(".ins-product-td"), m = [];
91
- w.forEach((n) => {
92
- const l = n.getAttribute("data-type") || "CART_ITEMS", A = n.getAttribute("data-number") || "1", c = n.getAttribute("data-nodup"), E = n.outerHTML;
93
- m.push({
94
- element: n,
95
- outerHtml: E,
96
- type: l,
97
- number: A,
98
- nodup: c || void 0
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({
95
+ element: r,
96
+ outerHtml: A,
97
+ type: f,
98
+ number: p,
99
+ nodup: o || void 0
99
100
  });
100
101
  });
101
- let h = I + $.documentElement.outerHTML;
102
- m.reverse().forEach(({ outerHtml: n, type: l, number: A }) => {
103
- let c = "";
104
- switch (l) {
102
+ let _ = M + T.documentElement.outerHTML;
103
+ H.reverse().forEach(({ outerHtml: r, type: f, number: p }) => {
104
+ let o = "";
105
+ switch (f) {
105
106
  case "CART_ITEMS":
106
- c = "ins_apr_total_product_kind";
107
+ o = "ins_apr_total_product_kind";
107
108
  break;
108
109
  case "BROWSED_ITEMS":
109
- c = "browsed_item_total_product_kind";
110
+ o = "browsed_item_total_product_kind";
110
111
  break;
111
112
  case "PURCHASED_ITEMS":
112
- c = "purchased_item_total_product_kind";
113
+ o = "purchased_item_total_product_kind";
113
114
  break;
114
115
  }
115
- if (c) {
116
- const T = parseInt(A) - 1, b = `${`{% if ${c} > ${T} %}`}${n}{% endif %}`;
117
- h = h.replace(n, b);
116
+ if (o) {
117
+ const b = parseInt(p) - 1, $ = `${`{% if ${o} > ${b} %}`}${r}{% endif %}`;
118
+ _ = _.replace(r, $);
118
119
  }
119
120
  });
120
- const M = $.querySelectorAll('[product-attr="originalPrice"][data-type="CART_ITEMS"]'), g = [];
121
- return M.forEach((n) => {
122
- const l = n.getAttribute("data-number"), A = n.getAttribute("data-type");
123
- if (!l || A !== "CART_ITEMS")
121
+ const D = T.querySelectorAll('[product-attr="originalPrice"][data-type="CART_ITEMS"]'), R = [];
122
+ return D.forEach((r) => {
123
+ const f = r.getAttribute("data-number"), p = r.getAttribute("data-type");
124
+ if (!f || p !== "CART_ITEMS")
124
125
  return;
125
- const c = n.closest(".product-original-price-class");
126
- if (c) {
127
- const E = c.outerHTML;
128
- g.some((C) => C.tdOuterHtml === E) || g.push({ tdOuterHtml: E, number: l });
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 });
129
130
  }
130
- }), g.reverse().forEach(({ tdOuterHtml: n, number: l }) => {
131
- const A = `{% if ins_apr_price_${l} != ins_apr_originalprice_${l} %}`;
132
- if (!h.includes(A) && !n.includes("{% if")) {
133
- const E = `${A}${n}{% endif %}`;
134
- h = h.replace(n, E);
131
+ }), R.reverse().forEach(({ tdOuterHtml: r, number: f }) => {
132
+ const p = `{% if ins_apr_price_${f} != ins_apr_originalprice_${f} %}`;
133
+ if (!_.includes(p) && !r.includes("{% if")) {
134
+ const A = `${p}${r}{% endif %}`;
135
+ _ = _.replace(r, A);
135
136
  }
136
- }), h.replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("&lt;!--{%", "{%").replaceAll("%}--&gt;", "%}");
137
+ }), _.replaceAll("<!--{%", "{%").replaceAll("%}-->", "%}").replaceAll("&lt;!--{%", "{%").replaceAll("%}--&gt;", "%}");
137
138
  }
138
139
  export {
139
- L as pairProductVariables
140
+ q as pairProductVariables
140
141
  };