@tet/tet-components 1.3.146-testing → 1.3.147-testing

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 (155) hide show
  1. package/dist/cjs/index-f559cb2e.js +24 -36
  2. package/dist/cjs/loader.cjs.js +1 -1
  3. package/dist/cjs/{tet-notification.cjs.entry.js → tet-accordion_2.cjs.entry.js} +131 -0
  4. package/dist/cjs/tet-address-offers-filters-products_2.cjs.entry.js +1 -1
  5. package/dist/cjs/{tet-autocomplete_2.cjs.entry.js → tet-autocomplete.cjs.entry.js} +0 -65
  6. package/dist/cjs/tet-b2b-check-out-form_5.cjs.entry.js +647 -0
  7. package/dist/cjs/tet-b2b-configurator.cjs.entry.js +536 -0
  8. package/dist/cjs/tet-b2b-service-calculator.cjs.entry.js +1 -1
  9. package/dist/cjs/tet-border-radius.cjs.entry.js +1 -1
  10. package/dist/cjs/tet-business-lines.cjs.entry.js +1 -1
  11. package/dist/cjs/tet-colors.cjs.entry.js +4 -4
  12. package/dist/cjs/tet-compare-card-v2.cjs.entry.js +1 -1
  13. package/dist/cjs/tet-components.cjs.js +1 -1
  14. package/dist/cjs/tet-font-weight.cjs.entry.js +1 -1
  15. package/dist/cjs/tet-fonts.cjs.entry.js +1 -1
  16. package/dist/cjs/tet-grid.cjs.entry.js +1 -1
  17. package/dist/cjs/tet-layout.cjs.entry.js +1 -1
  18. package/dist/cjs/tet-link.cjs.entry.js +1 -1
  19. package/dist/cjs/tet-spacing.cjs.entry.js +1 -1
  20. package/dist/cjs/tet-spinner.cjs.entry.js +71 -0
  21. package/dist/cjs/tet-text-list.cjs.entry.js +1 -1
  22. package/dist/collection/collection-manifest.json +1 -0
  23. package/dist/collection/components/advanced/cards/tet-b2b-compare-card/test/tet-b2b-compare-card.spec.js +0 -1
  24. package/dist/collection/components/advanced/cards/tet-b2b-compare-card/tet-b2b-compare-card.js +8 -8
  25. package/dist/collection/components/advanced/cards/tet-business-summary-card/tet-business-summary-card.css +7 -0
  26. package/dist/collection/components/advanced/cards/tet-business-summary-card/tet-business-summary-card.js +31 -7
  27. package/dist/collection/components/advanced/cards/tet-compare-card/tet-compare-card.css +1 -0
  28. package/dist/collection/components/advanced/cards/tet-compare-card-v2/tet-compare-card-v2.css +1 -0
  29. package/dist/collection/components/advanced/forms/tet-b2b-check-out-form/tet-b2b-check-out-form.css +0 -2
  30. package/dist/collection/components/advanced/forms/tet-b2b-check-out-form/tet-b2b-check-out-form.js +24 -4
  31. package/dist/collection/components/simple/lists/tet-text-list/tet-text-list.css +1 -0
  32. package/dist/collection/components/simple/menu/tet-business-navigation/tet-business-navigation.css +15 -5
  33. package/dist/collection/components/simple/structural/tet-accordion/tet-accordion.css +4 -2
  34. package/dist/collection/components/simple/structural/tet-accordion/tet-accordion.js +27 -5
  35. package/dist/collection/components/views/tet-b2b-configurator/b2b-configurator.store.js +47 -0
  36. package/dist/collection/components/views/tet-b2b-configurator/partials/tet-b2b-configurator-cart/test/tet-b2b-configurator-cart.spec.js +10 -1
  37. package/dist/collection/components/views/tet-b2b-configurator/partials/tet-b2b-configurator-cart/tet-b2b-configurator-cart.css +54 -9
  38. package/dist/collection/components/views/tet-b2b-configurator/partials/tet-b2b-configurator-cart/tet-b2b-configurator-cart.js +106 -8
  39. package/dist/collection/components/views/tet-b2b-configurator/tet-b2b-configurator.css +472 -0
  40. package/dist/collection/components/views/tet-b2b-configurator/tet-b2b-configurator.js +612 -0
  41. package/dist/collection/components/views/tet-b2b-service-calculator/tet-b2b-service-calculator.js +1 -1
  42. package/dist/collection/components/views/tet-business-lines/tet-business-lines.js +1 -1
  43. package/dist/collection/docs/styling/border-radius/tet-border-radius.js +1 -1
  44. package/dist/collection/docs/styling/colors/tet-colors.js +4 -4
  45. package/dist/collection/docs/styling/font-weight/tet-font-weight.js +1 -1
  46. package/dist/collection/docs/styling/fonts/tet-fonts.js +1 -1
  47. package/dist/collection/docs/styling/layout/tet-layout.js +1 -1
  48. package/dist/collection/docs/styling/link/tet-link.js +1 -1
  49. package/dist/collection/docs/styling/spacing/tet-spacing.js +1 -1
  50. package/dist/collection/docs/styling/tet-grid/tet-grid.js +1 -1
  51. package/dist/collection/services/utils/minimum-duration-time.js +14 -0
  52. package/dist/components/index.js +2 -0
  53. package/dist/components/{p-08cb8e8b.js → p-401be6d8.js} +8 -6
  54. package/dist/components/{p-b3266df2.js → p-42c3311c.js} +1 -1
  55. package/dist/components/{p-c15aec6f.js → p-4a4c9b2c.js} +1 -1
  56. package/dist/{esm/tet-business-navigation.entry.js → components/p-5541195e.js} +35 -8
  57. package/dist/components/{p-e735af9c.js → p-8dd212bd.js} +1 -1
  58. package/dist/{esm/tet-b2b-compare-card.entry.js → components/p-922171da.js} +68 -20
  59. package/dist/{esm/tet-b2b-check-out-form.entry.js → components/p-b74f5470.js} +69 -16
  60. package/dist/components/p-cbf2c238.js +227 -0
  61. package/dist/components/{p-18778346.js → p-e72ea31d.js} +1 -1
  62. package/dist/{esm/tet-business-summary-card.entry.js → components/p-f68a8deb.js} +66 -14
  63. package/dist/components/tet-accordion.js +1 -1
  64. package/dist/components/tet-address-offers-view.js +2 -2
  65. package/dist/components/tet-address-offers.js +1 -1
  66. package/dist/components/tet-b2b-check-out-form.js +1 -207
  67. package/dist/components/tet-b2b-compare-card.js +1 -206
  68. package/dist/components/tet-b2b-configurator-cart.js +1 -167
  69. package/dist/components/tet-b2b-configurator.d.ts +11 -0
  70. package/dist/components/tet-b2b-configurator.js +661 -0
  71. package/dist/components/tet-b2b-service-calculator.js +1 -1
  72. package/dist/components/tet-border-radius.js +1 -1
  73. package/dist/components/tet-business-compare-card.js +1 -1
  74. package/dist/components/tet-business-lines.js +1 -1
  75. package/dist/components/tet-business-navigation.js +1 -103
  76. package/dist/components/tet-business-summary-card.js +1 -116
  77. package/dist/components/tet-colors.js +4 -4
  78. package/dist/components/tet-compare-card-v2.js +1 -1
  79. package/dist/components/tet-compare-card.js +1 -1
  80. package/dist/components/tet-compare-cards-tab.js +2 -2
  81. package/dist/components/tet-compare-cards.js +1 -1
  82. package/dist/components/tet-font-weight.js +1 -1
  83. package/dist/components/tet-fonts.js +1 -1
  84. package/dist/components/tet-grid.js +1 -1
  85. package/dist/components/tet-layout.js +1 -1
  86. package/dist/components/tet-link.js +1 -1
  87. package/dist/components/tet-spacing.js +1 -1
  88. package/dist/components/tet-text-list.js +1 -1
  89. package/dist/esm/index-7f1e2a22.js +24 -36
  90. package/dist/esm/loader.js +1 -1
  91. package/dist/esm/{tet-notification.entry.js → tet-accordion_2.entry.js} +132 -2
  92. package/dist/esm/tet-address-offers-filters-products_2.entry.js +1 -1
  93. package/dist/esm/{tet-autocomplete_2.entry.js → tet-autocomplete.entry.js} +1 -65
  94. package/dist/esm/tet-b2b-check-out-form_5.entry.js +639 -0
  95. package/dist/esm/tet-b2b-configurator.entry.js +532 -0
  96. package/dist/esm/tet-b2b-service-calculator.entry.js +1 -1
  97. package/dist/esm/tet-border-radius.entry.js +1 -1
  98. package/dist/esm/tet-business-lines.entry.js +1 -1
  99. package/dist/esm/tet-colors.entry.js +4 -4
  100. package/dist/esm/tet-compare-card-v2.entry.js +1 -1
  101. package/dist/esm/tet-components.js +1 -1
  102. package/dist/esm/tet-font-weight.entry.js +1 -1
  103. package/dist/esm/tet-fonts.entry.js +1 -1
  104. package/dist/esm/tet-grid.entry.js +1 -1
  105. package/dist/esm/tet-layout.entry.js +1 -1
  106. package/dist/esm/tet-link.entry.js +1 -1
  107. package/dist/esm/tet-spacing.entry.js +1 -1
  108. package/dist/esm/tet-spinner.entry.js +67 -0
  109. package/dist/esm/tet-text-list.entry.js +1 -1
  110. package/dist/tet-components/{p-0121cef5.entry.js → p-067c2f1b.entry.js} +1 -1
  111. package/dist/tet-components/{p-bb6387c6.entry.js → p-0738afc0.entry.js} +1 -1
  112. package/dist/tet-components/{p-f476f61c.entry.js → p-07aee8d0.entry.js} +1 -1
  113. package/dist/tet-components/p-0d818b7e.entry.js +1 -0
  114. package/dist/tet-components/{p-56460d2d.entry.js → p-4c9e742f.entry.js} +1 -1
  115. package/dist/tet-components/{p-9c274191.entry.js → p-4e0a24ba.entry.js} +1 -1
  116. package/dist/tet-components/p-4ea127f4.entry.js +1 -0
  117. package/dist/tet-components/{p-9bfcf2cc.entry.js → p-62eb4fe0.entry.js} +1 -1
  118. package/dist/tet-components/{p-38c3b247.entry.js → p-662d9457.entry.js} +1 -1
  119. package/dist/tet-components/{p-1ddb9e3c.entry.js → p-677b8bf7.entry.js} +1 -1
  120. package/dist/tet-components/{p-7f00f463.entry.js → p-6a4a979c.entry.js} +1 -1
  121. package/dist/tet-components/p-6d2c4b16.entry.js +1 -0
  122. package/dist/tet-components/{p-6782340f.entry.js → p-9513c8f6.entry.js} +1 -1
  123. package/dist/tet-components/p-af917a8f.entry.js +1 -0
  124. package/dist/tet-components/{p-597e234a.entry.js → p-dcb66405.entry.js} +1 -1
  125. package/dist/tet-components/{p-4838a00a.entry.js → p-e311eb7d.entry.js} +1 -1
  126. package/dist/tet-components/p-ed67bd52.entry.js +1 -0
  127. package/dist/tet-components/{p-bd8a0449.entry.js → p-eed6163a.entry.js} +1 -1
  128. package/dist/tet-components/tet-components.css +1 -1
  129. package/dist/tet-components/tet-components.esm.js +1 -1
  130. package/dist/types/components/advanced/cards/tet-business-summary-card/tet-business-summary-card.d.ts +4 -2
  131. package/dist/types/components/advanced/forms/tet-b2b-check-out-form/tet-b2b-check-out-form.d.ts +2 -1
  132. package/dist/types/components/simple/structural/tet-accordion/tet-accordion.d.ts +5 -0
  133. package/dist/types/components/views/tet-b2b-configurator/b2b-configurator.store.d.ts +22 -0
  134. package/dist/types/components.d.ts +100 -4
  135. package/dist/types/services/api/interfaces/property.interface.d.ts +2 -2
  136. package/dist/types/services/api/services/b2b-configurator/b2b-configurator.d.ts +4 -4
  137. package/dist/types/services/utils/minimum-duration-time.d.ts +9 -0
  138. package/package.json +1 -1
  139. package/dist/cjs/tet-accordion.cjs.entry.js +0 -136
  140. package/dist/cjs/tet-b2b-check-out-form.cjs.entry.js +0 -164
  141. package/dist/cjs/tet-b2b-compare-card.cjs.entry.js +0 -164
  142. package/dist/cjs/tet-b2b-configurator-cart.cjs.entry.js +0 -129
  143. package/dist/cjs/tet-business-navigation.cjs.entry.js +0 -82
  144. package/dist/cjs/tet-business-summary-card.cjs.entry.js +0 -77
  145. package/dist/esm/tet-accordion.entry.js +0 -132
  146. package/dist/esm/tet-b2b-configurator-cart.entry.js +0 -125
  147. package/dist/tet-components/p-05fc6443.entry.js +0 -1
  148. package/dist/tet-components/p-319c29e9.entry.js +0 -1
  149. package/dist/tet-components/p-47618056.entry.js +0 -1
  150. package/dist/tet-components/p-4eb386f5.entry.js +0 -1
  151. package/dist/tet-components/p-62419a1f.entry.js +0 -1
  152. package/dist/tet-components/p-a9499bbb.entry.js +0 -1
  153. package/dist/tet-components/p-d0d39e88.entry.js +0 -1
  154. package/dist/tet-components/p-ff5dba0e.entry.js +0 -1
  155. package/dist/types/components/views/tet-b2b-configurator/partials/tet-b2b-configurator-cart/tet-b2b-configurator-cart.d.ts +0 -67
