@useinsider/guido 1.4.4-beta.eb9b460 → 2.0.0-beta.061e9c9

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 (206) hide show
  1. package/README.md +297 -664
  2. package/dist/@types/config/defaults.js +44 -0
  3. package/dist/@types/config/schemas.js +233 -0
  4. package/dist/@types/config/validator.js +56 -0
  5. package/dist/components/Guido.vue.js +3 -3
  6. package/dist/components/Guido.vue2.js +68 -94
  7. package/dist/components/organisms/base/Toaster.vue.js +6 -6
  8. package/dist/components/organisms/email-preview/desktop-preview/EmailHeaderInfo.vue2.js +13 -13
  9. package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue.js +6 -6
  10. package/dist/components/organisms/email-preview/desktop-preview/EmailSizeIndicator.vue2.js +2 -2
  11. package/dist/components/organisms/email-preview/mobile-preview/InboxView.vue.js +5 -5
  12. package/dist/components/organisms/email-preview/mobile-preview/InboxView.vue2.js +13 -13
  13. package/dist/components/organisms/header/LeftSlot.vue.js +1 -1
  14. package/dist/components/organisms/header/LeftSlot.vue2.js +18 -15
  15. package/dist/components/organisms/header/RightSlot.vue.js +10 -10
  16. package/dist/components/organisms/onboarding/NewVersionPopup.vue2.js +22 -19
  17. package/dist/components/organisms/unsubscribe/UnsubscribeBreadcrumb.vue.js +4 -4
  18. package/dist/components/organisms/unsubscribe/UnsubscribeBreadcrumb.vue2.js +8 -8
  19. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue.js +3 -3
  20. package/dist/components/organisms/unsubscribe/UnsubscribeTypeSelection.vue2.js +17 -17
  21. package/dist/components/organisms/unsubscribe/UnsubscribeWrapper.vue.js +10 -10
  22. package/dist/composables/useActionsApi.js +42 -25
  23. package/dist/composables/useBlocksConfig.js +23 -20
  24. package/dist/composables/useConfig.js +51 -5
  25. package/dist/composables/useHtmlCompiler.js +20 -19
  26. package/dist/composables/useHtmlValidator.js +41 -41
  27. package/dist/composables/usePartner.js +19 -9
  28. package/dist/composables/useStripo.js +58 -57
  29. package/dist/composables/useTimerClone.js +53 -0
  30. package/dist/composables/useTranslations.js +3 -2
  31. package/dist/config/compiler/unsubscribeCompilerRules.js +1 -1
  32. package/dist/enums/defaults.js +4 -67
  33. package/dist/enums/unsubscribe.js +23 -20
  34. package/dist/extensions/Blocks/CouponBlock/constants.js +4 -0
  35. package/dist/extensions/Blocks/CouponBlock/controls/index.js +29 -0
  36. package/dist/extensions/Blocks/CouponBlock/extension.js +5 -4
  37. package/dist/extensions/Blocks/CouponBlock/settingsPanel.js +20 -14
  38. package/dist/extensions/Blocks/CouponBlock/template.js +22 -11
  39. package/dist/extensions/Blocks/Recommendation/cardCompositionControl.js +158 -68
  40. package/dist/extensions/Blocks/Recommendation/constants.js +10 -1
  41. package/dist/extensions/Blocks/Recommendation/control.js +74 -59
  42. package/dist/extensions/Blocks/Recommendation/controls/cardBackgroundColorControl.js +68 -0
  43. package/dist/extensions/Blocks/Recommendation/controls/index.js +272 -0
  44. package/dist/extensions/Blocks/Recommendation/controls/nameTextTrimControl.js +74 -0
  45. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscountTextAfterControl.js +71 -0
  46. package/dist/extensions/Blocks/Recommendation/controls/omnibusDiscountTextBeforeControl.js +71 -0
  47. package/dist/extensions/Blocks/Recommendation/controls/omnibusPriceTextAfterControl.js +71 -0
  48. package/dist/extensions/Blocks/Recommendation/controls/omnibusPriceTextBeforeControl.js +71 -0
  49. package/dist/extensions/Blocks/Recommendation/controls/priceHideControl.js +60 -0
  50. package/dist/extensions/Blocks/Recommendation/controls/priceInlineLayoutControl.js +160 -0
  51. package/dist/extensions/Blocks/Recommendation/controls/spacingControl.js +188 -0
  52. package/dist/extensions/Blocks/Recommendation/extension.js +16 -40
  53. package/dist/extensions/Blocks/Recommendation/settingsPanel.js +124 -71
  54. package/dist/extensions/Blocks/Recommendation/store/recommendation.js +12 -11
  55. package/dist/extensions/Blocks/Recommendation/templates/blockTemplate.js +89 -65
  56. package/dist/extensions/Blocks/Recommendation/templates/migrationTemplate.js +56 -19
  57. package/dist/extensions/Blocks/Recommendation/templates/templateUtils.js +74 -45
  58. package/dist/extensions/Blocks/Recommendation/utils/preserveTextStyles.js +25 -0
  59. package/dist/extensions/Blocks/controlFactories.js +124 -113
  60. package/dist/guido.css +1 -1
  61. package/dist/library.js +12 -2
  62. package/dist/node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js +14 -14
  63. package/dist/node_modules/lodash-es/_arrayLikeKeys.js +10 -10
  64. package/dist/node_modules/valibot/dist/index.js +476 -103
  65. package/dist/services/stripoApi.js +11 -16
  66. package/dist/services/templateLibraryApi.js +18 -18
  67. package/dist/src/@types/config/defaults.d.ts +68 -0
  68. package/dist/src/@types/config/index.d.ts +14 -0
  69. package/dist/src/@types/config/schemas.d.ts +513 -0
  70. package/dist/src/@types/config/types.d.ts +142 -0
  71. package/dist/src/@types/config/validator.d.ts +119 -0
  72. package/dist/src/@types/generic.d.ts +4 -45
  73. package/dist/src/components/Guido.vue.d.ts +13 -12
  74. package/dist/src/components/wrappers/WpModal.vue.d.ts +1 -1
  75. package/dist/src/composables/useActionsApi.d.ts +2 -0
  76. package/dist/src/composables/useConfig.d.ts +188 -2
  77. package/dist/src/composables/usePartner.d.ts +8 -0
  78. package/dist/src/composables/useTimerClone.d.ts +6 -0
  79. package/dist/src/enums/defaults.d.ts +5 -6
  80. package/dist/src/enums/unsubscribe.d.ts +5 -1
  81. package/dist/src/extensions/Blocks/CouponBlock/constants.d.ts +14 -0
  82. package/dist/src/extensions/Blocks/CouponBlock/controls/index.d.ts +108 -0
  83. package/dist/src/extensions/Blocks/CouponBlock/template.d.ts +1 -1
  84. package/dist/src/extensions/Blocks/Recommendation/cardCompositionControl.d.ts +54 -3
  85. package/dist/src/extensions/Blocks/Recommendation/constants.d.ts +41 -1
  86. package/dist/src/extensions/Blocks/Recommendation/control.d.ts +5 -2
  87. package/dist/src/extensions/Blocks/Recommendation/controls/cardBackgroundColorControl.d.ts +25 -0
  88. package/dist/src/extensions/Blocks/Recommendation/controls/index.d.ts +654 -0
  89. package/dist/src/extensions/Blocks/Recommendation/controls/nameTextTrimControl.d.ts +16 -0
  90. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscountTextAfterControl.d.ts +15 -0
  91. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusDiscountTextBeforeControl.d.ts +15 -0
  92. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPriceTextAfterControl.d.ts +15 -0
  93. package/dist/src/extensions/Blocks/Recommendation/controls/omnibusPriceTextBeforeControl.d.ts +15 -0
  94. package/dist/src/extensions/Blocks/Recommendation/controls/priceHideControl.d.ts +16 -0
  95. package/dist/src/extensions/Blocks/Recommendation/controls/priceInlineLayoutControl.d.ts +50 -0
  96. package/dist/src/extensions/Blocks/Recommendation/controls/spacingControl.d.ts +60 -0
  97. package/dist/src/extensions/Blocks/Recommendation/templates/blockTemplate.d.ts +3 -3
  98. package/dist/src/extensions/Blocks/Recommendation/templates/migrationTemplate.d.ts +1 -1
  99. package/dist/src/extensions/Blocks/Recommendation/templates/templateUtils.d.ts +15 -7
  100. package/dist/src/extensions/Blocks/Recommendation/utils/preserveTextStyles.d.ts +19 -0
  101. package/dist/src/extensions/Blocks/controlFactories.d.ts +30 -7
  102. package/dist/src/library.d.ts +3 -1
  103. package/dist/src/stores/config.d.ts +1581 -102
  104. package/dist/static/styles/components/narrow-panel.css.js +0 -10
  105. package/dist/static/styles/components/wide-panel.css.js +0 -4
  106. package/dist/static/styles/customEditorStyle.css.js +13 -0
  107. package/dist/stores/config.js +141 -9
  108. package/package.json +1 -1
  109. package/dist/extensions/Blocks/Recommendation/controls/button/align.js +0 -13
  110. package/dist/extensions/Blocks/Recommendation/controls/button/border.js +0 -13
  111. package/dist/extensions/Blocks/Recommendation/controls/button/borderRadius.js +0 -13
  112. package/dist/extensions/Blocks/Recommendation/controls/button/color.js +0 -13
  113. package/dist/extensions/Blocks/Recommendation/controls/button/fitToContent.js +0 -13
  114. package/dist/extensions/Blocks/Recommendation/controls/button/fontFamily.js +0 -13
  115. package/dist/extensions/Blocks/Recommendation/controls/button/margins.js +0 -13
  116. package/dist/extensions/Blocks/Recommendation/controls/button/paddings.js +0 -13
  117. package/dist/extensions/Blocks/Recommendation/controls/button/text.js +0 -13
  118. package/dist/extensions/Blocks/Recommendation/controls/button/textSize.js +0 -13
  119. package/dist/extensions/Blocks/Recommendation/controls/button/textStyleAndFontColor.js +0 -13
  120. package/dist/extensions/Blocks/Recommendation/controls/image/margins.js +0 -13
  121. package/dist/extensions/Blocks/Recommendation/controls/image/size.js +0 -13
  122. package/dist/extensions/Blocks/Recommendation/controls/name/align.js +0 -13
  123. package/dist/extensions/Blocks/Recommendation/controls/name/background.js +0 -13
  124. package/dist/extensions/Blocks/Recommendation/controls/name/color.js +0 -13
  125. package/dist/extensions/Blocks/Recommendation/controls/name/fontFamily.js +0 -13
  126. package/dist/extensions/Blocks/Recommendation/controls/name/paddings.js +0 -13
  127. package/dist/extensions/Blocks/Recommendation/controls/name/size.js +0 -13
  128. package/dist/extensions/Blocks/Recommendation/controls/name/style.js +0 -13
  129. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/align.js +0 -13
  130. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/background.js +0 -13
  131. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/color.js +0 -13
  132. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/fontFamily.js +0 -13
  133. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/paddings.js +0 -13
  134. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/size.js +0 -13
  135. package/dist/extensions/Blocks/Recommendation/controls/oldPrice/style.js +0 -13
  136. package/dist/extensions/Blocks/Recommendation/controls/price/align.js +0 -13
  137. package/dist/extensions/Blocks/Recommendation/controls/price/background.js +0 -13
  138. package/dist/extensions/Blocks/Recommendation/controls/price/color.js +0 -13
  139. package/dist/extensions/Blocks/Recommendation/controls/price/fontFamily.js +0 -13
  140. package/dist/extensions/Blocks/Recommendation/controls/price/paddings.js +0 -13
  141. package/dist/extensions/Blocks/Recommendation/controls/price/size.js +0 -13
  142. package/dist/extensions/Blocks/Recommendation/controls/price/style.js +0 -13
  143. package/dist/node_modules/lodash-es/_apply.js +0 -16
  144. package/dist/node_modules/lodash-es/_assignMergeValue.js +0 -8
  145. package/dist/node_modules/lodash-es/_assignValue.js +0 -10
  146. package/dist/node_modules/lodash-es/_baseAssignValue.js +0 -12
  147. package/dist/node_modules/lodash-es/_baseCreate.js +0 -17
  148. package/dist/node_modules/lodash-es/_baseKeysIn.js +0 -15
  149. package/dist/node_modules/lodash-es/_baseMerge.js +0 -20
  150. package/dist/node_modules/lodash-es/_baseMergeDeep.js +0 -31
  151. package/dist/node_modules/lodash-es/_baseRest.js +0 -9
  152. package/dist/node_modules/lodash-es/_baseSetToString.js +0 -14
  153. package/dist/node_modules/lodash-es/_cloneArrayBuffer.js +0 -8
  154. package/dist/node_modules/lodash-es/_cloneBuffer.js +0 -9
  155. package/dist/node_modules/lodash-es/_cloneTypedArray.js +0 -8
  156. package/dist/node_modules/lodash-es/_copyArray.js +0 -9
  157. package/dist/node_modules/lodash-es/_copyObject.js +0 -14
  158. package/dist/node_modules/lodash-es/_createAssigner.js +0 -15
  159. package/dist/node_modules/lodash-es/_defineProperty.js +0 -11
  160. package/dist/node_modules/lodash-es/_getPrototype.js +0 -5
  161. package/dist/node_modules/lodash-es/_initCloneObject.js +0 -9
  162. package/dist/node_modules/lodash-es/_nativeKeysIn.js +0 -10
  163. package/dist/node_modules/lodash-es/_overRest.js +0 -15
  164. package/dist/node_modules/lodash-es/_safeGet.js +0 -7
  165. package/dist/node_modules/lodash-es/_setToString.js +0 -6
  166. package/dist/node_modules/lodash-es/_shortOut.js +0 -16
  167. package/dist/node_modules/lodash-es/constant.js +0 -8
  168. package/dist/node_modules/lodash-es/isArrayLikeObject.js +0 -8
  169. package/dist/node_modules/lodash-es/isPlainObject.js +0 -16
  170. package/dist/node_modules/lodash-es/keysIn.js +0 -9
  171. package/dist/node_modules/lodash-es/merge.js +0 -8
  172. package/dist/node_modules/lodash-es/toPlainObject.js +0 -8
  173. package/dist/src/extensions/Blocks/Recommendation/controls/button/align.d.ts +0 -5
  174. package/dist/src/extensions/Blocks/Recommendation/controls/button/border.d.ts +0 -5
  175. package/dist/src/extensions/Blocks/Recommendation/controls/button/borderRadius.d.ts +0 -5
  176. package/dist/src/extensions/Blocks/Recommendation/controls/button/color.d.ts +0 -5
  177. package/dist/src/extensions/Blocks/Recommendation/controls/button/fitToContent.d.ts +0 -5
  178. package/dist/src/extensions/Blocks/Recommendation/controls/button/fontFamily.d.ts +0 -5
  179. package/dist/src/extensions/Blocks/Recommendation/controls/button/margins.d.ts +0 -5
  180. package/dist/src/extensions/Blocks/Recommendation/controls/button/paddings.d.ts +0 -5
  181. package/dist/src/extensions/Blocks/Recommendation/controls/button/text.d.ts +0 -5
  182. package/dist/src/extensions/Blocks/Recommendation/controls/button/textSize.d.ts +0 -5
  183. package/dist/src/extensions/Blocks/Recommendation/controls/button/textStyleAndFontColor.d.ts +0 -5
  184. package/dist/src/extensions/Blocks/Recommendation/controls/image/margins.d.ts +0 -5
  185. package/dist/src/extensions/Blocks/Recommendation/controls/image/size.d.ts +0 -5
  186. package/dist/src/extensions/Blocks/Recommendation/controls/name/align.d.ts +0 -5
  187. package/dist/src/extensions/Blocks/Recommendation/controls/name/background.d.ts +0 -5
  188. package/dist/src/extensions/Blocks/Recommendation/controls/name/color.d.ts +0 -5
  189. package/dist/src/extensions/Blocks/Recommendation/controls/name/fontFamily.d.ts +0 -5
  190. package/dist/src/extensions/Blocks/Recommendation/controls/name/paddings.d.ts +0 -5
  191. package/dist/src/extensions/Blocks/Recommendation/controls/name/size.d.ts +0 -5
  192. package/dist/src/extensions/Blocks/Recommendation/controls/name/style.d.ts +0 -5
  193. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/align.d.ts +0 -5
  194. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/background.d.ts +0 -5
  195. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/color.d.ts +0 -5
  196. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/fontFamily.d.ts +0 -5
  197. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/paddings.d.ts +0 -5
  198. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/size.d.ts +0 -5
  199. package/dist/src/extensions/Blocks/Recommendation/controls/oldPrice/style.d.ts +0 -5
  200. package/dist/src/extensions/Blocks/Recommendation/controls/price/align.d.ts +0 -5
  201. package/dist/src/extensions/Blocks/Recommendation/controls/price/background.d.ts +0 -5
  202. package/dist/src/extensions/Blocks/Recommendation/controls/price/color.d.ts +0 -5
  203. package/dist/src/extensions/Blocks/Recommendation/controls/price/fontFamily.d.ts +0 -5
  204. package/dist/src/extensions/Blocks/Recommendation/controls/price/paddings.d.ts +0 -5
  205. package/dist/src/extensions/Blocks/Recommendation/controls/price/size.d.ts +0 -5
  206. package/dist/src/extensions/Blocks/Recommendation/controls/price/style.d.ts +0 -5
