vviinn-widgets 2.196.0 → 2.197.0

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 (140) hide show
  1. package/dist/cjs/{index-CpJcNhVM.js → index-BrWTzRc7.js} +16 -14
  2. package/dist/cjs/index-ClWQDYyW.js +399 -0
  3. package/dist/{esm/index-CckoTlaC.js → cjs/index-DLEDOlRe.js} +25 -1
  4. package/dist/cjs/index-OrE9ITel.js +2 -6
  5. package/dist/cjs/loader.cjs.js +1 -1
  6. package/dist/cjs/{package-Dp3CQTMp.js → package-BL578Fil.js} +1 -1
  7. package/dist/cjs/{search.store-B_KXvC4d.js → search.store-DHFf8KQS.js} +74 -3
  8. package/dist/cjs/vviinn-button_6.cjs.entry.js +20 -21
  9. package/dist/cjs/{vviinn-camera_11.cjs.entry.js → vviinn-camera_12.cjs.entry.js} +344 -72
  10. package/dist/cjs/vviinn-carousel_10.cjs.entry.js +77 -74
  11. package/dist/cjs/vviinn-detected-object_2.cjs.entry.js +1 -1
  12. package/dist/cjs/vviinn-shop-the-look.cjs.entry.js +2 -2
  13. package/dist/cjs/vviinn-text-search.cjs.entry.js +4 -4
  14. package/dist/cjs/vviinn-vps-button.cjs.entry.js +5 -6
  15. package/dist/cjs/vviinn-widgets.cjs.js +1 -1
  16. package/dist/collection/components/vviinn-error/vviinn-error.css +2 -0
  17. package/dist/collection/components/vviinn-filters/helpers/extractSelectedFilters.js +33 -0
  18. package/dist/collection/components/vviinn-filters/helpers/filterValueUtils.js +29 -0
  19. package/dist/collection/components/vviinn-filters/helpers/index.js +3 -0
  20. package/dist/collection/components/vviinn-filters/helpers/isSubFilterActive.js +2 -3
  21. package/dist/collection/components/vviinn-filters/helpers/subFilterSelection.js +18 -6
  22. package/dist/collection/components/vviinn-filters/helpers/syncRequestFilters.js +14 -0
  23. package/dist/collection/components/vviinn-filters/vviinn-extended-filters.js +12 -7
  24. package/dist/collection/components/vviinn-filters/vviinn-filters.css +21 -16
  25. package/dist/collection/components/vviinn-filters/vviinn-filters.js +8 -5
  26. package/dist/collection/components/vviinn-filters/vviinn-selected-filters.js +14 -6
  27. package/dist/collection/components/vviinn-image/vviinn-image.js +3 -3
  28. package/dist/collection/components/vviinn-image-selector/vviinn-image-selector.js +2 -2
  29. package/dist/collection/components/vviinn-modal/vviinn-modal.js +2 -2
  30. package/dist/collection/components/vviinn-overlay/vviinn-overlay.js +1 -1
  31. package/dist/collection/components/vviinn-overlayed-modal/vviinn-overlayed-modal.js +1 -1
  32. package/dist/collection/components/vviinn-preloader/vviinn-preloader.js +1 -1
  33. package/dist/collection/components/vviinn-privacy-badge/vviinn-privacy-badge.js +1 -1
  34. package/dist/collection/components/vviinn-product-card/vviinn-energy-label/vviinn-energy-label.js +2 -2
  35. package/dist/collection/components/vviinn-results/vviinn-results.js +3 -3
  36. package/dist/collection/components/vviinn-shop-the-look/vviinn-shop-the-look.js +1 -1
  37. package/dist/collection/components/vviinn-skeleton/vviinn-skeleton.js +1 -1
  38. package/dist/collection/components/vviinn-slider/vviinn-slide/vviinn-slide.js +1 -1
  39. package/dist/collection/components/vviinn-slider/vviinn-slider.js +1 -1
  40. package/dist/collection/components/vviinn-suggestions/vviinn-suggestions.css +6 -1
  41. package/dist/collection/components/vviinn-teaser/vviinn-teaser.js +1 -1
  42. package/dist/collection/components/vviinn-text-search/vviinn-text-search.js +2 -2
  43. package/dist/collection/components/vviinn-vpr-button/recommendations-sidebar/recommendations-sidebar.js +3 -3
  44. package/dist/collection/components/vviinn-vpr-button/vviinn-vpr-button.js +1 -1
  45. package/dist/collection/components/vviinn-vps-button/vviinn-vps-button.js +1 -1
  46. package/dist/collection/components/vviinn-vps-widget/vviinn-vps-widget.css +19 -42
  47. package/dist/collection/components/vviinn-vps-widget/vviinn-vps-widget.js +10 -10
  48. package/dist/collection/cssParts/index.js +2 -13
  49. package/dist/collection/cssParts/suggestions.js +12 -0
  50. package/dist/collection/store/search.store.js +8 -3
  51. package/dist/esm/index-C5qrIvmr.js +2 -6
  52. package/dist/esm/{index-g0rpLM84.js → index-CtuL3RiP.js} +16 -15
  53. package/dist/{cjs/index-tXcMfW9y.js → esm/index-DlCdKcyY.js} +10 -6
  54. package/dist/esm/index-E1xSXX9S.js +369 -0
  55. package/dist/esm/loader.js +1 -1
  56. package/dist/esm/{package-DjzQfs4n.js → package-DZVuE7LY.js} +1 -1
  57. package/dist/esm/{search.store-LhkDttfN.js → search.store-BtRgJeHn.js} +71 -4
  58. package/dist/esm/vviinn-button_6.entry.js +12 -13
  59. package/dist/esm/{vviinn-camera_11.entry.js → vviinn-camera_12.entry.js} +307 -36
  60. package/dist/esm/vviinn-carousel_10.entry.js +28 -25
  61. package/dist/esm/vviinn-detected-object_2.entry.js +1 -1
  62. package/dist/esm/vviinn-shop-the-look.entry.js +2 -2
  63. package/dist/esm/vviinn-text-search.entry.js +4 -4
  64. package/dist/esm/vviinn-vps-button.entry.js +2 -3
  65. package/dist/esm/vviinn-widgets.js +1 -1
  66. package/dist/types/components/vviinn-filters/helpers/extractSelectedFilters.d.ts +6 -0
  67. package/dist/types/components/vviinn-filters/helpers/filterValueUtils.d.ts +8 -0
  68. package/dist/types/components/vviinn-filters/helpers/index.d.ts +3 -0
  69. package/dist/types/components/vviinn-filters/helpers/syncRequestFilters.d.ts +7 -0
  70. package/dist/types/components.d.ts +8 -2
  71. package/dist/types/cssParts/index.d.ts +0 -1
  72. package/dist/types/cssParts/suggestions.d.ts +1 -0
  73. package/dist/vviinn-widgets/p-2c7fc702.entry.js +1 -0
  74. package/dist/vviinn-widgets/{p-4bce3cbd.entry.js → p-60672b4b.entry.js} +1 -1
  75. package/dist/vviinn-widgets/p-6c573566.entry.js +1 -0
  76. package/dist/vviinn-widgets/p-9a96a901.entry.js +1 -0
  77. package/dist/vviinn-widgets/p-BvC9-bcY.js +1 -0
  78. package/dist/vviinn-widgets/p-CtuL3RiP.js +1 -0
  79. package/dist/vviinn-widgets/{p-DjzQfs4n.js → p-DZVuE7LY.js} +1 -1
  80. package/dist/vviinn-widgets/p-DlCdKcyY.js +1 -0
  81. package/dist/vviinn-widgets/p-OChFjzgO.js +1 -0
  82. package/{www/build/p-d5889e8d.entry.js → dist/vviinn-widgets/p-c6fad937.entry.js} +1 -1
  83. package/{www/build/p-2c1a8263.entry.js → dist/vviinn-widgets/p-ce7c3af0.entry.js} +1 -1
  84. package/dist/vviinn-widgets/p-f3b8af7d.entry.js +1 -0
  85. package/dist/vviinn-widgets/vviinn-widgets.esm.js +1 -1
  86. package/package.json +1 -1
  87. package/www/build/p-2c7fc702.entry.js +1 -0
  88. package/www/build/{p-4bce3cbd.entry.js → p-60672b4b.entry.js} +1 -1
  89. package/www/build/p-6c573566.entry.js +1 -0
  90. package/www/build/p-9a96a901.entry.js +1 -0
  91. package/www/build/p-BvC9-bcY.js +1 -0
  92. package/www/build/p-CtuL3RiP.js +1 -0
  93. package/www/build/{p-DjzQfs4n.js → p-DZVuE7LY.js} +1 -1
  94. package/www/build/p-DlCdKcyY.js +1 -0
  95. package/www/build/p-OChFjzgO.js +1 -0
  96. package/www/build/p-b4b6c1f6.js +1 -0
  97. package/{dist/vviinn-widgets/p-d5889e8d.entry.js → www/build/p-c6fad937.entry.js} +1 -1
  98. package/{dist/vviinn-widgets/p-2c1a8263.entry.js → www/build/p-ce7c3af0.entry.js} +1 -1
  99. package/www/build/p-f3b8af7d.entry.js +1 -0
  100. package/www/build/vviinn-widgets.esm.js +1 -1
  101. package/www/index.html +1 -1
  102. package/dist/cjs/RenderFilterButton-CSLqPags.js +0 -103
  103. package/dist/cjs/constants-BlwqMvns.js +0 -20
  104. package/dist/cjs/index-B-eF0nQu.js +0 -177
  105. package/dist/cjs/index-C3G9W48a.js +0 -24
  106. package/dist/cjs/triggerFilter-DFGg92Xh.js +0 -100
  107. package/dist/cjs/vviinn-selected-filters.cjs.entry.js +0 -262
  108. package/dist/esm/RenderFilterButton-DbAF7O7r.js +0 -95
  109. package/dist/esm/constants-rqiiCPBX.js +0 -11
  110. package/dist/esm/index-C5MrXMjM.js +0 -20
  111. package/dist/esm/index-lFn09yLT.js +0 -158
  112. package/dist/esm/triggerFilter-B4e4JwCJ.js +0 -96
  113. package/dist/esm/vviinn-selected-filters.entry.js +0 -260
  114. package/dist/vviinn-widgets/p-3be1bd0e.entry.js +0 -1
  115. package/dist/vviinn-widgets/p-5hlq91W8.js +0 -1
  116. package/dist/vviinn-widgets/p-7339b95e.entry.js +0 -1
  117. package/dist/vviinn-widgets/p-B4e4JwCJ.js +0 -1
  118. package/dist/vviinn-widgets/p-ByDRCwbj.js +0 -1
  119. package/dist/vviinn-widgets/p-C5MrXMjM.js +0 -1
  120. package/dist/vviinn-widgets/p-CckoTlaC.js +0 -1
  121. package/dist/vviinn-widgets/p-a2c30a99.entry.js +0 -1
  122. package/dist/vviinn-widgets/p-cdab8bc8.entry.js +0 -1
  123. package/dist/vviinn-widgets/p-e59e023d.entry.js +0 -1
  124. package/dist/vviinn-widgets/p-fgGsgrXc.js +0 -1
  125. package/dist/vviinn-widgets/p-g0rpLM84.js +0 -1
  126. package/dist/vviinn-widgets/p-rqiiCPBX.js +0 -1
  127. package/www/build/p-3be1bd0e.entry.js +0 -1
  128. package/www/build/p-4c361181.js +0 -1
  129. package/www/build/p-5hlq91W8.js +0 -1
  130. package/www/build/p-7339b95e.entry.js +0 -1
  131. package/www/build/p-B4e4JwCJ.js +0 -1
  132. package/www/build/p-ByDRCwbj.js +0 -1
  133. package/www/build/p-C5MrXMjM.js +0 -1
  134. package/www/build/p-CckoTlaC.js +0 -1
  135. package/www/build/p-a2c30a99.entry.js +0 -1
  136. package/www/build/p-cdab8bc8.entry.js +0 -1
  137. package/www/build/p-e59e023d.entry.js +0 -1
  138. package/www/build/p-fgGsgrXc.js +0 -1
  139. package/www/build/p-g0rpLM84.js +0 -1
  140. package/www/build/p-rqiiCPBX.js +0 -1