@@ -0,0 +1,661 @@
1
+ import { p as proxyCustomElement, H, d as createEvent, h, c as Host } from './p-37ed3ebb.js';
2
+ import { e as endpoints, A as ApiRequest } from './p-6830b44d.js';
3
+ import { c as createStore, d as defineCustomElement$8 } from './p-9da9a443.js';
4
+ import { t as translate } from './p-aca28e71.js';
5
+ import { d as defineCustomElement$h } from './p-401be6d8.js';
6
+ import { d as defineCustomElement$g } from './p-b74f5470.js';
7
+ import { d as defineCustomElement$f } from './p-922171da.js';
8
+ import { d as defineCustomElement$e } from './p-cbf2c238.js';
9
+ import { d as defineCustomElement$d } from './p-5541195e.js';
10
+ import { d as defineCustomElement$c } from './p-f68a8deb.js';
11
+ import { d as defineCustomElement$b } from './p-4108736e.js';
12
+ import { d as defineCustomElement$a } from './p-6aec415f.js';
13
+ import { d as defineCustomElement$9 } from './p-0d9ded0d.js';
14
+ import { d as defineCustomElement$7 } from './p-17b6782b.js';
15
+ import { d as defineCustomElement$6 } from './p-b2d2b9f2.js';
16
+ import { d as defineCustomElement$5 } from './p-8c1b81ba.js';
17
+ import { d as defineCustomElement$4 } from './p-a213c941.js';
18
+ import { d as defineCustomElement$3 } from './p-63b1a813.js';
19
+ import { d as defineCustomElement$2 } from './p-4a4c9b2c.js';
20
+
21
+ const b2bConfigurator = () => {
22
+ let apiUrl;
23
+ try {
24
+ apiUrl = new URL(endpoints.b2bConfigurator).href;
25
+ }
26
+ catch (error) {
27
+ console.error(error);
28
+ return Promise.reject('B2B configurator endpoint URL generation failed.');
29
+ }
30
+ const request = new ApiRequest()
31
+ .setUrl(apiUrl)
32
+ .setErrorFallbackValue([]);
33
+ return request.execute();
34
+ };
35
+
36
+ /**
37
+ * Ensures an asynchronous operation (Promise or async function) takes at least
38
+ * a specified minimum duration to resolve.
39
+ * @param callback The Promise to await, or an asynchronous function that returns a Promise.
40
+ * @param minDurationMs The minimum time, in milliseconds, the resulting Promise should take to resolve.
41
+ * @returns A Promise that resolves with the result of the callback, but only after
42
+ * both the callback and the minDurationMs delay have completed.
43
+ */
44
+ const ensureMinDuration = async (callback, minDurationMs) => {
45
+ const responsePromise = typeof callback === 'function' ? callback() : callback;
46
+ const delayPromise = new Promise((resolve) => setTimeout(resolve, minDurationMs));
47
+ const [result] = await Promise.all([responsePromise, delayPromise]);
48
+ return result;
49
+ };
50
+
51
+ const { state, set, get } = createStore({
52
+ data: [],
53
+ cart: new Map(),
54
+ productDetails: new Map()
55
+ });
56
+ const initData = (data) => {
57
+ set('data', data);
58
+ const productDetails = new Map();
59
+ for (const category of data) {
60
+ for (const product of category.products) {
61
+ const { type: categoryType, name: categoryName, id: categoryId } = category;
62
+ const { name: { lv: name }, description: { lv: description }, amount, b2bConfiguratorProduct } = product;
63
+ productDetails.set(product.productCode, {
64
+ name,
65
+ description,
66
+ amount,
67
+ discountAmount: b2bConfiguratorProduct.discountAmount,
68
+ categoryType,
69
+ categoryName,
70
+ categoryId,
71
+ b2bConfiguratorProduct
72
+ });
73
+ }
74
+ }
75
+ set('productDetails', productDetails);
76
+ };
77
+ const addToCart = (product, count) => {
78
+ if (count < 0) {
79
+ return;
80
+ }
81
+ const newCart = new Map(state.cart);
82
+ newCart.set(product, count);
83
+ set('cart', newCart);
84
+ };
85
+ const removeFromCart = (product) => {
86
+ const newCart = new Map(state.cart);
87
+ newCart.delete(product);
88
+ set('cart', newCart);
89
+ };
90
+ const resetCart = () => {
91
+ set('cart', new Map());
92
+ };
93
+ const getCart = () => {
94
+ return Object.fromEntries(get('cart'));
95
+ };
96
+
97
+ const tetB2bConfiguratorCss = "@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:400;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Medium.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Medium.woff\") format(\"woff\")}@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:500;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Medium.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Medium.woff\") format(\"woff\")}@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:600;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Semibold.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Semibold.woff\") format(\"woff\")}@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:700;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Bold.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Bold.woff\") format(\"woff\")}@font-face{font-family:\"Inter\";font-style:normal;font-weight:400;font-display:swap;src:url(\"assets/fonts/Inter-Regular.woff2?v=3.19\") format(\"woff2\"), url(\"assets/fonts/Inter-Regular.woff?v=3.19\") format(\"woff\")}@font-face{font-family:\"Inter\";font-style:normal;font-weight:500;font-display:swap;src:url(\"assets/fonts/Inter-Medium.woff2?v=3.19\") format(\"woff2\"), url(\"assets/fonts/Inter-Medium.woff?v=3.19\") format(\"woff\")}@font-face{font-family:\"Inter\";font-style:normal;font-weight:600;font-display:swap;src:url(\"assets/fonts/Inter-SemiBold.woff2?v=3.19\") format(\"woff2\"), url(\"assets/fonts/Inter-SemiBold.woff?v=3.19\") format(\"woff\")}@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:400;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Medium.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Medium.woff\") format(\"woff\")}@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:500;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Medium.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Medium.woff\") format(\"woff\")}@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:600;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Semibold.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Semibold.woff\") format(\"woff\")}@font-face{font-family:\"Gilroy\";font-style:normal;font-weight:700;font-display:swap;src:url(\"assets/fonts/Gilroy-W05-Bold.woff2\") format(\"woff2\"), url(\"assets/fonts/Gilroy-W05-Bold.woff\") format(\"woff\")}@font-face{font-family:\"Inter\";font-style:normal;font-weight:400;font-display:swap;src:url(\"assets/fonts/Inter-Regular.woff2?v=3.19\") format(\"woff2\"), url(\"assets/fonts/Inter-Regular.woff?v=3.19\") format(\"woff\")}@font-face{font-family:\"Inter\";font-style:normal;font-weight:500;font-display:swap;src:url(\"assets/fonts/Inter-Medium.woff2?v=3.19\") format(\"woff2\"), url(\"assets/fonts/Inter-Medium.woff?v=3.19\") format(\"woff\")}@font-face{font-family:\"Inter\";font-style:normal;font-weight:600;font-display:swap;src:url(\"assets/fonts/Inter-SemiBold.woff2?v=3.19\") format(\"woff2\"), url(\"assets/fonts/Inter-SemiBold.woff?v=3.19\") format(\"woff\")}:host{--font-family-fallback:Gilroy, Arial, sans-serif;--font-family-headline:Gilroy;--font-family-content:Inter, var(--font-family-fallback);font-family:var(--font-family-content)}:root{--tet-link-color:var(--tc-text-primary);--tet-link-color-hover:var(--tc-text-secondary);--tet-link-color-active:var(--tc-text-tertiary);--tet-link-color-focus:var(--tc-blue-40);--tet-link-color-disabled:var(--tc-button-text-inverse-disabled);--tet-link-secondary-color:var(--tc-text-secondary);--tet-link-secondary-color-hover:var(--tc-text-primary)}.tet-link,.tet-link__arrow{text-decoration:underline;color:var(--tet-link-color);position:relative;line-height:1.5rem;cursor:pointer}.tet-link.dark,.tet-link__arrow.dark{--tet-link-color:var(--tc-text-primary-dark);--tet-link-color-hover:var(--tc-text-secondary-dark);--tet-link-color-active:var(--tc-text-tertiary-dark);--tet-link-color-focus:var(--tc-blue-40-dark);--tet-link-color-disabled:var(--tc-button-text-inverse-disabled-dark);--tet-link-secondary-color:var(--tc-text-secondary-dark);--tet-link-secondary-color-hover:var(--tc-text-primary-dark)}.tet-link.tet-link--secondary,.tet-link__arrow.tet-link--secondary{--tet-link-color:var(--tet-link-secondary-color);--tet-link-color-hover:var(--tet-link-secondary-color-hover)}.tet-link tet-icon,.tet-link__arrow tet-icon{--icon-color:var(--tet-link-color)}.tet-link:hover,.tet-link__arrow:hover{color:var(--tet-link-color-hover)}.tet-link:hover tet-icon,.tet-link__arrow:hover tet-icon{--icon-color:var(--tet-link-color-hover)}.tet-link:active,.tet-link__arrow:active{color:var(--tet-link-color-active)}.tet-link:active tet-icon,.tet-link__arrow:active tet-icon{--icon-color:var(--tet-link-color-active)}.tet-link:focus-visible,.tet-link__arrow:focus-visible{outline:0.125rem solid var(--tc-blue-40);outline-offset:0.125rem;transition:outline 0s;outline-color:var(--tet-link-color-focus);border-radius:0.125rem}.tet-link.disabled,.tet-link__arrow.disabled{color:var(--tet-link-color-disabled);pointer-events:none;cursor:auto}.tet-link.disabled tet-icon,.tet-link__arrow.disabled tet-icon{--icon-color:var(--tet-link-color-disabled)}.tet-link.disabled:focus-visible,.tet-link__arrow.disabled:focus-visible{outline:none}.tet-link tet-icon,.tet-link__arrow tet-icon{padding-left:0.25rem;padding-right:0.25rem;--icon-container-display:inline-block}.tet-link__arrow{padding-right:1.5rem}.tet-link__arrow::after{content:\"-->\";position:absolute;white-space:nowrap;display:inline-block;text-decoration:none;padding-left:0.25rem;letter-spacing:initial;transition:all 0.15s ease-in}.tet-link__arrow:hover::after{padding-left:0.375rem}:host{display:block;--b2b-cart-offset-top:0px}.light{--b2b-text-color:var(--tc-text-primary);--b2b-text-color-secondary:var(--tc-text-secondary);--b2b-background-color:var(--tc-layer-primary);--b2b-icon-background-color:var(--tc-layer-secondary);--b2b-icon-pressed-background-color:var(--tc-layer-quaternary);--b2b-box-shadow:var(--tc-elevation-one);--b2b-border-color:var(--tc-border-quaternary);--b2b-summary-block-color:var(--tc-layer-secondary);--b2b-summary-accent-color:var(--tc-yellow-20);--b2b-confirmation-dialog-icon-color:var(--tc-yellow-40);--b2b-success-dialog-icon-color:var(--tc-green-40)}.dark{--b2b-text-color:var(--tc-text-primary-dark);--b2b-text-color-secondary:var(--tc-text-secondary-dark);--b2b-background-color:var(--tc-layer-primary-dark);--b2b-icon-background-color:var(--tc-layer-secondary-dark);--b2b-icon-pressed-background-color:var(--tc-layer-quaternary-dark);--b2b-box-shadow:var(--tc-elevation-one-dark);--b2b-border-color:var(--tc-border-quaternary-dark);--b2b-summary-block-color:var(--tc-layer-secondary-dark);--b2b-summary-accent-color:var(--tc-grey-20-dark);--b2b-confirmation-dialog-icon-color:var(--tc-yellow-40-dark);--b2b-success-dialog-icon-color:var(--tc-green-40-dark)}button.button-reset{background:none;border:none;padding:0;font:inherit;color:inherit;text-align:inherit}.placeholder{--placeholder-animation-speed:5s}.configurator{display:flex;gap:1rem;flex-direction:column;color:var(--b2b-text-color)}@media screen and (min-width: 64rem){.configurator{gap:1.5rem;flex-direction:row;align-items:flex-start}}.offer{border-radius:1rem;height:fit-content;flex:0 0 calc(70% - 0.75rem);background-color:var(--b2b-background-color);box-shadow:var(--b2b-box-shadow)}.offer__block{--accordion-header-padding:1rem;--accordion-header-mobile-padding:1rem;--accordion-header-font:600 1.25rem/1.5rem Gilroy, Gilroy, Arial, sans-serif;--accordion-header-mobile-font:600 1.25rem/1.5rem Gilroy, Gilroy, Arial, sans-serif}.offer__block:first-child{--accordion-border-radius:1rem 1rem 0 0;--accordion-outer-border:var(--b2b-border-color)}.offer__block:last-child{--accordion-border-radius:0 0 1rem 1rem;--accordion-border-bottom-width:0}@media screen and (min-width: 64rem){.offer__block{--accordion-header-padding:1.5rem;--accordion-header-font:600 1.75rem/2rem Gilroy, Gilroy, Arial, sans-serif}}.offer__content{overflow:hidden;padding:1.5rem 1rem;display:flex;flex-direction:column;gap:0.75rem;border-color:var(--b2b-border-color);border-top-style:solid;border-top-width:0.0625rem}@media screen and (min-width: 48rem){.offer__content{padding:1.5rem}}@media screen and (min-width: 64rem){.offer__content{flex-direction:row;gap:1.5rem;padding-bottom:2.5rem}}.offer__navigation{margin:0 -1.5rem;flex:0 0 30%}@media screen and (min-width: 64rem){.offer__navigation{max-width:20.5rem;margin:0}}.offer__cards{flex:1 1 0%}.offer__cards-header{padding:0.5rem 0 0.75rem 0;display:flex;gap:0.5rem;justify-content:space-between;align-items:center}@media screen and (min-width: 64rem){.offer__cards-header{padding:1rem 0}}.offer__cards-list{display:flex;flex-direction:column;gap:1rem}.offer__cards-title{flex:auto;font:600 1rem/1.5rem \"Inter\", \"Gilroy, Arial, sans-serif\"}@media screen and (min-width: 64rem){.offer__cards-title{font:600 1.25rem/1.5rem \"Gilroy\", \"Gilroy, Arial, sans-serif\"}}.compare__button{border-radius:50%;overflow:hidden}@media screen and (min-width: 64rem){.compare__button{border-radius:0.125rem}}.compare__button:focus-visible{outline:0.125rem solid var(--tc-blue-40);outline-offset:0.125rem;transition:outline 0s}.compare__button.dark:focus-visible{outline:0.125rem solid var(--tc-blue-40);outline:0.125rem solid var(--tc-blue-40-dark);outline-offset:0.125rem;transition:outline 0s}.compare__button:active{--b2b-icon-background-color:var(--b2b-icon-pressed-background-color)}.compare__text{font:400 1rem/1.5rem \"Inter\", \"Gilroy, Arial, sans-serif\";display:none}@media screen and (min-width: 64rem){.compare__text{display:initial}}.compare__icon-wrapper{width:2.75rem;height:2.75rem;display:flex;justify-content:center;align-items:center;background-color:var(--b2b-icon-background-color);cursor:pointer}@media screen and (min-width: 64rem){.compare__icon-wrapper{display:none}}.compare__icon{--icon-size:1.5rem}.cart{flex:0 0 calc(30% - 0.75rem);position:sticky}.cart--edit{bottom:-1px;top:calc(var(--b2b-cart-sticky-top) + var(--b2b-cart-offset-top))}.cart--empty{display:none}@media screen and (min-width: 64rem){.cart--empty{display:flex}}.cart__card-list{padding:0 1rem 1rem;display:flex;flex-direction:column;gap:0.5rem}.cart__cta{display:block;align-self:center}@media screen and (min-width: 48rem){.cart__cta{align-self:flex-end}}.action-dialog{display:flex;flex-direction:column;gap:0.5rem;align-items:center;margin-bottom:1.5rem}.action-dialog--loading{--dialog-footer-border-color:transparent}.action-dialog__title{text-align:center;font:600 1.5rem/1.75rem \"Gilroy\", \"Gilroy, Arial, sans-serif\"}.action-dialog__description{font:400 1rem/1.5rem \"Inter\", \"Gilroy, Arial, sans-serif\"}.action-dialog__icon{--icon-size:3rem}.action-dialog__attention-icon{--icon-color:var(--b2b-confirmation-dialog-icon-color)}.action-dialog__success-icon{--icon-color:var(--b2b-success-dialog-icon-color)}.action-dialog__footer{display:flex;justify-content:space-between;flex:auto}.action-dialog__button-text{white-space:nowrap}";
98
+ const TetB2bConfiguratorStyle0 = tetB2bConfiguratorCss;
99
+
100
+ /** Constant with value X, that will be used to show skeleton fox >=X ms amount of time. */
101
+ const MIN_LOAD_TIME = 500;
102
+ /** Constant to use in desktop resolution checker. Should be same as one used in SCSS media query */
103
+ const DESKTOP_BREAKPOINT = 1024;
104
+ const TetB2bConfigurator$1 = /*@__PURE__*/ proxyCustomElement(class TetB2bConfigurator extends H {
105
+ constructor() {
106
+ super();
107
+ this.__registerHost();
108
+ this.__attachShadow();
109
+ this.compareLinkClick = createEvent(this, "compareLinkClick", 7);
110
+ this.b2bConfiguratorSubmit = createEvent(this, "b2bConfiguratorSubmit", 7);
111
+ this.successCloseClick = createEvent(this, "successCloseClick", 7);
112
+ /** @private The suffix for the price displayed - "€/mēn."). */
113
+ this.priceSuffix = '€/mēn.';
114
+ /** Syncs desktop resolution with state variable */
115
+ this.checkDesktopResolution = () => {
116
+ this.isDesktopResolution = window.innerWidth >= DESKTOP_BREAKPOINT;
117
+ };
118
+ /** Fetches the data and passes it to Stencil store */
119
+ this.fetchData = async () => {
120
+ const data = await b2bConfigurator();
121
+ initData(data);
122
+ };
123
+ /** Renders the placeholdes/skeleton */
124
+ this.renderPlaceholder = () => {
125
+ const darkTheme = this.theme === 'dark';
126
+ return [
127
+ h("div", { class: "offer placeholder" }, h("div", { style: { padding: this.isDesktopResolution ? '1.5rem' : '1rem' } }, h("tet-placeholder", { class: "placeholder", height: this.isDesktopResolution ? '2rem' : '1.5rem', darkTheme: darkTheme })), h("div", { class: "offer__content" }, h("tet-placeholder", { class: "placeholder offer__navigation", height: this.isDesktopResolution ? '48rem' : ' 2.25rem', darkTheme: darkTheme, style: { margin: '0' } }), h("div", { class: "offer__cards" }, h("div", { class: "offer__cards-list" }, h("tet-placeholder", { class: "placeholder", height: "3rem", darkTheme: darkTheme }), h("tet-placeholder", { class: "placeholder", height: "10.25rem", darkTheme: darkTheme }), h("tet-placeholder", { class: "placeholder", height: "10.25rem", darkTheme: darkTheme }), h("tet-placeholder", { class: "placeholder", height: "10.25rem", darkTheme: darkTheme }), h("tet-placeholder", { class: "placeholder", height: "10.25rem", darkTheme: darkTheme }))))),
128
+ h("div", { class: "cart cart--empty", style: {
129
+ 'padding': '1.5rem 1rem 1rem',
130
+ 'background-color': `var(--b2b-background-color)`
131
+ } }, h("tet-placeholder", { class: "placeholder", height: "12.75rem", darkTheme: darkTheme }))
132
+ ];
133
+ };
134
+ /**
135
+ * Handles event form navigation and sets currently active categories
136
+ * @param e
137
+ * @returns
138
+ */
139
+ this.categoryClickHandler = (e) => {
140
+ const { id } = e.detail;
141
+ const category = this.getCategoryById(id);
142
+ if (!category) {
143
+ return;
144
+ }
145
+ if (category.type === 'primary') {
146
+ this.activePrimaryCategoryId = id;
147
+ }
148
+ else {
149
+ this.activeSecondaryCategoryId = id;
150
+ }
151
+ };
152
+ /** Renders the offer section */
153
+ this.renderOffer = () => {
154
+ const blocks = [
155
+ { name: translate('components-b2b-offer-primary-title'), type: 'primary' },
156
+ { name: translate('components-b2b-offer-secondary-title'), type: 'secondary' }
157
+ ];
158
+ return (h("div", { class: { offer: true, [`offer--${this.theme}`]: true } }, blocks.map((block) => {
159
+ const menuItems = state.data
160
+ .filter((item) => item.type === block.type)
161
+ .map((category) => {
162
+ const { id, name, icon } = category;
163
+ const selected = id === this.activePrimaryCategoryId || id === this.activeSecondaryCategoryId;
164
+ return { id, name, icon, selected };
165
+ });
166
+ const accRefCallback = (el) => {
167
+ if (block.type === 'primary') {
168
+ this.primaryAccordionEl = el;
169
+ }
170
+ else {
171
+ this.secondaryAccordionEl = el;
172
+ }
173
+ };
174
+ const navRefCallback = (el) => {
175
+ if (block.type === 'primary') {
176
+ this.primaryNavEl = el;
177
+ }
178
+ else {
179
+ this.secondaryNavEl = el;
180
+ }
181
+ };
182
+ return (h("tet-accordion", { ref: accRefCallback, key: block.type, class: "offer__block", isOpen: block.type === 'primary', header: block.name, withBorder: true, theme: this.theme, transparentBackground: true }, h("div", { class: "offer__content" }, h("div", { class: "offer__navigation" }, h("tet-business-navigation", { ref: navRefCallback, menuItems: menuItems, theme: this.theme, "onMenu-click-event": this.categoryClickHandler })), this.renderCards(block.type))));
183
+ })));
184
+ };
185
+ /**
186
+ * Finds category by id. Returns category or undefined.
187
+ * @param categoryId
188
+ * @returns
189
+ */
190
+ this.getCategoryById = (categoryId) => {
191
+ return state.data.find((category) => category.id === categoryId);
192
+ };
193
+ /**
194
+ * Event, emitted on compare link click with the relevant modal Id
195
+ * @param categoryId
196
+ * @returns
197
+ */
198
+ this.onCompareLinkClick = (categoryId) => {
199
+ const category = this.getCategoryById(categoryId);
200
+ if (!category || !category.modalScreenId) {
201
+ return;
202
+ }
203
+ this.compareLinkClick.emit(category.modalScreenId);
204
+ };
205
+ /**
206
+ * Handles card selection (aka. oepen state). Checks for single|multi choice
207
+ * @param cardId
208
+ * @param categoryId
209
+ * @returns
210
+ */
211
+ this.handleCardSelected = (cardId, categoryId) => {
212
+ const category = this.getCategoryById(categoryId);
213
+ if (!category) {
214
+ return;
215
+ }
216
+ const { type, allowMultipleChoice } = category;
217
+ if (type === 'primary') {
218
+ if (this.selectedPrimaryCards.includes(cardId)) {
219
+ return;
220
+ }
221
+ this.selectedPrimaryCards = allowMultipleChoice ? [...this.selectedPrimaryCards, cardId] : [cardId];
222
+ }
223
+ else {
224
+ if (this.selectedSecondaryCards.includes(cardId)) {
225
+ return;
226
+ }
227
+ this.selectedSecondaryCards = allowMultipleChoice ? [...this.selectedSecondaryCards, cardId] : [cardId];
228
+ }
229
+ };
230
+ /**
231
+ * Updates product in cart (add, edit, remove)
232
+ * In desktop mode - changes state of summary cart's accordions
233
+ * @param e
234
+ * @param categoryId
235
+ */
236
+ this.handleProductCountChanged = async (e, categoryId) => {
237
+ const { cardId, count } = e.detail;
238
+ const productCategory = this.getCategoryById(categoryId);
239
+ if (!productCategory || state.cart.get(cardId) === count) {
240
+ return;
241
+ }
242
+ if (!count) {
243
+ this.itemToRemove = cardId;
244
+ this.confirmationDialogEl.open();
245
+ return;
246
+ }
247
+ if (!productCategory.allowMultipleChoice) {
248
+ productCategory.products.forEach((product) => product.productCode !== cardId && removeFromCart(product.productCode));
249
+ }
250
+ addToCart(cardId, count);
251
+ if (this.isDesktopResolution) {
252
+ this.cartEl.changeBlockState(productCategory.type, 'open');
253
+ this.cartEl.changeBlockState(productCategory.type === 'primary' ? 'secondary' : 'primary', 'close');
254
+ }
255
+ };
256
+ /** Resets itemId to be removed when confirmation dialog is closed */
257
+ this.onConfirmationClose = () => {
258
+ this.itemToRemove = null;
259
+ };
260
+ /** Renders confirmation dialog, shown on product removal action */
261
+ this.renderConfirmationDialog = () => {
262
+ return (h("tet-dialog", { ref: (el) => (this.confirmationDialogEl = el), class: this.theme, closeOnOverlayClick: false, onCloseDialog: this.onConfirmationClose, theme: this.theme }, h("div", { class: "action-dialog" }, h("tet-icon", { class: "action-dialog__icon action-dialog__attention-icon", name: "attention" }), h("div", { class: "action-dialog__title" }, translate('components-b2b-item-remove-confirmation-title'))), h("div", { slot: "footer", class: "action-dialog__footer" }, h("tet-button", { type: "secondary", theme: this.theme, size: "large", onClick: () => this.confirmationDialogEl.close() }, translate('components-b2b-item-remove-confirmation-decline')), h("tet-button", { type: "primary", theme: this.theme, size: "large", iconName: "tc-trash", iconPosition: "left", onClick: () => {
263
+ removeFromCart(this.itemToRemove);
264
+ this.confirmationDialogEl.close();
265
+ } }, translate('components-b2b-item-remove-confirmation-accept')))));
266
+ };
267
+ /** Performs action to start again */
268
+ this.resetState = () => {
269
+ resetCart();
270
+ this.checkoutAttempted = false;
271
+ this.primaryAccordionEl.open();
272
+ this.secondaryAccordionEl.close();
273
+ };
274
+ /** Renders dialog, shown after form submit */
275
+ this.renderSubmissionStateDialog = () => {
276
+ const isFormSubmitLoading = this.formState === 'loading';
277
+ const successClose = () => {
278
+ this.resetState();
279
+ this.successCloseClick.emit();
280
+ this.submissionStateDialogEl.close();
281
+ };
282
+ const content = isFormSubmitLoading ? (h("div", { class: "action-dialog" }, h("tet-spinner", { theme: this.theme }), h("div", { class: "action-dialog__title" }, translate('components-b2b-loading-dialog-title')), h("div", { class: "action-dialog__description" }, translate('components-b2b-loading-dialog-description')))) : ([
283
+ h("div", { class: "action-dialog" }, h("tet-icon", { class: "action-dialog__icon action-dialog__success-icon", name: "tc-check-circle" }), h("div", { class: "action-dialog__title" }, translate('components-b2b-success-dialog-title')), h("div", { class: "action-dialog__description" }, translate('components-b2b-success-dialog-description'))),
284
+ h("div", { slot: "footer", class: "action-dialog__footer" }, h("tet-button", { type: "secondary", theme: this.theme, size: "large", onClick: successClose }, h("div", { class: "action-dialog__button-text" }, translate('components-b2b-success-dialog-close'))), h("tet-button", { type: "primary", theme: this.theme, size: "large", onClick: () => {
285
+ this.resetState();
286
+ this.submissionStateDialogEl.close();
287
+ } }, h("div", { class: "action-dialog__button-text" }, translate('components-b2b-success-dialog-start-again'))))
288
+ ]);
289
+ return (h("tet-dialog", { ref: (el) => (this.submissionStateDialogEl = el), class: { [this.theme]: true, 'action-dialog--loading': isFormSubmitLoading }, closeOnOverlayClick: false, closeOnEscape: !isFormSubmitLoading, hideCloseButton: isFormSubmitLoading, theme: this.theme, onCloseDialog: this.formState === 'success' ? successClose : this.submissionStateDialogEl.close }, content));
290
+ };
291
+ /**
292
+ * Renders offer section cards for the given category type
293
+ * @param categoryType The type of category block to render
294
+ * @returns
295
+ */
296
+ this.renderCards = (categoryType) => {
297
+ var _a;
298
+ const activeCategoryId = categoryType === 'primary' ? this.activePrimaryCategoryId : this.activeSecondaryCategoryId;
299
+ const selectedCards = categoryType === 'primary' ? this.selectedPrimaryCards : this.selectedSecondaryCards;
300
+ const products = ((_a = this.getCategoryById(activeCategoryId)) === null || _a === void 0 ? void 0 : _a.products) || [];
301
+ const cards = products.map((product) => {
302
+ var _a, _b;
303
+ const { productCode: id, name: { lv: title }, description: { lv: subtitle }, amount: price, b2bConfiguratorProduct: { discountAmount: discountPrice, selectionType, defaultValue, minValue, maxValue, translationKey: label }, benefits: { lv: benefits }, contracts } = product;
304
+ const isBestChoice = !!((_a = product.attributes.find((attribute) => attribute.key === 'isBestChoice')) === null || _a === void 0 ? void 0 : _a.value);
305
+ const counterOptions = selectionType === 'single'
306
+ ? undefined
307
+ : {
308
+ defaultValue,
309
+ minValue,
310
+ maxValue,
311
+ label
312
+ };
313
+ const options = {
314
+ id,
315
+ title,
316
+ subtitle,
317
+ isBestChoice,
318
+ price,
319
+ discountPrice,
320
+ benefits: benefits.split('\n'),
321
+ contract: (_b = contracts[0]) === null || _b === void 0 ? void 0 : _b.contract,
322
+ counterOptions
323
+ };
324
+ const isSelected = selectedCards.includes(id);
325
+ return (h("tet-b2b-compare-card", { options: options, theme: this.theme, key: id, isSelected: isSelected, onSelectedChange: () => this.handleCardSelected(id, activeCategoryId), count: state.cart.get(id), onCountChange: (e) => this.handleProductCountChanged(e, activeCategoryId) }));
326
+ });
327
+ return (h("div", { class: "offer__cards" }, h("div", { class: "offer__cards-header" }, h("div", { class: "offer__cards-title" }, translate('components-b2b-offer-product-list-title')), h("button", { class: { 'button-reset': true, 'compare__button': true, [`${this.theme}`]: true }, onClick: () => {
328
+ this.onCompareLinkClick(activeCategoryId);
329
+ } }, h("span", { class: { 'compare__text': true, 'tet-link': true, [`${this.theme}`]: true } }, translate('components-b2b-offer-compare-link-text')), h("div", { class: "compare__icon-wrapper" }, h("tet-icon", { class: "compare__icon", name: "tc-info-circle-outline", theme: this.theme })))), h("div", { class: "offer__cards-list" }, cards)));
330
+ };
331
+ /**
332
+ * Translates Cart "count change" event and uses in the general "count change" handler
333
+ * @param cardId
334
+ * @param count
335
+ * @param categoryId
336
+ */
337
+ this.handleCartProductCountChange = (cardId, count, categoryId) => {
338
+ const updateEvent = { detail: { cardId, count } };
339
+ this.handleProductCountChanged(updateEvent, categoryId);
340
+ };
341
+ /**
342
+ * Navigates user in offer section by opening accordion and selecting the specific product which was clicked in cart component
343
+ * @param categoryId
344
+ * @param productCode
345
+ * @returns
346
+ */
347
+ this.goToProduct = async (categoryId, productCode) => {
348
+ const category = this.getCategoryById(categoryId);
349
+ if (!category) {
350
+ return;
351
+ }
352
+ if (category.type === 'primary') {
353
+ await this.primaryAccordionEl.open();
354
+ await this.primaryNavEl.selectMenuItem(categoryId);
355
+ this.primaryAccordionEl.scrollIntoView({ behavior: 'smooth' });
356
+ }
357
+ else if (category.type === 'secondary') {
358
+ await this.secondaryAccordionEl.open();
359
+ await this.secondaryNavEl.selectMenuItem(categoryId);
360
+ this.secondaryAccordionEl.scrollIntoView({ behavior: 'smooth' });
361
+ }
362
+ setTimeout(() => {
363
+ this.handleCardSelected(productCode, categoryId);
364
+ }, 0);
365
+ };
366
+ /**
367
+ * Renders list of Cards in Cart depending on context
368
+ * @param context
369
+ * @returns
370
+ */
371
+ this.renderCartCardsList = (context) => {
372
+ const categoryTypes = ['primary', 'secondary'];
373
+ const productCodeToSummaryCard = (productCode) => {
374
+ const count = state.cart.get(productCode);
375
+ const details = state.productDetails.get(productCode);
376
+ if (count === undefined || !details) {
377
+ return null;
378
+ }
379
+ const { name, amount, description, discountAmount, categoryName, categoryType, categoryId, b2bConfiguratorProduct } = details;
380
+ const productDescription = categoryType === 'primary' ? description : categoryName;
381
+ const { selectionType, term, minValue, maxValue, translationKey } = b2bConfiguratorProduct;
382
+ const activeCategoryId = categoryType === 'primary' ? this.activePrimaryCategoryId : this.activeSecondaryCategoryId;
383
+ return (h("tet-business-summary-card", { key: productCode, productName: name, price: amount, productDescription: productDescription, discountPrice: discountAmount, currency: this.priceSuffix, contractTerm: term, theme: this.theme, withStepper: selectionType === 'number', value: count, minValue: minValue, maxValue: maxValue, stepperLabel: translate(translationKey || ''), context: context, onAmountChange: (e) => this.handleCartProductCountChange(productCode, e.detail, activeCategoryId), onDeleteButtonClick: () => this.handleCartProductCountChange(productCode, 0, activeCategoryId), onEditButtonClick: () => this.goToProduct(categoryId, productCode) }));
384
+ };
385
+ return categoryTypes.map((type) => {
386
+ const summaryCards = [...state.cart]
387
+ .filter(([productCode]) => {
388
+ const details = state.productDetails.get(productCode);
389
+ return details && details.categoryType === type;
390
+ })
391
+ .map(([productCode]) => productCodeToSummaryCard(productCode));
392
+ return summaryCards.length ? (h("div", { class: "cart__card-list", slot: type }, summaryCards)) : null;
393
+ });
394
+ };
395
+ /** Adjusts the top position variable for the sticky cart element */
396
+ this.positionStickyCartEl = () => {
397
+ if (this.referenceElement) {
398
+ if (this.isDesktopResolution) {
399
+ this.hostElement.style.setProperty('--b2b-cart-sticky-top', `${this.referenceElement.offsetTop}px`);
400
+ }
401
+ else {
402
+ this.hostElement.style.removeProperty('--b2b-cart-sticky-top');
403
+ }
404
+ }
405
+ };
406
+ /**
407
+ * Renders Cart content depending on context
408
+ * @param context
409
+ * @returns
410
+ */
411
+ this.renderCart = (context = 'edit') => {
412
+ var _a;
413
+ const isCartEmpty = !state.cart.size;
414
+ let summaryAmounts = { primary: 0, secondary: 0 };
415
+ let summaryCounts = { primary: 0, secondary: 0 };
416
+ let summaryWouldBeAmount = 0;
417
+ for (const [key, count] of state.cart) {
418
+ const details = state.productDetails.get(key);
419
+ if (!details) {
420
+ continue;
421
+ }
422
+ summaryAmounts[details.categoryType] += ((_a = details.discountAmount) !== null && _a !== void 0 ? _a : details.amount) * count;
423
+ summaryCounts[details.categoryType] += 1;
424
+ summaryWouldBeAmount += details.amount * count;
425
+ }
426
+ const { primary: primaryAmount, secondary: secondaryAmount } = summaryAmounts;
427
+ const summaryAmount = primaryAmount + secondaryAmount;
428
+ const summarySavings = summaryWouldBeAmount - summaryAmount;
429
+ const { primary, secondary } = this.areProductsAddedToCart();
430
+ const hasPrimaryNotification = context === 'edit' && this.checkoutAttempted && !primary;
431
+ const hasSecondaryNotification = context === 'edit' && this.checkoutAttempted && !secondary;
432
+ const data = {
433
+ summaryAmount: summaryAmount.toFixed(2),
434
+ primaryAmount: primaryAmount.toFixed(2),
435
+ secondaryAmount: secondaryAmount.toFixed(2),
436
+ primaryCount: summaryCounts.primary,
437
+ secondaryCount: summaryCounts.secondary,
438
+ summarySavings: summarySavings.toFixed(2),
439
+ hasPrimaryNotification,
440
+ hasSecondaryNotification
441
+ };
442
+ const ctaButton = context === 'edit' ? (h("tet-button", { onClick: this.checkout, slot: "cta", class: "cart__cta", type: "primary", size: this.isDesktopResolution ? 'large' : 'medium', theme: this.theme }, translate('components-b2b-cart-cta-button-title'))) : null;
443
+ return (h("tet-b2b-configurator-cart", { ref: (el) => (context === 'edit' ? (this.cartEl = el) : null), context: context, class: { 'cart': true, 'cart--empty': isCartEmpty, [`cart--${context}`]: true }, data: data, theme: this.theme, isCartEmpty: isCartEmpty, isDesktopResolution: this.isDesktopResolution }, this.renderCartCardsList(context), ctaButton));
444
+ };
445
+ /** Checks if both primary and secondary products are currently in cart */
446
+ this.areProductsAddedToCart = () => {
447
+ const productsInCart = { primary: false, secondary: false };
448
+ for (const [key, _] of state.cart) {
449
+ const details = state.productDetails.get(key);
450
+ if (!details) {
451
+ continue;
452
+ }
453
+ productsInCart[details.categoryType] = true;
454
+ }
455
+ return productsInCart;
456
+ };
457
+ /** Cart checkout handler. Opens Checkout component*/
458
+ this.checkout = () => {
459
+ this.checkoutAttempted = true;
460
+ const { primary, secondary } = this.areProductsAddedToCart();
461
+ if (primary && secondary) {
462
+ this.checkoutFormEl.open();
463
+ }
464
+ };
465
+ /**
466
+ * Catches emitted checkout form data
467
+ * Combines with cart data and re-emits
468
+ * @param e
469
+ */
470
+ this.submit = ({ detail }) => {
471
+ const data = {
472
+ cart: getCart(),
473
+ contactInfo: detail
474
+ };
475
+ this.formState = 'loading';
476
+ this.b2bConfiguratorSubmit.emit(data);
477
+ this.checkoutFormEl.close();
478
+ this.submissionStateDialogEl.open();
479
+ };
480
+ this.renderCheckoutForm = () => {
481
+ return (h("tet-b2b-check-out-form", { ref: (el) => (this.checkoutFormEl = el), theme: this.theme, "onSubmit-check-out-form": this.submit }, h("div", { slot: "cart" }, this.renderCart('checkout'))));
482
+ };
483
+ this.referenceElement = undefined;
484
+ this.isLoading = true;
485
+ this.itemToRemove = null;
486
+ this.checkoutAttempted = false;
487
+ this.formState = 'success';
488
+ this.activePrimaryCategoryId = null;
489
+ this.activeSecondaryCategoryId = null;
490
+ this.selectedPrimaryCards = [];
491
+ this.selectedSecondaryCards = [];
492
+ this.isDesktopResolution = undefined;
493
+ this.theme = 'light';
494
+ this.stickyRefEl = '';
495
+ }
496
+ /** Resets selected (open) primary cards on category change */
497
+ resetSelectedPrimaryCards() {
498
+ this.selectedPrimaryCards = [];
499
+ }
500
+ /** Resets selected (open) secondary cards on category change */
501
+ resetSelectedSecondaryCards() {
502
+ this.selectedSecondaryCards = [];
503
+ }
504
+ /** Checks for desktop resolution and intializes the sticky element's reference using the provided prop or the host's parent */
505
+ async componentWillLoad() {
506
+ this.checkDesktopResolution();
507
+ this.referenceElement = this.stickyRefEl
508
+ ? document.querySelector(this.stickyRefEl)
509
+ : this.hostElement.parentElement;
510
+ }
511
+ /**
512
+ * Initiates:
513
+ * - data (with minimum load time to reduce flickering)
514
+ * - selected categories for each type
515
+ * - sticky elements position
516
+ */
517
+ async componentDidLoad() {
518
+ var _a, _b;
519
+ this.isLoading = true;
520
+ await ensureMinDuration(this.fetchData, MIN_LOAD_TIME);
521
+ this.isLoading = false;
522
+ this.activePrimaryCategoryId = ((_a = state.data.find((category) => category.type === 'primary')) === null || _a === void 0 ? void 0 : _a.id) || null;
523
+ this.activeSecondaryCategoryId = ((_b = state.data.find((category) => category.type === 'secondary')) === null || _b === void 0 ? void 0 : _b.id) || null;
524
+ this.positionStickyCartEl();
525
+ }
526
+ /**
527
+ * Initiates desktop resolution listener and sticky adjustement on window resize
528
+ */
529
+ onResize() {
530
+ this.checkDesktopResolution();
531
+ this.positionStickyCartEl();
532
+ }
533
+ /** Sets the value of form submission status*/
534
+ async setSubmitFormState(value) {
535
+ this.formState = value;
536
+ }
537
+ render() {
538
+ return (h(Host, { key: 'e7d2ab1d76e8ad347393bde30d0d71a7425ca2f7' }, h("div", { key: 'af251291fbb1cdf8c6eb1c3928f1fcd99181fa25', class: { configurator: true, [`${this.theme}`]: true } }, this.isLoading ? this.renderPlaceholder() : state.data && [this.renderOffer(), this.renderCart()]), this.renderCheckoutForm(), this.renderConfirmationDialog(), this.renderSubmissionStateDialog()));
539
+ }
540
+ get hostElement() { return this; }
541
+ static get watchers() { return {
542
+ "activePrimaryCategoryId": ["resetSelectedPrimaryCards"],
543
+ "activeSecondaryCategoryId": ["resetSelectedSecondaryCards"]
544
+ }; }
545
+ static get style() { return TetB2bConfiguratorStyle0; }
546
+ }, [1, "tet-b2b-configurator", {
547
+ "theme": [1],
548
+ "stickyRefEl": [1, "sticky-ref-el"],
549
+ "referenceElement": [32],
550
+ "isLoading": [32],
551
+ "itemToRemove": [32],
552
+ "checkoutAttempted": [32],
553
+ "formState": [32],
554
+ "activePrimaryCategoryId": [32],
555
+ "activeSecondaryCategoryId": [32],
556
+ "selectedPrimaryCards": [32],
557
+ "selectedSecondaryCards": [32],
558
+ "isDesktopResolution": [32],
559
+ "setSubmitFormState": [64]
560
+ }, [[9, "resize", "onResize"]], {
561
+ "activePrimaryCategoryId": ["resetSelectedPrimaryCards"],
562
+ "activeSecondaryCategoryId": ["resetSelectedSecondaryCards"]
563
+ }]);
564
+ function defineCustomElement$1() {
565
+ if (typeof customElements === "undefined") {
566
+ return;
567
+ }
568
+ const components = ["tet-b2b-configurator", "tet-accordion", "tet-b2b-check-out-form", "tet-b2b-compare-card", "tet-b2b-configurator-cart", "tet-business-navigation", "tet-business-summary-card", "tet-button", "tet-checkbox", "tet-dialog", "tet-icon", "tet-input", "tet-notification", "tet-placeholder", "tet-spinner", "tet-stepper-input", "tet-text-list"];
569
+ components.forEach(tagName => { switch (tagName) {
570
+ case "tet-b2b-configurator":
571
+ if (!customElements.get(tagName)) {
572
+ customElements.define(tagName, TetB2bConfigurator$1);
573
+ }
574
+ break;
575
+ case "tet-accordion":
576
+ if (!customElements.get(tagName)) {
577
+ defineCustomElement$h();
578
+ }
579
+ break;
580
+ case "tet-b2b-check-out-form":
581
+ if (!customElements.get(tagName)) {
582
+ defineCustomElement$g();
583
+ }
584
+ break;
585
+ case "tet-b2b-compare-card":
586
+ if (!customElements.get(tagName)) {
587
+ defineCustomElement$f();
588
+ }
589
+ break;
590
+ case "tet-b2b-configurator-cart":
591
+ if (!customElements.get(tagName)) {
592
+ defineCustomElement$e();
593
+ }
594
+ break;
595
+ case "tet-business-navigation":
596
+ if (!customElements.get(tagName)) {
597
+ defineCustomElement$d();
598
+ }
599
+ break;
600
+ case "tet-business-summary-card":
601
+ if (!customElements.get(tagName)) {
602
+ defineCustomElement$c();
603
+ }
604
+ break;
605
+ case "tet-button":
606
+ if (!customElements.get(tagName)) {
607
+ defineCustomElement$b();
608
+ }
609
+ break;
610
+ case "tet-checkbox":
611
+ if (!customElements.get(tagName)) {
612
+ defineCustomElement$a();
613
+ }
614
+ break;
615
+ case "tet-dialog":
616
+ if (!customElements.get(tagName)) {
617
+ defineCustomElement$9();
618
+ }
619
+ break;
620
+ case "tet-icon":
621
+ if (!customElements.get(tagName)) {
622
+ defineCustomElement$8();
623
+ }
624
+ break;
625
+ case "tet-input":
626
+ if (!customElements.get(tagName)) {
627
+ defineCustomElement$7();
628
+ }
629
+ break;
630
+ case "tet-notification":
631
+ if (!customElements.get(tagName)) {
632
+ defineCustomElement$6();
633
+ }
634
+ break;
635
+ case "tet-placeholder":
636
+ if (!customElements.get(tagName)) {
637
+ defineCustomElement$5();
638
+ }
639
+ break;
640
+ case "tet-spinner":
641
+ if (!customElements.get(tagName)) {
642
+ defineCustomElement$4();
643
+ }
644
+ break;
645
+ case "tet-stepper-input":
646
+ if (!customElements.get(tagName)) {
647
+ defineCustomElement$3();
648
+ }
649
+ break;
650
+ case "tet-text-list":
651
+ if (!customElements.get(tagName)) {
652
+ defineCustomElement$2();
653
+ }
654
+ break;
655
+ } });
656
+ }
657
+
658
+ const TetB2bConfigurator = TetB2bConfigurator$1;
659
+ const defineCustomElement = defineCustomElement$1;
660
+
661
+ export { TetB2bConfigurator, defineCustomElement };