@@ -0,0 +1,71 @@
1
+ import { ModificationDescription as a } from "../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ import { CommonControl as m } from "../../common-control.js";
3
+ import { RecommendationControlId as l, RecommendationBlockId as d } from "../constants.js";
4
+ import { preserveTextStyles as T } from "../utils/preserveTextStyles.js";
5
+ const f = ".ins-recommendation-product-container", i = "data-text-after", u = "", p = ".omnibus-text-after";
6
+ class E extends m {
7
+ getId() {
8
+ return l.OMNIBUS_DISCOUNT_TEXT_AFTER;
9
+ }
10
+ getTemplate() {
11
+ return `
12
+ <div class="omnibus-discount-text-after-control-container">
13
+ ${this._GuTwoColumns([
14
+ this._GuLabel({ text: "Text After" }),
15
+ this._GuTextInput({
16
+ name: "omnibusDiscountTextAfter",
17
+ placeholder: "e.g., off!",
18
+ className: "es-180w"
19
+ })
20
+ ])}
21
+ </div>
22
+ `;
23
+ }
24
+ onRender() {
25
+ this._setFormValues(), this._listenToFormUpdates();
26
+ }
27
+ onTemplateNodeUpdated(t) {
28
+ super.onTemplateNodeUpdated(t), this._setFormValues();
29
+ }
30
+ _setFormValues() {
31
+ const t = this._getCurrentText();
32
+ this.api.updateValues({
33
+ omnibusDiscountTextAfter: t
34
+ });
35
+ }
36
+ _getCurrentText() {
37
+ if (!this.currentNode || !("getAttribute" in this.currentNode))
38
+ return u;
39
+ const t = this.currentNode.getAttribute(i);
40
+ return t === null ? u : t;
41
+ }
42
+ _onTextChange(t) {
43
+ if (!this.currentNode || !("closest" in this.currentNode))
44
+ return;
45
+ const e = this.currentNode.closest(f);
46
+ if (!e || !("querySelectorAll" in e))
47
+ return;
48
+ const n = Array.from(
49
+ e.querySelectorAll(`[esd-extension-block-id="${d.OMNIBUS_DISCOUNT}"]`)
50
+ );
51
+ if (!n.length)
52
+ return;
53
+ const o = this.api.getDocumentModifier();
54
+ n.forEach((s) => {
55
+ o.modifyHtml(s).setAttribute(i, t);
56
+ const r = s.querySelector(p);
57
+ if (r) {
58
+ const c = T(r, t);
59
+ o.modifyHtml(r).setInnerHtml(c);
60
+ }
61
+ }), o.apply(new a("Update omnibus discount text after"));
62
+ }
63
+ _listenToFormUpdates() {
64
+ this.api.onValueChanged("omnibusDiscountTextAfter", (t) => {
65
+ this._onTextChange(t);
66
+ });
67
+ }
68
+ }
69
+ export {
70
+ E as OmnibusDiscountTextAfterControl
71
+ };
@@ -0,0 +1,71 @@
1
+ import { ModificationDescription as m } from "../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ import { CommonControl as a } from "../../common-control.js";
3
+ import { RecommendationControlId as l, RecommendationBlockId as d } from "../constants.js";
4
+ import { preserveTextStyles as T } from "../utils/preserveTextStyles.js";
5
+ const f = ".ins-recommendation-product-container", i = "data-text-before", u = "", p = ".omnibus-text-before";
6
+ class C extends a {
7
+ getId() {
8
+ return l.OMNIBUS_DISCOUNT_TEXT_BEFORE;
9
+ }
10
+ getTemplate() {
11
+ return `
12
+ <div class="omnibus-discount-text-before-control-container">
13
+ ${this._GuTwoColumns([
14
+ this._GuLabel({ text: "Text Before" }),
15
+ this._GuTextInput({
16
+ name: "omnibusDiscountTextBefore",
17
+ placeholder: "e.g., Save ",
18
+ className: "es-180w"
19
+ })
20
+ ])}
21
+ </div>
22
+ `;
23
+ }
24
+ onRender() {
25
+ this._setFormValues(), this._listenToFormUpdates();
26
+ }
27
+ onTemplateNodeUpdated(e) {
28
+ super.onTemplateNodeUpdated(e), this._setFormValues();
29
+ }
30
+ _setFormValues() {
31
+ const e = this._getCurrentText();
32
+ this.api.updateValues({
33
+ omnibusDiscountTextBefore: e
34
+ });
35
+ }
36
+ _getCurrentText() {
37
+ if (!this.currentNode || !("getAttribute" in this.currentNode))
38
+ return u;
39
+ const e = this.currentNode.getAttribute(i);
40
+ return e === null ? u : e;
41
+ }
42
+ _onTextChange(e) {
43
+ if (!this.currentNode || !("closest" in this.currentNode))
44
+ return;
45
+ const t = this.currentNode.closest(f);
46
+ if (!t || !("querySelectorAll" in t))
47
+ return;
48
+ const n = Array.from(
49
+ t.querySelectorAll(`[esd-extension-block-id="${d.OMNIBUS_DISCOUNT}"]`)
50
+ );
51
+ if (!n.length)
52
+ return;
53
+ const o = this.api.getDocumentModifier();
54
+ n.forEach((s) => {
55
+ o.modifyHtml(s).setAttribute(i, e);
56
+ const r = s.querySelector(p);
57
+ if (r) {
58
+ const c = T(r, e);
59
+ o.modifyHtml(r).setInnerHtml(c);
60
+ }
61
+ }), o.apply(new m("Update omnibus discount text before"));
62
+ }
63
+ _listenToFormUpdates() {
64
+ this.api.onValueChanged("omnibusDiscountTextBefore", (e) => {
65
+ this._onTextChange(e);
66
+ });
67
+ }
68
+ }
69
+ export {
70
+ C as OmnibusDiscountTextBeforeControl
71
+ };
@@ -0,0 +1,71 @@
1
+ import { ModificationDescription as a } from "../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ import { CommonControl as m } from "../../common-control.js";
3
+ import { RecommendationControlId as l, RecommendationBlockId as d } from "../constants.js";
4
+ import { preserveTextStyles as T } from "../utils/preserveTextStyles.js";
5
+ const f = ".ins-recommendation-product-container", s = "data-text-after", c = "", p = ".omnibus-text-after";
6
+ class C extends m {
7
+ getId() {
8
+ return l.OMNIBUS_PRICE_TEXT_AFTER;
9
+ }
10
+ getTemplate() {
11
+ return `
12
+ <div class="omnibus-price-text-after-control-container">
13
+ ${this._GuTwoColumns([
14
+ this._GuLabel({ text: "Text After" }),
15
+ this._GuTextInput({
16
+ name: "omnibusPriceTextAfter",
17
+ placeholder: "e.g., (incl. VAT)",
18
+ className: "es-180w"
19
+ })
20
+ ])}
21
+ </div>
22
+ `;
23
+ }
24
+ onRender() {
25
+ this._setFormValues(), this._listenToFormUpdates();
26
+ }
27
+ onTemplateNodeUpdated(t) {
28
+ super.onTemplateNodeUpdated(t), this._setFormValues();
29
+ }
30
+ _setFormValues() {
31
+ const t = this._getCurrentText();
32
+ this.api.updateValues({
33
+ omnibusPriceTextAfter: t
34
+ });
35
+ }
36
+ _getCurrentText() {
37
+ if (!this.currentNode || !("getAttribute" in this.currentNode))
38
+ return c;
39
+ const t = this.currentNode.getAttribute(s);
40
+ return t === null ? c : t;
41
+ }
42
+ _onTextChange(t) {
43
+ if (!this.currentNode || !("closest" in this.currentNode))
44
+ return;
45
+ const e = this.currentNode.closest(f);
46
+ if (!e || !("querySelectorAll" in e))
47
+ return;
48
+ const n = Array.from(
49
+ e.querySelectorAll(`[esd-extension-block-id="${d.OMNIBUS_PRICE}"]`)
50
+ );
51
+ if (!n.length)
52
+ return;
53
+ const r = this.api.getDocumentModifier();
54
+ n.forEach((i) => {
55
+ r.modifyHtml(i).setAttribute(s, t);
56
+ const o = i.querySelector(p);
57
+ if (o) {
58
+ const u = T(o, t);
59
+ r.modifyHtml(o).setInnerHtml(u);
60
+ }
61
+ }), r.apply(new a("Update omnibus price text after"));
62
+ }
63
+ _listenToFormUpdates() {
64
+ this.api.onValueChanged("omnibusPriceTextAfter", (t) => {
65
+ this._onTextChange(t);
66
+ });
67
+ }
68
+ }
69
+ export {
70
+ C as OmnibusPriceTextAfterControl
71
+ };
@@ -0,0 +1,71 @@
1
+ import { ModificationDescription as m } from "../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ import { CommonControl as a } from "../../common-control.js";
3
+ import { RecommendationControlId as l, RecommendationBlockId as d } from "../constants.js";
4
+ import { preserveTextStyles as T } from "../utils/preserveTextStyles.js";
5
+ const p = ".ins-recommendation-product-container", s = "data-text-before", c = "Lowest 30-day price: ", f = ".omnibus-text-before";
6
+ class C extends a {
7
+ getId() {
8
+ return l.OMNIBUS_PRICE_TEXT_BEFORE;
9
+ }
10
+ getTemplate() {
11
+ return `
12
+ <div class="omnibus-price-text-before-control-container">
13
+ ${this._GuTwoColumns([
14
+ this._GuLabel({ text: "Text Before" }),
15
+ this._GuTextInput({
16
+ name: "omnibusPriceTextBefore",
17
+ placeholder: "e.g., Lowest 30-day price: ",
18
+ className: "es-180w"
19
+ })
20
+ ])}
21
+ </div>
22
+ `;
23
+ }
24
+ onRender() {
25
+ this._setFormValues(), this._listenToFormUpdates();
26
+ }
27
+ onTemplateNodeUpdated(e) {
28
+ super.onTemplateNodeUpdated(e), this._setFormValues();
29
+ }
30
+ _setFormValues() {
31
+ const e = this._getCurrentText();
32
+ this.api.updateValues({
33
+ omnibusPriceTextBefore: e
34
+ });
35
+ }
36
+ _getCurrentText() {
37
+ if (!this.currentNode || !("getAttribute" in this.currentNode))
38
+ return c;
39
+ const e = this.currentNode.getAttribute(s);
40
+ return e === null ? c : e;
41
+ }
42
+ _onTextChange(e) {
43
+ if (!this.currentNode || !("closest" in this.currentNode))
44
+ return;
45
+ const t = this.currentNode.closest(p);
46
+ if (!t || !("querySelectorAll" in t))
47
+ return;
48
+ const n = Array.from(
49
+ t.querySelectorAll(`[esd-extension-block-id="${d.OMNIBUS_PRICE}"]`)
50
+ );
51
+ if (!n.length)
52
+ return;
53
+ const o = this.api.getDocumentModifier();
54
+ n.forEach((i) => {
55
+ o.modifyHtml(i).setAttribute(s, e);
56
+ const r = i.querySelector(f);
57
+ if (r) {
58
+ const u = T(r, e);
59
+ o.modifyHtml(r).setInnerHtml(u);
60
+ }
61
+ }), o.apply(new m("Update omnibus price text before"));
62
+ }
63
+ _listenToFormUpdates() {
64
+ this.api.onValueChanged("omnibusPriceTextBefore", (e) => {
65
+ this._onTextChange(e);
66
+ });
67
+ }
68
+ }
69
+ export {
70
+ C as OmnibusPriceTextBeforeControl
71
+ };
@@ -0,0 +1,60 @@
1
+ import { ModificationDescription as n } from "../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ import { CommonControl as d } from "../../common-control.js";
3
+ import { RecommendationControlId as c } from "../constants.js";
4
+ const i = {
5
+ HIDE_PRICE: "hidePriceIfSame"
6
+ }, o = "hide-price", s = ".ins-recommendation-v3-block-v2";
7
+ class h extends d {
8
+ getId() {
9
+ return c.PRICE_HIDE_IF_SAME;
10
+ }
11
+ getTemplate() {
12
+ return `
13
+ <div class="price-hide-control-container">
14
+ ${this._GuTwoColumns([
15
+ this._GuLabel({ text: "Hide if same as discounted" }),
16
+ this._GuToggle(i.HIDE_PRICE)
17
+ ])}
18
+ </div>
19
+ `;
20
+ }
21
+ onRender() {
22
+ this._setFormValues(), this._listenToFormUpdates();
23
+ }
24
+ onTemplateNodeUpdated(e) {
25
+ super.onTemplateNodeUpdated(e), this._setFormValues();
26
+ }
27
+ _setFormValues() {
28
+ const e = this._getCurrentHideState();
29
+ this.api.updateValues({
30
+ [i.HIDE_PRICE]: e
31
+ });
32
+ }
33
+ _getCurrentHideState() {
34
+ if (!this.currentNode || !("closest" in this.currentNode))
35
+ return !1;
36
+ const e = this.currentNode.closest(s);
37
+ return !e || !("getAttribute" in e) ? !1 : e.getAttribute(o) === "true";
38
+ }
39
+ _onHidePriceChange(e) {
40
+ if (!this.currentNode || !("closest" in this.currentNode))
41
+ return;
42
+ const t = this.currentNode.closest(s);
43
+ if (!t)
44
+ return;
45
+ const r = this.api.getDocumentModifier();
46
+ r.modifyHtml(t).setAttribute(o, e ? "true" : "false"), r.apply(
47
+ new n(
48
+ e ? "Enable hide price if same as discounted" : "Disable hide price if same as discounted"
49
+ )
50
+ );
51
+ }
52
+ _listenToFormUpdates() {
53
+ this.api.onValueChanged(i.HIDE_PRICE, (e) => {
54
+ this._onHidePriceChange(e);
55
+ });
56
+ }
57
+ }
58
+ export {
59
+ h as PriceHideControl
60
+ };
@@ -0,0 +1,160 @@
1
+ import { ModificationDescription as M } from "../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
2
+ import { CommonControl as w } from "../../common-control.js";
3
+ import { RecommendationControlId as N, ATTR_DATA_PRICE_INLINE as E, RecommendationBlockId as g } from "../constants.js";
4
+ const k = N.PRICE_INLINE_LAYOUT, b = ".recommendation-attribute-row", B = "tr.recommendation-product-row", m = "data-attribute-type", T = "data-inline-merged", C = "data-visibility";
5
+ class V extends w {
6
+ getId() {
7
+ return k;
8
+ }
9
+ getTemplate() {
10
+ return `
11
+ <div class="container">
12
+ ${this._GuTwoColumns([
13
+ this._GuLabel({ text: "Move to Next Line" }),
14
+ this._GuToggle("priceNextLine")
15
+ ])}
16
+ <div style="color: #666; font-size: 12px; margin-top: 8px; padding-left: 8px;">
17
+ When disabled, Price and Old Price will appear side by side
18
+ </div>
19
+ </div>
20
+ `;
21
+ }
22
+ onRender() {
23
+ this._initializePriceInlineState(), this._registerValueChangeListener();
24
+ }
25
+ onTemplateNodeUpdated(e) {
26
+ super.onTemplateNodeUpdated(e), this._initializePriceInlineState();
27
+ }
28
+ /**
29
+ * Reads the current price inline state from the block's data attribute
30
+ * and updates the toggle UI
31
+ * Note: Toggle ON = separate rows (next line), Toggle OFF = inline (same row)
32
+ */
33
+ _initializePriceInlineState() {
34
+ const r = !this._readPriceInlineState();
35
+ this.api.updateValues({
36
+ priceNextLine: r
37
+ });
38
+ }
39
+ /**
40
+ * Reads the price inline state from the block wrapper's data attribute
41
+ */
42
+ _readPriceInlineState() {
43
+ if (!this.currentNode || !("getAttribute" in this.currentNode))
44
+ return !1;
45
+ const e = this.currentNode.getAttribute(E);
46
+ return console.debug("inline attr", e), e === "1" || e === "true";
47
+ }
48
+ /**
49
+ * Registers listener for toggle changes
50
+ */
51
+ _registerValueChangeListener() {
52
+ this.api.onValueChanged("priceNextLine", (e) => {
53
+ const r = !e;
54
+ this._applyPriceInlineLayout(r);
55
+ });
56
+ }
57
+ /**
58
+ * Applies the price inline layout by restructuring the DOM
59
+ * When enabling inline: Merges Old Price content into Price row (side by side)
60
+ * When disabling inline: Separates them back into individual rows
61
+ */
62
+ _applyPriceInlineLayout(e) {
63
+ if (!this.currentNode)
64
+ return;
65
+ this.api.getDocumentModifier().modifyHtml(this.currentNode).setAttribute(E, e ? "1" : "0").apply(new M("Update price inline attribute"));
66
+ const r = this.currentNode.querySelectorAll(B);
67
+ if (!(r != null && r.length))
68
+ return;
69
+ const i = this.api.getDocumentModifier();
70
+ r.forEach((t) => {
71
+ e ? this._mergeOldPriceIntoPrice(t, i) : this._separateOldPriceFromPrice(t, i);
72
+ }), i.apply(new M(
73
+ e ? "Merge price rows into inline layout" : "Separate price rows"
74
+ ));
75
+ }
76
+ /**
77
+ * Merges Old Price content into the same row as Price (inline layout)
78
+ * Creates a structure where both prices are side by side in one row
79
+ */
80
+ _mergeOldPriceIntoPrice(e, r) {
81
+ const i = e.querySelector(
82
+ `${b}[${m}="productPrice"]`
83
+ ), t = e.querySelector(
84
+ `${b}[${m}="productOldPrice"]`
85
+ );
86
+ if (!i || !t || "getAttribute" in t && t.getAttribute(T) === "1" || !("querySelectorAll" in i) || !("querySelectorAll" in t))
87
+ return;
88
+ const a = Array.from(i.querySelectorAll("table.product-card-wrapper")), u = Array.from(t.querySelectorAll("table.product-card-wrapper"));
89
+ a.length !== u.length || a.length === 0 || (a.forEach((o, _) => {
90
+ const s = u[_];
91
+ if (!o || !s || !("querySelector" in o) || !("querySelector" in s))
92
+ return;
93
+ const c = `[esd-extension-block-id="${g.PRICE}"]`, f = `[esd-extension-block-id="${g.OLD_PRICE}"]`, n = o.querySelector(c), l = s.querySelector(f);
94
+ if (!n || !l || !("getOuterHTML" in n) || !("getOuterHTML" in l))
95
+ return;
96
+ const h = n.getOuterHTML(), P = `
97
+ <tr data-inline-price-wrapper="1">
98
+ <td width="50%" style="vertical-align: middle;">
99
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
100
+ <tbody>
101
+ <tr><td>${l.getOuterHTML()}</td></tr>
102
+ </tbody>
103
+ </table>
104
+ </td>
105
+ <td width="50%" style="vertical-align: middle;">
106
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
107
+ <tbody>
108
+ <tr><td>${h}</td></tr>
109
+ </tbody>
110
+ </table>
111
+ </td>
112
+ </tr>
113
+ `, y = o.querySelector(".product-attribute-cell");
114
+ if (!y)
115
+ return;
116
+ const d = y.querySelector("tbody");
117
+ d && r.modifyHtml(d).setInnerHtml(P);
118
+ }), r.modifyHtml(t).setStyle("display", "none").setAttribute(T, "1"));
119
+ }
120
+ /**
121
+ * Separates Old Price from Price row back into individual rows
122
+ * Restores the original separate row structure
123
+ */
124
+ _separateOldPriceFromPrice(e, r) {
125
+ const i = e.querySelector(
126
+ `${b}[${m}="productPrice"]`
127
+ ), t = e.querySelector(
128
+ `${b}[${m}="productOldPrice"]`
129
+ );
130
+ if (!i || !t || !("getAttribute" in t) || !(t.getAttribute(T) === "1") || !("querySelectorAll" in i) || !("querySelectorAll" in t))
131
+ return;
132
+ const u = Array.from(i.querySelectorAll("table.product-card-wrapper")), o = Array.from(t.querySelectorAll("table.product-card-wrapper"));
133
+ u.forEach((c, f) => {
134
+ if (!c || !("querySelector" in c))
135
+ return;
136
+ const n = o[f];
137
+ if (!n || !("querySelector" in n))
138
+ return;
139
+ const l = c.querySelector('[data-inline-price-wrapper="1"]');
140
+ if (!l || !("querySelectorAll" in l))
141
+ return;
142
+ const p = Array.from(l.querySelectorAll("td")).filter((O) => "getAttribute" in O && O.getAttribute("width") === "50%");
143
+ if (p.length !== 2)
144
+ return;
145
+ const P = `[esd-extension-block-id="${g.OLD_PRICE}"]`, y = `[esd-extension-block-id="${g.PRICE}"]`, d = p[0].querySelector(P), A = p[1].querySelector(y);
146
+ if (!d || !A || !("getOuterHTML" in d) || !("getOuterHTML" in A))
147
+ return;
148
+ const H = A.getOuterHTML(), R = d.getOuterHTML(), S = c.querySelector(".product-attribute-cell"), L = S == null ? void 0 : S.querySelector("tbody");
149
+ L && r.modifyHtml(L).setInnerHtml(`<tr><td>${H}</td></tr>`);
150
+ const I = n.querySelector(".product-attribute-cell"), q = I == null ? void 0 : I.querySelector("tbody");
151
+ q && r.modifyHtml(q).setInnerHtml(`<tr><td>${R}</td></tr>`);
152
+ });
153
+ const s = t.getAttribute(C) === "0" ? "none" : "table-row";
154
+ r.modifyHtml(t).setStyle("display", s).removeAttribute(T);
155
+ }
156
+ }
157
+ export {
158
+ k as PRICE_INLINE_LAYOUT_CONTROL_ID,
159
+ V as PriceInlineLayoutControl
160
+ };
@@ -0,0 +1,188 @@
1
+ var C = Object.defineProperty;
2
+ var g = (i, r, e) => r in i ? C(i, r, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[r] = e;
3
+ var S = (i, r, e) => g(i, typeof r != "symbol" ? r + "" : r, e);
4
+ import { ModificationDescription as l } from "../../../../node_modules/@stripoinc/ui-editor-extensions/dist/esm/index.js";
5
+ import { CommonControl as m } from "../../common-control.js";
6
+ import { useDebounceFn as d } from "../../../../node_modules/@vueuse/shared/index.js";
7
+ const _ = "recommendation-spacing-control", c = {
8
+ COLUMN_SPACING: "columnSpacing",
9
+ ROW_SPACING: "rowSpacing"
10
+ }, N = {
11
+ COLUMN_SPACING: "data-column-spacing",
12
+ ROW_SPACING: "data-row-spacing"
13
+ }, n = {
14
+ COLUMN_SPACING: 10,
15
+ // 5px on each side = 10px total
16
+ ROW_SPACING: 20
17
+ }, p = {
18
+ MIN_SPACING: 0,
19
+ MAX_SPACING: 50,
20
+ STEP: 5
21
+ };
22
+ class G extends m {
23
+ constructor() {
24
+ super(...arguments);
25
+ /**
26
+ * Debounced version of _onColumnSpacingChange
27
+ * Prevents excessive DOM updates when user rapidly adjusts the counter
28
+ */
29
+ S(this, "_debouncedOnColumnSpacingChange", d((e) => {
30
+ this._onColumnSpacingChange(e);
31
+ }, 300));
32
+ /**
33
+ * Debounced version of _onRowSpacingChange
34
+ * Prevents excessive DOM updates when user rapidly adjusts the counter
35
+ */
36
+ S(this, "_debouncedOnRowSpacingChange", d((e) => {
37
+ this._onRowSpacingChange(e);
38
+ }, 300));
39
+ }
40
+ getId() {
41
+ return _;
42
+ }
43
+ getTemplate() {
44
+ return `
45
+ <div class="spacing-control-container">
46
+ ${this._GuTwoColumns([
47
+ this._GuLabel({ text: "Column Spacing (px)" }),
48
+ this._GuCounter({
49
+ name: c.COLUMN_SPACING,
50
+ minValue: p.MIN_SPACING,
51
+ maxValue: p.MAX_SPACING,
52
+ step: p.STEP
53
+ }),
54
+ this._GuLabel({ text: "Row Spacing (px)" }),
55
+ this._GuCounter({
56
+ name: c.ROW_SPACING,
57
+ minValue: p.MIN_SPACING,
58
+ maxValue: p.MAX_SPACING,
59
+ step: p.STEP
60
+ })
61
+ ])}
62
+ </div>
63
+ `;
64
+ }
65
+ onRender() {
66
+ this._setFormValues(), this._listenToFormUpdates();
67
+ }
68
+ onTemplateNodeUpdated(e) {
69
+ super.onTemplateNodeUpdated(e), this._setFormValues();
70
+ }
71
+ /**
72
+ * Reads spacing values from data attributes or returns defaults
73
+ */
74
+ _setFormValues() {
75
+ const e = this._getStoredColumnSpacing(), t = this._getStoredRowSpacing();
76
+ this.api.updateValues({
77
+ [c.COLUMN_SPACING]: e,
78
+ [c.ROW_SPACING]: t
79
+ });
80
+ }
81
+ /**
82
+ * Gets stored column spacing from the first product card wrapper's parent element's padding
83
+ * Reads the actual padding value instead of relying on data attributes
84
+ *
85
+ * The padding is applied as "0 {halfSpacing}px" on the parent TD element,
86
+ * so we need to extract the horizontal padding value and multiply by 2 to get total spacing.
87
+ */
88
+ _getStoredColumnSpacing() {
89
+ if (!this.currentNode)
90
+ return n.COLUMN_SPACING;
91
+ const e = this.currentNode.querySelector(".product-card-wrapper");
92
+ if (!e || !("parent" in e) || typeof e.parent != "function")
93
+ return n.COLUMN_SPACING;
94
+ const t = e.parent();
95
+ if (!t || !("getStyle" in t))
96
+ return n.COLUMN_SPACING;
97
+ const o = t.getStyle("padding");
98
+ if (!o)
99
+ return n.COLUMN_SPACING;
100
+ const u = o.trim().split(/\s+/);
101
+ if (u.length < 2)
102
+ return n.COLUMN_SPACING;
103
+ const [, a] = u, s = parseFloat(a);
104
+ return Number.isNaN(s) ? n.COLUMN_SPACING : s * 2;
105
+ }
106
+ /**
107
+ * Gets stored row spacing from the first spacer element's height style
108
+ * Reads the actual height value instead of relying on data attributes
109
+ */
110
+ _getStoredRowSpacing() {
111
+ if (!this.currentNode)
112
+ return n.ROW_SPACING;
113
+ const e = this.currentNode.querySelector(".spacer");
114
+ if (!e || !("getStyle" in e))
115
+ return n.ROW_SPACING;
116
+ const t = e.getStyle("height");
117
+ if (!t)
118
+ return n.ROW_SPACING;
119
+ const o = parseFloat(t);
120
+ return Number.isNaN(o) ? n.ROW_SPACING : o;
121
+ }
122
+ /**
123
+ * Handles column spacing changes
124
+ * Applies horizontal padding to all product card wrappers
125
+ */
126
+ _onColumnSpacingChange(e) {
127
+ if (!this.currentNode)
128
+ return;
129
+ const t = Array.from(
130
+ this.currentNode.querySelectorAll(".product-card-wrapper")
131
+ );
132
+ if (!t)
133
+ return;
134
+ const o = this.api.getDocumentModifier(), a = `0 ${e / 2}px`;
135
+ console.debug("padding", a), t.forEach((s) => {
136
+ "parent" in s && s.parent() && o.modifyHtml(s.parent()).setStyle("padding", a);
137
+ }), o.apply(new l(`Update column spacing to ${e}px`));
138
+ }
139
+ /**
140
+ * Handles row spacing changes
141
+ * Applies height to all spacer elements between product rows
142
+ */
143
+ _onRowSpacingChange(e) {
144
+ if (!this.currentNode)
145
+ return;
146
+ this._storeRowSpacing(e);
147
+ const t = Array.from(
148
+ this.currentNode.querySelectorAll(".spacer")
149
+ );
150
+ if (console.debug("spacerCells", t), console.debug("spacing", e), !t.length)
151
+ return;
152
+ const o = this.api.getDocumentModifier(), u = `${e}px`;
153
+ t.forEach((a) => {
154
+ o.modifyHtml(a).setStyle("height", u);
155
+ }), o.apply(new l(`Update row spacing to ${e}px`));
156
+ }
157
+ /**
158
+ * Stores column spacing value in block data attribute
159
+ */
160
+ _storeColumnSpacing(e) {
161
+ if (!this.currentNode)
162
+ return;
163
+ const t = this.currentNode.querySelector(".ins-recommendation-v3-block-v2");
164
+ t && this.api.getDocumentModifier().modifyHtml(t).setAttribute(N.COLUMN_SPACING, e.toString()).apply(new l("Store column spacing"));
165
+ }
166
+ /**
167
+ * Stores row spacing value in block data attribute
168
+ */
169
+ _storeRowSpacing(e) {
170
+ if (!this.currentNode)
171
+ return;
172
+ const t = this.currentNode.querySelector(".ins-recommendation-v3-block-v2");
173
+ t && this.api.getDocumentModifier().modifyHtml(t).setAttribute(N.ROW_SPACING, e.toString()).apply(new l("Store row spacing"));
174
+ }
175
+ _listenToFormUpdates() {
176
+ this.api.onValueChanged(c.COLUMN_SPACING, (e) => {
177
+ const t = parseInt(e);
178
+ Number.isNaN(t) || this._debouncedOnColumnSpacingChange(t);
179
+ }), this.api.onValueChanged(c.ROW_SPACING, (e) => {
180
+ const t = parseInt(e);
181
+ Number.isNaN(t) || this._debouncedOnRowSpacingChange(t);
182
+ });
183
+ }
184
+ }
185
+ export {
186
+ _ as SPACING_CONTROL_ID,
187
+ G as SpacingControl
188
+ };