@@ -127,10 +127,23 @@ const listCardPartsList = [
127
127
  "list-title",
128
128
  ];
129
129
 
130
+ const suggestionsPartsList = [
131
+ "suggestions-container",
132
+ "suggestions-header",
133
+ "suggestions-icon",
134
+ "suggestions-title",
135
+ "suggestions-description",
136
+ "suggestions-wrapper",
137
+ "suggestions-list",
138
+ "suggestion-item",
139
+ "suggestion-link",
140
+ "suggestion-filter-button",
141
+ ];
142
+
130
143
  const makeExportPartsString = (...args) => args.flat().join(", ");
131
144
  const extendedFiltersParts = makeExportPartsString(extendedFiltersPartsList, histogramPartsList, generalFiltersPartsList, searchPartsList);
132
145
  const filtersParts = makeExportPartsString(filtersPartsList, histogramPartsList, generalFiltersPartsList);
133
- makeExportPartsString(selectedFiltersPartsList, generalFiltersPartsList);
146
+ const selectedFiltersParts = makeExportPartsString(selectedFiltersPartsList, generalFiltersPartsList);
134
147
  const priceRangeParts = makeExportPartsString(histogramPartsList);
135
148
  const energyLabelParts = makeExportPartsString(energyLabelPartsList);
136
149
  const productCardsGridPart = "products";
@@ -138,7 +151,7 @@ const imageParts = makeExportPartsString(imagePartsList);
138
151
  const productCardParts = makeExportPartsString(productCardGeneralPartsList, imagePartsList, pricePartsList, customLabelPartsList, energyLabelPartsList);
139
152
  const contentCardParts = makeExportPartsString(contentCardPartsList, imagePartsList);
140
153
  const listCardParts = makeExportPartsString(listCardPartsList, imagePartsList);
141
- const searchWidgetFilterParts = makeExportPartsString(extendedFiltersPartsList, filtersPartsList, histogramPartsList, searchPartsList, generalFiltersPartsList);
154
+ const searchWidgetFilterParts = makeExportPartsString(extendedFiltersPartsList, filtersPartsList, histogramPartsList, searchPartsList, generalFiltersPartsList, selectedFiltersPartsList);
142
155
  const searchWidgetButtonParts = makeExportPartsString([
143
156
  "upload-photo_button",
144
157
  "start-camera_button",
@@ -160,18 +173,6 @@ const modalParts = makeExportPartsString([
160
173
  "close-button",
161
174
  "secondary-action",
162
175
  ]);
163
- const suggestionsPartsList = [
164
- "suggestions-container",
165
- "suggestions-header",
166
- "suggestions-icon",
167
- "suggestions-title",
168
- "suggestions-description",
169
- "suggestions-wrapper",
170
- "suggestions-list",
171
- "suggestion-item",
172
- "suggestion-link",
173
- "suggestion-filter-button",
174
- ];
175
176
  const suggestionsParts = makeExportPartsString(suggestionsPartsList);
176
177
 
177
178
  exports.carouselParts = carouselParts;
@@ -188,4 +189,5 @@ exports.productCardsGridPart = productCardsGridPart;
188
189
  exports.searchBarParts = searchBarParts;
189
190
  exports.searchWidgetButtonParts = searchWidgetButtonParts;
190
191
  exports.searchWidgetFilterParts = searchWidgetFilterParts;
192
+ exports.selectedFiltersParts = selectedFiltersParts;
191
193
  exports.suggestionsParts = suggestionsParts;
@@ -0,0 +1,399 @@
1
+ 'use strict';
2
+
3
+ var index = require('./index-OrE9ITel.js');
4
+ var search_store = require('./search.store-DHFf8KQS.js');
5
+ var i18next = require('./i18next-DkN_8H9H.js');
6
+
7
+ const PlusIcon = () => (index.h("svg", { width: "32", height: "32", viewBox: "0 0 32 32", fill: "none", xmlns: "http://www.w3.org/2000/svg", class: "plus-icon", "aria-hidden": "true" },
8
+ index.h("path", { d: "M14.6667 17.3333H8.00001C7.62223 17.3333 7.30556 17.2056 7.05001 16.95C6.79445 16.6944 6.66667 16.3778 6.66667 16C6.66667 15.6222 6.79445 15.3056 7.05001 15.05C7.30556 14.7944 7.62223 14.6667 8.00001 14.6667H14.6667V8.00001C14.6667 7.62223 14.7944 7.30556 15.05 7.05001C15.3056 6.79445 15.6222 6.66667 16 6.66667C16.3778 6.66667 16.6944 6.79445 16.95 7.05001C17.2056 7.30556 17.3333 7.62223 17.3333 8.00001V14.6667H24C24.3778 14.6667 24.6944 14.7944 24.95 15.05C25.2056 15.3056 25.3333 15.6222 25.3333 16C25.3333 16.3778 25.2056 16.6944 24.95 16.95C24.6944 17.2056 24.3778 17.3333 24 17.3333H17.3333V24C17.3333 24.3778 17.2056 24.6944 16.95 24.95C16.6944 25.2056 16.3778 25.3333 16 25.3333C15.6222 25.3333 15.3056 25.2056 15.05 24.95C14.7944 24.6944 14.6667 24.3778 14.6667 24V17.3333Z", fill: "currentColor" })));
9
+
10
+ const FilterIconCheck = () => (index.h("svg", { width: "11", height: "8", viewBox: "0 0 11 8", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
11
+ index.h("path", { d: "M3.87651 5.50607L9.19428 0.307692C9.40412 0.102564 9.65261 0 9.93976 0C10.2269 0 10.4754 0.102564 10.6852 0.307692C10.8951 0.512821 11 0.755736 11 1.03644C11 1.31714 10.8951 1.56005 10.6852 1.76518L4.62199 7.69231C4.41215 7.89744 4.16365 8 3.87651 8C3.58936 8 3.34086 7.89744 3.13102 7.69231L0.314759 4.93927C0.10492 4.73414 0 4.49123 0 4.21053C0 3.92982 0.10492 3.68691 0.314759 3.48178C0.524598 3.27665 0.773092 3.17409 1.06024 3.17409C1.34739 3.17409 1.59588 3.27665 1.80572 3.48178L3.87651 5.50607Z", fill: "currentColor" })));
12
+
13
+ const FilterIconClose = () => (index.h("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true" },
14
+ index.h("path", { d: "M12 13.4L7.09999 18.3C6.91665 18.4834 6.68332 18.575 6.39999 18.575C6.11665 18.575 5.88332 18.4834 5.69999 18.3C5.51665 18.1167 5.42499 17.8834 5.42499 17.6C5.42499 17.3167 5.51665 17.0834 5.69999 16.9L10.6 12L5.69999 7.10005C5.51665 6.91672 5.42499 6.68338 5.42499 6.40005C5.42499 6.11672 5.51665 5.88338 5.69999 5.70005C5.88332 5.51672 6.11665 5.42505 6.39999 5.42505C6.68332 5.42505 6.91665 5.51672 7.09999 5.70005L12 10.6L16.9 5.70005C17.0833 5.51672 17.3167 5.42505 17.6 5.42505C17.8833 5.42505 18.1167 5.51672 18.3 5.70005C18.4833 5.88338 18.575 6.11672 18.575 6.40005C18.575 6.68338 18.4833 6.91672 18.3 7.10005L13.4 12L18.3 16.9C18.4833 17.0834 18.575 17.3167 18.575 17.6C18.575 17.8834 18.4833 18.1167 18.3 18.3C18.1167 18.4834 17.8833 18.575 17.6 18.575C17.3167 18.575 17.0833 18.4834 16.9 18.3L12 13.4Z", fill: "#8D8D8D" })));
15
+
16
+ const CAROUSEL_CONTENT_WIDTH_CSS_VAR = "--vviinn-carousel-content-width";
17
+ const CAROUSEL_IMAGE_WIDTH_CSS_VAR = "--vviinn-carousel-image-width";
18
+ const SET_MODE_IMAGE_WIDTH_CSS_VAR = "--vviinn-set-mode-image-width";
19
+ const RESULTS_CALCULATED_COLUMNS_CSS_VAR = "--vviinn-results-calculated-columns";
20
+ const CONTENT_GROUP_CSS_CLASS = "items-group";
21
+ const DEFAULT_COLUMNS_NUMBER = 4;
22
+ const SCROLL_POSITION_TOLERANCE = 2;
23
+
24
+ const parseCampaigns = (campaigns) => !campaigns.length
25
+ ? []
26
+ : campaigns.split(",").map((value) => {
27
+ const trimmedValue = value.trim();
28
+ return !isNaN(parseInt(trimmedValue))
29
+ ? parseInt(trimmedValue)
30
+ : trimmedValue;
31
+ });
32
+ const getRecommendationsBody = ({ productId, campaigns, color, excluded, dynamicFilters = [], }) => {
33
+ const staticFilters = Object.assign(Object.assign({}, search_store.addIfNotEmpty("color", color)), search_store.addIfNotEmpty("excluded", search_store.parseStringToExcluded(excluded)));
34
+ return Object.assign(Object.assign(Object.assign({ productId }, search_store.addIfNotEmpty("dynamicFilters", dynamicFilters)), search_store.addIfNotEmpty("campaigns", parseCampaigns(campaigns))), search_store.addIfNotEmpty("staticFilters", staticFilters));
35
+ };
36
+ const getCustomLabels = (recommendation) => {
37
+ const { custom_label_0, custom_label_1, custom_label_2, custom_label_3, custom_label_4, } = recommendation;
38
+ return [
39
+ custom_label_0,
40
+ custom_label_1,
41
+ custom_label_2,
42
+ custom_label_3,
43
+ custom_label_4,
44
+ ]
45
+ .filter((label) => label)
46
+ .join(",");
47
+ };
48
+
49
+ /**
50
+ * Announces a message to screen readers via a live region
51
+ * @param element - The aria-live element reference
52
+ * @param message - The message to announce
53
+ */
54
+ function announceToScreenReader(message, element) {
55
+ if (element) {
56
+ element.textContent = message;
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Generates an appropriate aria-label for a filter remove button
62
+ * @param label - The filter label
63
+ * @returns The aria-label string
64
+ */
65
+ function getRemoveFilterAriaLabel(label) {
66
+ return i18next.instance.t("a11y.removeFilterLabel", { label });
67
+ }
68
+ /**
69
+ * Generates an aria-label for color option filters
70
+ * @param label - The color label
71
+ * @returns The aria-label string
72
+ */
73
+ function getColorOptionAriaLabel(label) {
74
+ return i18next.instance.t("a11y.colorOption", { label });
75
+ }
76
+
77
+ const isPriceFilter = (column) => column === "price" || column === "minimum_price";
78
+
79
+ const getIntervalLabel = (intervalFilter, fullInterval, currencySign, showColumnLabel = false) => {
80
+ if (!fullInterval)
81
+ return null;
82
+ const { start, end } = fullInterval;
83
+ const { start: rangeStart, end: rangeEnd } = intervalFilter.full;
84
+ if (start !== rangeStart || end !== rangeEnd) {
85
+ const isPrice = isPriceFilter(intervalFilter.column);
86
+ if (isPrice && currencySign) {
87
+ return `${start} ${currencySign} – ${end} ${currencySign}`;
88
+ }
89
+ else {
90
+ const rangeValue = `${start} – ${end}`;
91
+ return isPrice
92
+ ? rangeValue
93
+ : `${showColumnLabel ? `${intervalFilter.label}: ` : ""}${rangeValue}`;
94
+ }
95
+ }
96
+ else {
97
+ return null;
98
+ }
99
+ };
100
+
101
+ const isSubFilterActive = (requestFilters, filterValue, selectedFilter) => {
102
+ if (!requestFilters || !selectedFilter)
103
+ return false;
104
+ const mainFilter = requestFilters.find(({ column }) => column === selectedFilter.column);
105
+ if (!mainFilter)
106
+ return false;
107
+ return mainFilter.values.some((value) => search_store.isValueMatch(value, filterValue));
108
+ };
109
+
110
+ const RenderFilterButton = ({ handleSubFilterSelection, value, label, active, selectedFilter, isSelected = false, showClose = false, showColorLabel, }) => {
111
+ const hexCode = value === null || value === void 0 ? void 0 : value.hexCode;
112
+ const hasHexCodeLength = (hexCode === null || hexCode === void 0 ? void 0 : hexCode.length) > 0;
113
+ const isRemovable = isSelected && showClose;
114
+ const renderIcon = () => {
115
+ if (isRemovable) {
116
+ return index.h(FilterIconClose, null);
117
+ }
118
+ return (index.h("div", { part: "filters-option-icon-wrapper", class: "filters-option-icon-wrapper", "aria-hidden": "true" }, isSelected ? index.h(FilterIconCheck, null) : null));
119
+ };
120
+ const ariaLabel = isRemovable
121
+ ? getRemoveFilterAriaLabel(label)
122
+ : hasHexCodeLength
123
+ ? getColorOptionAriaLabel(label)
124
+ : undefined;
125
+ return (index.h("li", { part: "filters-sub-row" },
126
+ index.h("button", Object.assign({ onClick: () => handleSubFilterSelection(value, selectedFilter), class: `filters-more-modal-button ${hasHexCodeLength ? "filters-sub-button-color" : ""} ${isSelected ? "active" : ""}`, disabled: !active && !isSelected, part: "filters-option-button", "aria-pressed": !isRemovable && isSelected ? "true" : "false" }, (ariaLabel && { "aria-label": ariaLabel }), { type: "button" }),
127
+ hasHexCodeLength && (index.h("div", { class: "filters-sub-button-color-dot", style: { backgroundColor: hexCode }, part: "filters-option-color-dot", "aria-hidden": "true" })),
128
+ (showColorLabel || !hasHexCodeLength) && (index.h("span", { part: "filters-option-text" }, label)),
129
+ renderIcon())));
130
+ };
131
+
132
+ /**
133
+ * Syncs local component requestFilters state with the store's requestFilters in case there are response filters with selected: true.
134
+ */
135
+ const syncRequestFilters = (state, onChange, setRequestFilters) => {
136
+ var _a;
137
+ if (((_a = state.requestFilters) === null || _a === void 0 ? void 0 : _a.length) > 0) {
138
+ setRequestFilters([...state.requestFilters]);
139
+ }
140
+ onChange("requestFilters", (newValue) => {
141
+ if ((newValue === null || newValue === void 0 ? void 0 : newValue.length) > 0) {
142
+ setRequestFilters([...newValue]);
143
+ }
144
+ });
145
+ };
146
+
147
+ const isFullRangeInterval = (selectedFilter, interval) => {
148
+ if (selectedFilter.type !== "interval")
149
+ return false;
150
+ const intervalFilter = selectedFilter;
151
+ const fullRange = intervalFilter.full;
152
+ return interval.start === fullRange.start && interval.end === fullRange.end;
153
+ };
154
+ const subFilterSelection = (filters, selectedFilter, filterValue) => {
155
+ var _a;
156
+ const selectedColumn = selectedFilter.column;
157
+ const rawValue = search_store.extractFilterValue(filterValue);
158
+ const index = filters.findIndex(({ column }) => column === selectedColumn);
159
+ if (selectedFilter.type === "interval" && filterValue.interval) {
160
+ const interval = filterValue.interval;
161
+ if (isFullRangeInterval(selectedFilter, interval)) {
162
+ if (index > -1) {
163
+ filters = [
164
+ ...filters.filter((filter) => filter.column !== selectedColumn),
165
+ ];
166
+ return { filters, action: "deselect" };
167
+ }
168
+ else {
169
+ return { filters: [...filters], action: "deselect" };
170
+ }
171
+ }
172
+ }
173
+ const valueIndex = (_a = filters[index]) === null || _a === void 0 ? void 0 : _a.values.findIndex((val) => typeof val === "string" ? val === rawValue : search_store.isIntervalMatch(val, rawValue));
174
+ const action = valueIndex == -1 || index == -1 ? "select" : "deselect";
175
+ const pushObject = index === -1 || (selectedFilter === null || selectedFilter === void 0 ? void 0 : selectedFilter.type) === "interval"
176
+ ? { column: selectedColumn, values: [] }
177
+ : filters[index];
178
+ if (valueIndex > -1) {
179
+ pushObject.values.splice(valueIndex, 1);
180
+ }
181
+ else {
182
+ if (selectedFilter.type === "categorical") {
183
+ const stringValue = search_store.valueToString(rawValue);
184
+ if (stringValue === null) {
185
+ return { filters: [...filters], action: "deselect" };
186
+ }
187
+ pushObject.values.push(stringValue);
188
+ }
189
+ else {
190
+ pushObject.values.push(rawValue);
191
+ }
192
+ }
193
+ if (index === -1) {
194
+ filters = [...filters, pushObject];
195
+ if (document.getElementById("filters-footer"))
196
+ document.getElementById("filters-footer").scrollLeft = 0;
197
+ }
198
+ else {
199
+ filters[index] = pushObject;
200
+ if (filters[index].values.length === 0) {
201
+ filters = [...filters.filter((filter) => filters[index] !== filter)];
202
+ }
203
+ else {
204
+ filters = [...filters];
205
+ }
206
+ }
207
+ return { filters, action };
208
+ };
209
+
210
+ const triggerFilter = ({ filterValue, selectedFilter, requestFilters, vviinnFilterTriggered, vviinnFiltersChanged, el, isTriggeredByVpsWidget, }) => {
211
+ const { filters, action } = subFilterSelection(requestFilters, selectedFilter, filterValue);
212
+ vviinnFilterTriggered.emit({
213
+ kind: selectedFilter.column,
214
+ action,
215
+ isTriggeredByVpsWidget,
216
+ value: filterValue,
217
+ filter: selectedFilter,
218
+ });
219
+ vviinnFiltersChanged.emit({
220
+ filters,
221
+ el,
222
+ isTriggeredByVpsWidget,
223
+ });
224
+ return filters;
225
+ };
226
+ const triggerResetFilters = ({ vviinnFilterTriggered, vviinnFiltersChanged, el, isTriggeredByVpsWidget, }) => {
227
+ vviinnFilterTriggered.emit({
228
+ action: "reset",
229
+ isTriggeredByVpsWidget,
230
+ });
231
+ vviinnFiltersChanged &&
232
+ vviinnFiltersChanged.emit({
233
+ filters: [],
234
+ el,
235
+ isTriggeredByVpsWidget,
236
+ });
237
+ };
238
+ const triggerRemoveIntervalFilter = ({ column, requestFilters, el, isTriggeredByVpsWidget, vviinnFilterTriggered, vviinnFiltersChanged, }) => {
239
+ const updatedFilters = requestFilters.filter((filter) => filter.column !== column);
240
+ vviinnFilterTriggered.emit({
241
+ kind: column,
242
+ action: "deselect",
243
+ isTriggeredByVpsWidget,
244
+ });
245
+ vviinnFiltersChanged.emit({
246
+ filters: updatedFilters,
247
+ el,
248
+ isTriggeredByVpsWidget,
249
+ });
250
+ return updatedFilters;
251
+ };
252
+
253
+ // Unique ID creation requires a high quality random # generator. In the browser we therefore
254
+ // require the crypto API and do not support built-in fallback to lower quality random number
255
+ // generators (like Math.random()).
256
+ var getRandomValues;
257
+ var rnds8 = new Uint8Array(16);
258
+ function rng() {
259
+ // lazy load so that environments that need to polyfill have a chance to do so
260
+ if (!getRandomValues) {
261
+ // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also,
262
+ // find the complete implementation of crypto (msCrypto) on IE11.
263
+ getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);
264
+
265
+ if (!getRandomValues) {
266
+ throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
267
+ }
268
+ }
269
+
270
+ return getRandomValues(rnds8);
271
+ }
272
+
273
+ var REGEX = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
274
+
275
+ function validate(uuid) {
276
+ return typeof uuid === 'string' && REGEX.test(uuid);
277
+ }
278
+
279
+ /**
280
+ * Convert array of 16 byte values to UUID string format of the form:
281
+ * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
282
+ */
283
+
284
+ var byteToHex = [];
285
+
286
+ for (var i = 0; i < 256; ++i) {
287
+ byteToHex.push((i + 0x100).toString(16).substr(1));
288
+ }
289
+
290
+ function stringify(arr) {
291
+ var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
292
+ // Note: Be careful editing this code! It's been tuned for performance
293
+ // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
294
+ var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one
295
+ // of the following:
296
+ // - One or more input array values don't map to a hex octet (leading to
297
+ // "undefined" in the uuid)
298
+ // - Invalid input values for the RFC `version` or `variant` fields
299
+
300
+ if (!validate(uuid)) {
301
+ throw TypeError('Stringified UUID is invalid');
302
+ }
303
+
304
+ return uuid;
305
+ }
306
+
307
+ function v4(options, buf, offset) {
308
+ options = options || {};
309
+ var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
310
+
311
+ rnds[6] = rnds[6] & 0x0f | 0x40;
312
+ rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
313
+
314
+ return stringify(rnds);
315
+ }
316
+
317
+ const createTrackingEvent = (widget) => (eventData) => {
318
+ return Object.assign(Object.assign({}, eventData), widget);
319
+ };
320
+
321
+ const PRODUCT_LOAD_EVENT_TYPE = "product_load_event";
322
+ const PRODUCT_VIEW_EVENT_TYPE = "product_view_event";
323
+ const PRODUCT_CLICK_EVENT_TYPE = "product_click_event";
324
+ const ADD_TO_BASKET_EVENT_TYPE = "add_to_basket_event";
325
+ const FILTER_EVENT_TYPE = "filter_event";
326
+ const SEARCH_EVENT_TYPE = "search_event";
327
+ const WIDGET_EVENT_TYPE = "widget_event";
328
+ const RESULT_LOAD_EVENT_TYPE = "result_load_event";
329
+ const RESULT_VIEW_EVENT_TYPE = "result_view_event";
330
+ const ADD_TO_WISHLIST_EVENT_TYPE = "add_to_wishlist_event";
331
+
332
+ const createResultEventByType = (type, widget) => {
333
+ const typ = type === "load" ? RESULT_LOAD_EVENT_TYPE : RESULT_VIEW_EVENT_TYPE;
334
+ return createTrackingEvent({
335
+ widget,
336
+ typ,
337
+ });
338
+ };
339
+ const createProductEventByType = (type, widget) => {
340
+ const typ = type === "load"
341
+ ? PRODUCT_LOAD_EVENT_TYPE
342
+ : type === "view"
343
+ ? PRODUCT_VIEW_EVENT_TYPE
344
+ : PRODUCT_CLICK_EVENT_TYPE;
345
+ return createTrackingEvent({
346
+ widget,
347
+ typ,
348
+ });
349
+ };
350
+ const createAddToBasketEvent = (widget) => createTrackingEvent({
351
+ widget,
352
+ typ: ADD_TO_BASKET_EVENT_TYPE,
353
+ });
354
+ const createAddToWishlistEvent = (widget) => createTrackingEvent({
355
+ widget,
356
+ typ: ADD_TO_WISHLIST_EVENT_TYPE,
357
+ });
358
+ const createFilterEvent = (widget) => createTrackingEvent({
359
+ widget,
360
+ typ: FILTER_EVENT_TYPE,
361
+ });
362
+ const createWidgetEvent = (widget) => createTrackingEvent({
363
+ widget,
364
+ typ: WIDGET_EVENT_TYPE,
365
+ });
366
+ const createImageSearchEvent = createTrackingEvent({
367
+ widget: "VPS",
368
+ typ: SEARCH_EVENT_TYPE,
369
+ });
370
+
371
+ exports.CAROUSEL_CONTENT_WIDTH_CSS_VAR = CAROUSEL_CONTENT_WIDTH_CSS_VAR;
372
+ exports.CAROUSEL_IMAGE_WIDTH_CSS_VAR = CAROUSEL_IMAGE_WIDTH_CSS_VAR;
373
+ exports.CONTENT_GROUP_CSS_CLASS = CONTENT_GROUP_CSS_CLASS;
374
+ exports.DEFAULT_COLUMNS_NUMBER = DEFAULT_COLUMNS_NUMBER;
375
+ exports.FilterIconClose = FilterIconClose;
376
+ exports.PlusIcon = PlusIcon;
377
+ exports.RESULTS_CALCULATED_COLUMNS_CSS_VAR = RESULTS_CALCULATED_COLUMNS_CSS_VAR;
378
+ exports.RenderFilterButton = RenderFilterButton;
379
+ exports.SCROLL_POSITION_TOLERANCE = SCROLL_POSITION_TOLERANCE;
380
+ exports.SET_MODE_IMAGE_WIDTH_CSS_VAR = SET_MODE_IMAGE_WIDTH_CSS_VAR;
381
+ exports.announceToScreenReader = announceToScreenReader;
382
+ exports.createAddToBasketEvent = createAddToBasketEvent;
383
+ exports.createAddToWishlistEvent = createAddToWishlistEvent;
384
+ exports.createFilterEvent = createFilterEvent;
385
+ exports.createImageSearchEvent = createImageSearchEvent;
386
+ exports.createProductEventByType = createProductEventByType;
387
+ exports.createResultEventByType = createResultEventByType;
388
+ exports.createWidgetEvent = createWidgetEvent;
389
+ exports.getCustomLabels = getCustomLabels;
390
+ exports.getIntervalLabel = getIntervalLabel;
391
+ exports.getRecommendationsBody = getRecommendationsBody;
392
+ exports.getRemoveFilterAriaLabel = getRemoveFilterAriaLabel;
393
+ exports.isPriceFilter = isPriceFilter;
394
+ exports.isSubFilterActive = isSubFilterActive;
395
+ exports.syncRequestFilters = syncRequestFilters;
396
+ exports.triggerFilter = triggerFilter;
397
+ exports.triggerRemoveIntervalFilter = triggerRemoveIntervalFilter;
398
+ exports.triggerResetFilters = triggerResetFilters;
399
+ exports.v4 = v4;
@@ -1,3 +1,15 @@
1
+ 'use strict';
2
+
3
+ const SEARCH_WIDGET_IMAGE_RESOLUTION_WIDTH = 320;
4
+ const RESULTS_WIDGET_IMAGE_RESOLUTION_WIDTH = 500;
5
+ const DISCOVERY_WIDGET_IMAGE_RESOLUTION_WIDTH = 500;
6
+ const PRODUCT_CARD_IMAGE_RESOLUTION_WIDTH = 300;
7
+ const PRODUCT_CARD_IMAGE_WIDTH = 300;
8
+ const SIDEBAR_ANIMATION_DURATION = 500;
9
+ const LOADING_CLASS_DELAY = 500;
10
+ // Scroll animation constants
11
+ const SCROLL_TO_DISCOVERY_DELAY = 250;
12
+
1
13
  // DOM manipulation utilities
2
14
  const findSlotElements = (el) => Array.from(el.querySelectorAll("[slot]"));
3
15
  const getSlotNames = (slotElements) => slotElements.map((el) => el.getAttribute("slot"));
@@ -61,4 +73,16 @@ function isElementInSelector(event, selector) {
61
73
  composedPath.some((el) => { var _a; return (_a = el.matches) === null || _a === void 0 ? void 0 : _a.call(el, selector); }));
62
74
  }
63
75
 
64
- export { addEventListenersWithSignal as a, findSlotElements as f, getSlotNames as g, isElementInSelector as i, setElementInteractivity as s };
76
+ exports.DISCOVERY_WIDGET_IMAGE_RESOLUTION_WIDTH = DISCOVERY_WIDGET_IMAGE_RESOLUTION_WIDTH;
77
+ exports.LOADING_CLASS_DELAY = LOADING_CLASS_DELAY;
78
+ exports.PRODUCT_CARD_IMAGE_RESOLUTION_WIDTH = PRODUCT_CARD_IMAGE_RESOLUTION_WIDTH;
79
+ exports.PRODUCT_CARD_IMAGE_WIDTH = PRODUCT_CARD_IMAGE_WIDTH;
80
+ exports.RESULTS_WIDGET_IMAGE_RESOLUTION_WIDTH = RESULTS_WIDGET_IMAGE_RESOLUTION_WIDTH;
81
+ exports.SCROLL_TO_DISCOVERY_DELAY = SCROLL_TO_DISCOVERY_DELAY;
82
+ exports.SEARCH_WIDGET_IMAGE_RESOLUTION_WIDTH = SEARCH_WIDGET_IMAGE_RESOLUTION_WIDTH;
83
+ exports.SIDEBAR_ANIMATION_DURATION = SIDEBAR_ANIMATION_DURATION;
84
+ exports.addEventListenersWithSignal = addEventListenersWithSignal;
85
+ exports.findSlotElements = findSlotElements;
86
+ exports.getSlotNames = getSlotNames;
87
+ exports.isElementInSelector = isElementInSelector;
88
+ exports.setElementInteractivity = setElementInteractivity;
@@ -66,10 +66,6 @@ var loadModule = (cmpMeta, hostRef, hmrVersionId) => {
66
66
  }
67
67
  switch(bundleId) {
68
68
 
69
- case 'vviinn-selected-filters.cjs':
70
- return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(
71
- /* webpackMode: "lazy" */
72
- './vviinn-selected-filters.cjs.entry.js')); }).then(processMod, consoleError);
73
69
  case 'vviinn-detected-object_2.cjs':
74
70
  return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(
75
71
  /* webpackMode: "lazy" */
@@ -90,10 +86,10 @@ var loadModule = (cmpMeta, hostRef, hmrVersionId) => {
90
86
  return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(
91
87
  /* webpackMode: "lazy" */
92
88
  './vviinn-shop-the-look.cjs.entry.js')); }).then(processMod, consoleError);
93
- case 'vviinn-camera_11.cjs':
89
+ case 'vviinn-camera_12.cjs':
94
90
  return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(
95
91
  /* webpackMode: "lazy" */
96
- './vviinn-camera_11.cjs.entry.js')); }).then(processMod, consoleError);
92
+ './vviinn-camera_12.cjs.entry.js')); }).then(processMod, consoleError);
97
93
  case 'vviinn-carousel_10.cjs':
98
94
  return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(
99
95
  /* webpackMode: "lazy" */