ads-web-sdkm 2.0.24
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.
- package/README.md +369 -0
- package/dist/AdsCarousel.css +1 -0
- package/dist/AdsCarousel.d.ts +1 -0
- package/dist/AdsCarousel.js +519 -0
- package/dist/AdsCarousel.js.map +1 -0
- package/dist/Brandshop.css +1 -0
- package/dist/Brandshop.d.ts +1 -0
- package/dist/Brandshop.js +918 -0
- package/dist/Brandshop.js.map +1 -0
- package/dist/Brandshops.css +1 -0
- package/dist/Brandshops.d.ts +1 -0
- package/dist/Brandshops.js +103 -0
- package/dist/Brandshops.js.map +1 -0
- package/dist/Image-zvdPHg5N.js +35 -0
- package/dist/Image-zvdPHg5N.js.map +1 -0
- package/dist/ReactQueryProvider-D__k2BsQ.js +6755 -0
- package/dist/ReactQueryProvider-D__k2BsQ.js.map +1 -0
- package/dist/ads-CChrT00a.js +4470 -0
- package/dist/ads-CChrT00a.js.map +1 -0
- package/dist/api/queries/useGetAds.d.ts +16 -0
- package/dist/api/queries/useGetBrandshop.d.ts +14 -0
- package/dist/api/queries/useGetBrandshopList.d.ts +11 -0
- package/dist/api/queries/useGetCollection.d.ts +11 -0
- package/dist/api/services/getAds.d.ts +14 -0
- package/dist/api/services/getBrandshop.d.ts +13 -0
- package/dist/api/services/getBrandshopList.d.ts +11 -0
- package/dist/api/services/getCollection.d.ts +4 -0
- package/dist/components/Brandshop/Banner.d.ts +6 -0
- package/dist/components/Brandshop/BannerSection.d.ts +15 -0
- package/dist/components/Brandshop/BannerWithLink.d.ts +8 -0
- package/dist/components/Brandshop/Brandshop.d.ts +16 -0
- package/dist/components/Brandshop/BrandshopContent.d.ts +3 -0
- package/dist/components/Brandshop/BrandshopError.d.ts +6 -0
- package/dist/components/Brandshop/BrandshopSection.d.ts +18 -0
- package/dist/components/Brandshop/BrandshopSkeleton.d.ts +1 -0
- package/dist/components/Brandshop/CategorySection.d.ts +14 -0
- package/dist/components/Brandshop/NavigationSection.d.ts +16 -0
- package/dist/components/Brandshop/ProductSliderSection.d.ts +18 -0
- package/dist/components/Brandshop/index.d.ts +1 -0
- package/dist/components/Brandshops/Brandshops.d.ts +11 -0
- package/dist/components/Brandshops/BrandshopsList.d.ts +3 -0
- package/dist/components/Brandshops/BrandshopsSkeleton.d.ts +6 -0
- package/dist/components/Brandshops/index.d.ts +1 -0
- package/dist/components/Card/Card.d.ts +8 -0
- package/dist/components/Carousel/AdBanner.d.ts +17 -0
- package/dist/components/Carousel/AdBanners.d.ts +24 -0
- package/dist/components/Carousel/AdCarousel.d.ts +43 -0
- package/dist/components/Carousel/AdSkeleton.d.ts +8 -0
- package/dist/components/Carousel/AdsCarousel.d.ts +24 -0
- package/dist/components/Carousel/index.d.ts +1 -0
- package/dist/components/Chip/Chip.d.ts +6 -0
- package/dist/components/ErrorBoundary/ErrorBoundary.d.ts +18 -0
- package/dist/components/Image/Image.d.ts +13 -0
- package/dist/components/ProductsCarousel/CouponBadge.d.ts +8 -0
- package/dist/components/ProductsCarousel/DiscountChip.d.ts +12 -0
- package/dist/components/ProductsCarousel/PriceDisplay.d.ts +8 -0
- package/dist/components/ProductsCarousel/ProductCard.d.ts +15 -0
- package/dist/components/ProductsCarousel/ProductCardSkeleton.d.ts +5 -0
- package/dist/components/ProductsCarousel/ProductSliderSkeleton.d.ts +5 -0
- package/dist/components/ProductsCarousel/ProductTitle.d.ts +5 -0
- package/dist/components/ProductsCarousel/ProductsCarousel.d.ts +11 -0
- package/dist/hooks/use-async-memo.d.ts +1 -0
- package/dist/hooks/use-is-platform.d.ts +8 -0
- package/dist/hooks/useDetectScrolledToBottom.d.ts +5 -0
- package/dist/hooks/useSwipeThreshold.d.ts +4 -0
- package/dist/providers/ReactQueryProvider.d.ts +5 -0
- package/dist/types/ads.d.ts +116 -0
- package/dist/types/brandshop.d.ts +62 -0
- package/dist/types/brandshopsList.d.ts +32 -0
- package/dist/types/configTypes.d.ts +16 -0
- package/dist/types/enums.d.ts +8 -0
- package/dist/types/products.d.ts +72 -0
- package/dist/types/tenures.d.ts +11 -0
- package/dist/types/types.d.ts +2 -0
- package/dist/utils/analytics/trackAdsEvent.d.ts +16 -0
- package/dist/utils/analytics/trackBrandshopEvents.d.ts +15 -0
- package/dist/utils/helpers/ads.d.ts +3 -0
- package/dist/utils/helpers/authToken.d.ts +5 -0
- package/dist/utils/helpers/discountChip.d.ts +14 -0
- package/dist/utils/helpers/getBaseUrl.d.ts +4 -0
- package/dist/utils/helpers/mergeClasses.d.ts +1 -0
- package/dist/utils/helpers/price-utils.d.ts +1 -0
- package/dist/utils/helpers/productDiscounts.d.ts +3 -0
- package/dist/utils/helpers/products.d.ts +4 -0
- package/dist/utils/helpers/text.d.ts +1 -0
- package/dist/utils/helpers/translate.d.ts +63 -0
- package/dist/utils/helpers/utilities.d.ts +1 -0
- package/dist/utils/validations/ads.d.ts +7 -0
- package/package.json +81 -0
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
import { jsx as g, jsxs as $ } from "react/jsx-runtime";
|
|
2
|
+
import { useState as M, useRef as Y, useEffect as z } from "react";
|
|
3
|
+
import { u as J, a as X, A as F, S as Z, b as ee, c as te, d as ne, e as re, f as oe, g as ae, h as se } from "./ads-CChrT00a.js";
|
|
4
|
+
import { d as ie, g as le, a as ce, u as ue, R as de } from "./ReactQueryProvider-D__k2BsQ.js";
|
|
5
|
+
const pe = {
|
|
6
|
+
active: !0,
|
|
7
|
+
breakpoints: {},
|
|
8
|
+
delay: 4e3,
|
|
9
|
+
jump: !1,
|
|
10
|
+
playOnInit: !0,
|
|
11
|
+
stopOnFocusIn: !0,
|
|
12
|
+
stopOnInteraction: !0,
|
|
13
|
+
stopOnMouseEnter: !1,
|
|
14
|
+
stopOnLastSnap: !1,
|
|
15
|
+
rootNode: null
|
|
16
|
+
};
|
|
17
|
+
function fe(t, n) {
|
|
18
|
+
const e = t.scrollSnapList();
|
|
19
|
+
return typeof n == "number" ? e.map(() => n) : n(e, t);
|
|
20
|
+
}
|
|
21
|
+
function me(t, n) {
|
|
22
|
+
const e = t.rootNode();
|
|
23
|
+
return n && n(e) || e;
|
|
24
|
+
}
|
|
25
|
+
function R(t = {}) {
|
|
26
|
+
let n, e, i, o, a = null, l = 0, s = !1, p = !1, m = !1, f = !1;
|
|
27
|
+
function u(r, w) {
|
|
28
|
+
e = r;
|
|
29
|
+
const {
|
|
30
|
+
mergeOptions: C,
|
|
31
|
+
optionsAtMedia: P
|
|
32
|
+
} = w, Q = C(pe, R.globalOptions), W = C(Q, t);
|
|
33
|
+
if (n = P(W), e.scrollSnapList().length <= 1) return;
|
|
34
|
+
f = n.jump, i = !1, o = fe(e, n.delay);
|
|
35
|
+
const {
|
|
36
|
+
eventStore: I,
|
|
37
|
+
ownerDocument: V
|
|
38
|
+
} = e.internalEngine(), H = !!e.internalEngine().options.watchDrag, j = me(e, n.rootNode);
|
|
39
|
+
I.add(V, "visibilitychange", x), H && e.on("pointerDown", S), H && !n.stopOnInteraction && e.on("pointerUp", A), n.stopOnMouseEnter && I.add(j, "mouseenter", N), n.stopOnMouseEnter && !n.stopOnInteraction && I.add(j, "mouseleave", T), n.stopOnFocusIn && e.on("slideFocusStart", c), n.stopOnFocusIn && !n.stopOnInteraction && I.add(e.containerNode(), "focusout", d), n.playOnInit && d();
|
|
40
|
+
}
|
|
41
|
+
function v() {
|
|
42
|
+
e.off("pointerDown", S).off("pointerUp", A).off("slideFocusStart", c), c(), i = !0, s = !1;
|
|
43
|
+
}
|
|
44
|
+
function h() {
|
|
45
|
+
const {
|
|
46
|
+
ownerWindow: r
|
|
47
|
+
} = e.internalEngine();
|
|
48
|
+
r.clearTimeout(l), l = r.setTimeout(B, o[e.selectedScrollSnap()]), a = (/* @__PURE__ */ new Date()).getTime(), e.emit("autoplay:timerset");
|
|
49
|
+
}
|
|
50
|
+
function b() {
|
|
51
|
+
const {
|
|
52
|
+
ownerWindow: r
|
|
53
|
+
} = e.internalEngine();
|
|
54
|
+
r.clearTimeout(l), l = 0, a = null, e.emit("autoplay:timerstopped");
|
|
55
|
+
}
|
|
56
|
+
function d() {
|
|
57
|
+
if (!i) {
|
|
58
|
+
if (_()) {
|
|
59
|
+
m = !0;
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
s || e.emit("autoplay:play"), h(), s = !0;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function c() {
|
|
66
|
+
i || (s && e.emit("autoplay:stop"), b(), s = !1);
|
|
67
|
+
}
|
|
68
|
+
function x() {
|
|
69
|
+
if (_())
|
|
70
|
+
return m = s, c();
|
|
71
|
+
m && d();
|
|
72
|
+
}
|
|
73
|
+
function _() {
|
|
74
|
+
const {
|
|
75
|
+
ownerDocument: r
|
|
76
|
+
} = e.internalEngine();
|
|
77
|
+
return r.visibilityState === "hidden";
|
|
78
|
+
}
|
|
79
|
+
function S() {
|
|
80
|
+
p || c();
|
|
81
|
+
}
|
|
82
|
+
function A() {
|
|
83
|
+
p || d();
|
|
84
|
+
}
|
|
85
|
+
function N() {
|
|
86
|
+
p = !0, c();
|
|
87
|
+
}
|
|
88
|
+
function T() {
|
|
89
|
+
p = !1, d();
|
|
90
|
+
}
|
|
91
|
+
function E(r) {
|
|
92
|
+
typeof r < "u" && (f = r), d();
|
|
93
|
+
}
|
|
94
|
+
function y() {
|
|
95
|
+
s && c();
|
|
96
|
+
}
|
|
97
|
+
function O() {
|
|
98
|
+
s && d();
|
|
99
|
+
}
|
|
100
|
+
function L() {
|
|
101
|
+
return s;
|
|
102
|
+
}
|
|
103
|
+
function B() {
|
|
104
|
+
const {
|
|
105
|
+
index: r
|
|
106
|
+
} = e.internalEngine(), w = r.clone().add(1).get(), C = e.scrollSnapList().length - 1, P = n.stopOnLastSnap && w === C;
|
|
107
|
+
if (e.canScrollNext() ? e.scrollNext(f) : e.scrollTo(0, f), e.emit("autoplay:select"), P) return c();
|
|
108
|
+
d();
|
|
109
|
+
}
|
|
110
|
+
function k() {
|
|
111
|
+
if (!a) return null;
|
|
112
|
+
const r = o[e.selectedScrollSnap()], w = (/* @__PURE__ */ new Date()).getTime() - a;
|
|
113
|
+
return r - w;
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
name: "autoplay",
|
|
117
|
+
options: t,
|
|
118
|
+
init: u,
|
|
119
|
+
destroy: v,
|
|
120
|
+
play: E,
|
|
121
|
+
stop: y,
|
|
122
|
+
reset: O,
|
|
123
|
+
isPlaying: L,
|
|
124
|
+
timeUntilNext: k
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
R.globalOptions = void 0;
|
|
128
|
+
var q = /* @__PURE__ */ ((t) => (t.Arabic = "ar", t.English = "en", t))(q || {});
|
|
129
|
+
const K = (t, {
|
|
130
|
+
adTitle: n,
|
|
131
|
+
adFriendlyId: e,
|
|
132
|
+
campaignTitle: i,
|
|
133
|
+
campaignFriendlyId: o,
|
|
134
|
+
brandTitle: a,
|
|
135
|
+
brandFriendlyId: l,
|
|
136
|
+
location_id: s,
|
|
137
|
+
slot_number: p,
|
|
138
|
+
platform: m,
|
|
139
|
+
userStatus: f,
|
|
140
|
+
userId: u
|
|
141
|
+
}, v) => {
|
|
142
|
+
v?.(t, {
|
|
143
|
+
ad_title: n,
|
|
144
|
+
ad_friendly_id: e,
|
|
145
|
+
campaign_title: i,
|
|
146
|
+
campaign_friendly_id: o,
|
|
147
|
+
brand_title: a,
|
|
148
|
+
brand_friendly_id: l,
|
|
149
|
+
location_id: s,
|
|
150
|
+
slot_number: p,
|
|
151
|
+
platform: m,
|
|
152
|
+
userStatus: f,
|
|
153
|
+
userId: u
|
|
154
|
+
});
|
|
155
|
+
}, G = ({
|
|
156
|
+
ad: t,
|
|
157
|
+
locationId: n,
|
|
158
|
+
trackAdHandler: e,
|
|
159
|
+
fallback: i,
|
|
160
|
+
plugin: o,
|
|
161
|
+
isLoggedin: a,
|
|
162
|
+
userId: l,
|
|
163
|
+
onClick: s,
|
|
164
|
+
logError: p
|
|
165
|
+
}) => {
|
|
166
|
+
const [m, f] = M(!1), u = t.media, v = t.ad_title ?? t.default_content_title, [h, b] = t.media_aspect_ratio?.split(":") ?? [3, 1], d = Number(h) / Number(b), { ref: c } = J({
|
|
167
|
+
onChange: (_) => {
|
|
168
|
+
_ && K(
|
|
169
|
+
"ads_banner_impression",
|
|
170
|
+
{
|
|
171
|
+
adTitle: t.ad_title,
|
|
172
|
+
adFriendlyId: t.ad_id,
|
|
173
|
+
campaignTitle: t.campaign_title,
|
|
174
|
+
campaignFriendlyId: t.campaign_id,
|
|
175
|
+
brandTitle: t.brand_name,
|
|
176
|
+
brandFriendlyId: t.brand_id,
|
|
177
|
+
location_id: n,
|
|
178
|
+
slot_number: t.ad_slot.toString(),
|
|
179
|
+
platform: "web",
|
|
180
|
+
userStatus: a ? "logged_in" : "guest",
|
|
181
|
+
userId: l ?? ""
|
|
182
|
+
},
|
|
183
|
+
e
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
}), x = (_, S, A, N) => {
|
|
187
|
+
p && p(
|
|
188
|
+
new Error(
|
|
189
|
+
`MediaError - ${n === "Green_Home_Top_Banner" ? "Home Banner" : "Category Banner"} AD image failed to load`
|
|
190
|
+
),
|
|
191
|
+
{
|
|
192
|
+
level: "error",
|
|
193
|
+
tags: { ad_id: JSON.stringify(S), ad_title: A, location_id: N },
|
|
194
|
+
context: { data: { source: "Ad Banner" } }
|
|
195
|
+
}
|
|
196
|
+
), _.currentTarget.src = i ?? ie, f(!0);
|
|
197
|
+
};
|
|
198
|
+
return /* @__PURE__ */ g(
|
|
199
|
+
"button",
|
|
200
|
+
{
|
|
201
|
+
ref: c,
|
|
202
|
+
onClick: s,
|
|
203
|
+
className: "block w-full cursor-pointer appearance-none p-0 m-0 bg-transparent border-0",
|
|
204
|
+
onMouseEnter: () => o?.stop(),
|
|
205
|
+
onMouseLeave: () => o?.play(),
|
|
206
|
+
children: /* @__PURE__ */ g(
|
|
207
|
+
"img",
|
|
208
|
+
{
|
|
209
|
+
src: u,
|
|
210
|
+
fetchPriority: "high",
|
|
211
|
+
alt: v,
|
|
212
|
+
style: {
|
|
213
|
+
aspectRatio: d,
|
|
214
|
+
...m && { backgroundColor: "#D2D2D2" }
|
|
215
|
+
},
|
|
216
|
+
className: "w-full object-cover laptop:rounded-[24px] cursor-pointer",
|
|
217
|
+
onError: (_) => x(_, t.ad_id, t.ad_title, n)
|
|
218
|
+
}
|
|
219
|
+
)
|
|
220
|
+
}
|
|
221
|
+
);
|
|
222
|
+
};
|
|
223
|
+
function ge(t) {
|
|
224
|
+
if (![
|
|
225
|
+
"Green_Category_Top_Banner",
|
|
226
|
+
"Green_Home_Top_Banner"
|
|
227
|
+
].includes(t))
|
|
228
|
+
throw new Error("ClientError - Invalid LocationID");
|
|
229
|
+
}
|
|
230
|
+
function _e(t) {
|
|
231
|
+
if (!["ar", "en"].includes(t))
|
|
232
|
+
throw new Error("ClientError - Invalid LanguageKey");
|
|
233
|
+
}
|
|
234
|
+
function ve(t, n) {
|
|
235
|
+
return (e, i) => {
|
|
236
|
+
try {
|
|
237
|
+
t?.(e, i);
|
|
238
|
+
} catch (o) {
|
|
239
|
+
n?.(new Error(`ClientError - PostHog Error: ${o}`), {
|
|
240
|
+
level: "warning",
|
|
241
|
+
tags: { eventName: e }
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
const ye = async ({
|
|
247
|
+
deviceType: t,
|
|
248
|
+
language: n,
|
|
249
|
+
locationId: e,
|
|
250
|
+
environment: i,
|
|
251
|
+
adServerApiKey: o,
|
|
252
|
+
params: a
|
|
253
|
+
}) => {
|
|
254
|
+
const [l, s] = await le(o), p = a ? `?${new URLSearchParams(a).toString()}` : "", m = ce("adServer", i), f = `ServerError - Failed to fetch ${e === "Green_Home_Top_Banner" ? "Home Banner ADS" : "Category Banner ADS"}`;
|
|
255
|
+
try {
|
|
256
|
+
const u = await fetch(
|
|
257
|
+
`${m}/api/v2/ads/${e}${p}`,
|
|
258
|
+
{
|
|
259
|
+
headers: {
|
|
260
|
+
"device-type": t,
|
|
261
|
+
"Accept-Language": n,
|
|
262
|
+
"auth-token": l,
|
|
263
|
+
"auth-timestamp": s
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
);
|
|
267
|
+
if (u.status === 401)
|
|
268
|
+
throw new Error("ClientError - Invalid AdServerAPIKey");
|
|
269
|
+
if (u.status === 400)
|
|
270
|
+
throw _e(n), new Error("ClientError - invalid parameters");
|
|
271
|
+
if (!u.ok)
|
|
272
|
+
throw ge(e), new Error(f);
|
|
273
|
+
return await u.json();
|
|
274
|
+
} catch (u) {
|
|
275
|
+
throw new Error(u instanceof Error ? u.message : f);
|
|
276
|
+
}
|
|
277
|
+
}, we = "ads", he = ({
|
|
278
|
+
deviceType: t,
|
|
279
|
+
language: n,
|
|
280
|
+
locationId: e,
|
|
281
|
+
environment: i,
|
|
282
|
+
adServerApiKey: o,
|
|
283
|
+
params: a,
|
|
284
|
+
enabled: l
|
|
285
|
+
}) => ue({
|
|
286
|
+
queryKey: [
|
|
287
|
+
we,
|
|
288
|
+
e,
|
|
289
|
+
t,
|
|
290
|
+
n,
|
|
291
|
+
a
|
|
292
|
+
],
|
|
293
|
+
queryFn: () => ye({
|
|
294
|
+
deviceType: t,
|
|
295
|
+
language: n,
|
|
296
|
+
locationId: e,
|
|
297
|
+
params: a,
|
|
298
|
+
environment: i,
|
|
299
|
+
adServerApiKey: o
|
|
300
|
+
}),
|
|
301
|
+
enabled: l
|
|
302
|
+
}), be = "_navButtonNext_vq3ll_1", Se = "_navButtonPrev_vq3ll_3", Ee = "_activeDot_vq3ll_13", Ce = "_progressBar_vq3ll_15", Ae = "_inactiveDot_vq3ll_23", De = "_progressContainer_vq3ll_25", D = {
|
|
303
|
+
navButtonNext: be,
|
|
304
|
+
navButtonPrev: Se,
|
|
305
|
+
activeDot: Ee,
|
|
306
|
+
progressBar: Ce,
|
|
307
|
+
inactiveDot: Ae,
|
|
308
|
+
progressContainer: De
|
|
309
|
+
}, xe = ({
|
|
310
|
+
language: t,
|
|
311
|
+
locationId: n,
|
|
312
|
+
environment: e,
|
|
313
|
+
adServerApiKey: i,
|
|
314
|
+
isLoggedin: o,
|
|
315
|
+
userId: a,
|
|
316
|
+
trackAdHandler: l,
|
|
317
|
+
params: s,
|
|
318
|
+
autoplayDelay: p = 4e3,
|
|
319
|
+
fallbackImg: m,
|
|
320
|
+
banners: f,
|
|
321
|
+
swipeThreshold: u,
|
|
322
|
+
transitionDuration: v,
|
|
323
|
+
showProgressBar: h,
|
|
324
|
+
onAdClick: b,
|
|
325
|
+
logError: d
|
|
326
|
+
}) => {
|
|
327
|
+
const [c, x] = M(null), [_, S] = M(0), { isLaptop: A, isDesktop: N } = X(), T = A || N ? F.Web : F.Mobile, E = Y(
|
|
328
|
+
R({
|
|
329
|
+
delay: p,
|
|
330
|
+
stopOnInteraction: T !== F.Mobile
|
|
331
|
+
})
|
|
332
|
+
);
|
|
333
|
+
let y = f;
|
|
334
|
+
const {
|
|
335
|
+
data: O,
|
|
336
|
+
isLoading: L,
|
|
337
|
+
error: B
|
|
338
|
+
} = he({
|
|
339
|
+
deviceType: T,
|
|
340
|
+
language: t,
|
|
341
|
+
locationId: n,
|
|
342
|
+
environment: e,
|
|
343
|
+
adServerApiKey: i,
|
|
344
|
+
params: s,
|
|
345
|
+
enabled: !f?.length
|
|
346
|
+
});
|
|
347
|
+
y?.length || (y = O?.data);
|
|
348
|
+
const k = (r) => {
|
|
349
|
+
if (!r.link?.link_destination) return;
|
|
350
|
+
K(
|
|
351
|
+
"ads_banner_click",
|
|
352
|
+
{
|
|
353
|
+
adTitle: r.ad_title,
|
|
354
|
+
adFriendlyId: r.ad_id,
|
|
355
|
+
campaignTitle: r.campaign_title,
|
|
356
|
+
campaignFriendlyId: r.campaign_id,
|
|
357
|
+
brandTitle: r.brand_name,
|
|
358
|
+
brandFriendlyId: r.brand_id,
|
|
359
|
+
location_id: n,
|
|
360
|
+
slot_number: r.ad_slot.toString(),
|
|
361
|
+
platform: "web",
|
|
362
|
+
userStatus: o ? "logged_in" : "guest",
|
|
363
|
+
userId: a ?? ""
|
|
364
|
+
},
|
|
365
|
+
l
|
|
366
|
+
);
|
|
367
|
+
const C = se(r.link?.link_destination);
|
|
368
|
+
C && b?.(C);
|
|
369
|
+
}, U = (r) => {
|
|
370
|
+
c?.scrollTo(r);
|
|
371
|
+
};
|
|
372
|
+
if (z(() => {
|
|
373
|
+
if (!c) return;
|
|
374
|
+
const r = () => {
|
|
375
|
+
const w = c.selectedScrollSnap();
|
|
376
|
+
S(w);
|
|
377
|
+
};
|
|
378
|
+
return S(c.selectedScrollSnap()), c.on("select", r), () => {
|
|
379
|
+
c.off("select", r);
|
|
380
|
+
};
|
|
381
|
+
}, [c]), L)
|
|
382
|
+
return /* @__PURE__ */ g("div", { className: "laptop:px-2xlarge", children: /* @__PURE__ */ g(
|
|
383
|
+
Z,
|
|
384
|
+
{
|
|
385
|
+
rounded: !0,
|
|
386
|
+
className: "w-full aspect-[720/400] laptop:aspect-[2400/800] object-cover laptop:rounded-[24px]"
|
|
387
|
+
}
|
|
388
|
+
) });
|
|
389
|
+
if (B)
|
|
390
|
+
throw d?.(B, {
|
|
391
|
+
level: "fatal",
|
|
392
|
+
tags: { locationId: n, language: t },
|
|
393
|
+
context: { data: { source: "Ad Banners" } }
|
|
394
|
+
}), new Error(B?.message || "unknown error");
|
|
395
|
+
return y?.length === 1 ? /* @__PURE__ */ g("div", { className: "laptop:px-2xlarge overflow-hidden", children: /* @__PURE__ */ g(
|
|
396
|
+
G,
|
|
397
|
+
{
|
|
398
|
+
ad: y[0],
|
|
399
|
+
locationId: n,
|
|
400
|
+
trackAdHandler: l,
|
|
401
|
+
onClick: () => k(y[0]),
|
|
402
|
+
fallback: m,
|
|
403
|
+
logError: d,
|
|
404
|
+
isLoggedin: o,
|
|
405
|
+
userId: a
|
|
406
|
+
}
|
|
407
|
+
) }) : /* @__PURE__ */ $(
|
|
408
|
+
"div",
|
|
409
|
+
{
|
|
410
|
+
className: "flex flex-col gap-large relative laptop:px-2xlarge w-full",
|
|
411
|
+
children: [
|
|
412
|
+
/* @__PURE__ */ $(
|
|
413
|
+
ee,
|
|
414
|
+
{
|
|
415
|
+
className: "p-0 overflow-hidden relative",
|
|
416
|
+
setApi: x,
|
|
417
|
+
opts: {
|
|
418
|
+
direction: t === q.Arabic ? "rtl" : "ltr",
|
|
419
|
+
loop: !0
|
|
420
|
+
},
|
|
421
|
+
plugins: [E.current],
|
|
422
|
+
swipeThresholdPercentage: u,
|
|
423
|
+
transitionDuration: v,
|
|
424
|
+
children: [
|
|
425
|
+
/* @__PURE__ */ g(te, { className: "p-0", children: y?.map((r) => /* @__PURE__ */ g(ne, { className: "p-0", children: /* @__PURE__ */ g(
|
|
426
|
+
G,
|
|
427
|
+
{
|
|
428
|
+
ad: r,
|
|
429
|
+
locationId: n,
|
|
430
|
+
trackAdHandler: l,
|
|
431
|
+
onClick: () => k(r),
|
|
432
|
+
fallback: m,
|
|
433
|
+
logError: d,
|
|
434
|
+
plugin: E.current,
|
|
435
|
+
isLoggedin: o,
|
|
436
|
+
userId: a
|
|
437
|
+
}
|
|
438
|
+
) }, r.ad_slot)) }),
|
|
439
|
+
/* @__PURE__ */ g(
|
|
440
|
+
re,
|
|
441
|
+
{
|
|
442
|
+
autoplay: E.current,
|
|
443
|
+
className: D.navButtonPrev
|
|
444
|
+
}
|
|
445
|
+
),
|
|
446
|
+
/* @__PURE__ */ g(
|
|
447
|
+
oe,
|
|
448
|
+
{
|
|
449
|
+
autoplay: E.current,
|
|
450
|
+
className: D.navButtonNext
|
|
451
|
+
}
|
|
452
|
+
)
|
|
453
|
+
]
|
|
454
|
+
}
|
|
455
|
+
),
|
|
456
|
+
/* @__PURE__ */ g(
|
|
457
|
+
ae,
|
|
458
|
+
{
|
|
459
|
+
onClick: U,
|
|
460
|
+
currentIndex: _,
|
|
461
|
+
slidesCount: y?.length || 0,
|
|
462
|
+
autoplay: E.current,
|
|
463
|
+
delay: p,
|
|
464
|
+
isRtl: t === q.Arabic,
|
|
465
|
+
showProgress: h,
|
|
466
|
+
activeDotClassName: D.activeDot,
|
|
467
|
+
inactiveDotClassName: D.inactiveDot,
|
|
468
|
+
progressBarClassName: D.progressBar,
|
|
469
|
+
progressContainerClassName: D.progressContainer
|
|
470
|
+
}
|
|
471
|
+
)
|
|
472
|
+
]
|
|
473
|
+
}
|
|
474
|
+
);
|
|
475
|
+
};
|
|
476
|
+
function Ie({
|
|
477
|
+
locationId: t,
|
|
478
|
+
language: n,
|
|
479
|
+
environment: e,
|
|
480
|
+
adServerApiKey: i,
|
|
481
|
+
isLoggedin: o,
|
|
482
|
+
userId: a,
|
|
483
|
+
trackAdHandler: l,
|
|
484
|
+
params: s,
|
|
485
|
+
autoplayDelay: p,
|
|
486
|
+
fallbackImg: m,
|
|
487
|
+
swipeThreshold: f,
|
|
488
|
+
banners: u,
|
|
489
|
+
transitionDuration: v,
|
|
490
|
+
showProgressBar: h,
|
|
491
|
+
onAdClick: b,
|
|
492
|
+
logError: d
|
|
493
|
+
}) {
|
|
494
|
+
return /* @__PURE__ */ g(de, { children: /* @__PURE__ */ g(
|
|
495
|
+
xe,
|
|
496
|
+
{
|
|
497
|
+
language: n,
|
|
498
|
+
locationId: t,
|
|
499
|
+
params: s,
|
|
500
|
+
adServerApiKey: i,
|
|
501
|
+
environment: e,
|
|
502
|
+
trackAdHandler: ve(l, d),
|
|
503
|
+
onAdClick: b,
|
|
504
|
+
fallbackImg: m,
|
|
505
|
+
autoplayDelay: p,
|
|
506
|
+
swipeThreshold: f,
|
|
507
|
+
transitionDuration: v,
|
|
508
|
+
logError: d,
|
|
509
|
+
showProgressBar: h,
|
|
510
|
+
banners: u,
|
|
511
|
+
isLoggedin: o,
|
|
512
|
+
userId: a
|
|
513
|
+
}
|
|
514
|
+
) });
|
|
515
|
+
}
|
|
516
|
+
export {
|
|
517
|
+
Ie as AdsCarousel
|
|
518
|
+
};
|
|
519
|
+
//# sourceMappingURL=AdsCarousel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdsCarousel.js","sources":["../node_modules/embla-carousel-autoplay/esm/embla-carousel-autoplay.esm.js","../src/types/enums.ts","../src/utils/analytics/trackAdsEvent.ts","../src/components/Carousel/AdBanner.tsx","../src/utils/validations/ads.ts","../src/api/services/getAds.ts","../src/api/queries/useGetAds.ts","../src/components/Carousel/AdBanners.tsx","../src/components/Carousel/AdsCarousel.tsx"],"sourcesContent":["const defaultOptions = {\n active: true,\n breakpoints: {},\n delay: 4000,\n jump: false,\n playOnInit: true,\n stopOnFocusIn: true,\n stopOnInteraction: true,\n stopOnMouseEnter: false,\n stopOnLastSnap: false,\n rootNode: null\n};\n\nfunction normalizeDelay(emblaApi, delay) {\n const scrollSnaps = emblaApi.scrollSnapList();\n if (typeof delay === 'number') {\n return scrollSnaps.map(() => delay);\n }\n return delay(scrollSnaps, emblaApi);\n}\nfunction getAutoplayRootNode(emblaApi, rootNode) {\n const emblaRootNode = emblaApi.rootNode();\n return rootNode && rootNode(emblaRootNode) || emblaRootNode;\n}\n\nfunction Autoplay(userOptions = {}) {\n let options;\n let emblaApi;\n let destroyed;\n let delay;\n let timerStartTime = null;\n let timerId = 0;\n let autoplayActive = false;\n let mouseIsOver = false;\n let playOnDocumentVisible = false;\n let jump = false;\n function init(emblaApiInstance, optionsHandler) {\n emblaApi = emblaApiInstance;\n const {\n mergeOptions,\n optionsAtMedia\n } = optionsHandler;\n const optionsBase = mergeOptions(defaultOptions, Autoplay.globalOptions);\n const allOptions = mergeOptions(optionsBase, userOptions);\n options = optionsAtMedia(allOptions);\n if (emblaApi.scrollSnapList().length <= 1) return;\n jump = options.jump;\n destroyed = false;\n delay = normalizeDelay(emblaApi, options.delay);\n const {\n eventStore,\n ownerDocument\n } = emblaApi.internalEngine();\n const isDraggable = !!emblaApi.internalEngine().options.watchDrag;\n const root = getAutoplayRootNode(emblaApi, options.rootNode);\n eventStore.add(ownerDocument, 'visibilitychange', visibilityChange);\n if (isDraggable) {\n emblaApi.on('pointerDown', pointerDown);\n }\n if (isDraggable && !options.stopOnInteraction) {\n emblaApi.on('pointerUp', pointerUp);\n }\n if (options.stopOnMouseEnter) {\n eventStore.add(root, 'mouseenter', mouseEnter);\n }\n if (options.stopOnMouseEnter && !options.stopOnInteraction) {\n eventStore.add(root, 'mouseleave', mouseLeave);\n }\n if (options.stopOnFocusIn) {\n emblaApi.on('slideFocusStart', stopAutoplay);\n }\n if (options.stopOnFocusIn && !options.stopOnInteraction) {\n eventStore.add(emblaApi.containerNode(), 'focusout', startAutoplay);\n }\n if (options.playOnInit) startAutoplay();\n }\n function destroy() {\n emblaApi.off('pointerDown', pointerDown).off('pointerUp', pointerUp).off('slideFocusStart', stopAutoplay);\n stopAutoplay();\n destroyed = true;\n autoplayActive = false;\n }\n function setTimer() {\n const {\n ownerWindow\n } = emblaApi.internalEngine();\n ownerWindow.clearTimeout(timerId);\n timerId = ownerWindow.setTimeout(next, delay[emblaApi.selectedScrollSnap()]);\n timerStartTime = new Date().getTime();\n emblaApi.emit('autoplay:timerset');\n }\n function clearTimer() {\n const {\n ownerWindow\n } = emblaApi.internalEngine();\n ownerWindow.clearTimeout(timerId);\n timerId = 0;\n timerStartTime = null;\n emblaApi.emit('autoplay:timerstopped');\n }\n function startAutoplay() {\n if (destroyed) return;\n if (documentIsHidden()) {\n playOnDocumentVisible = true;\n return;\n }\n if (!autoplayActive) emblaApi.emit('autoplay:play');\n setTimer();\n autoplayActive = true;\n }\n function stopAutoplay() {\n if (destroyed) return;\n if (autoplayActive) emblaApi.emit('autoplay:stop');\n clearTimer();\n autoplayActive = false;\n }\n function visibilityChange() {\n if (documentIsHidden()) {\n playOnDocumentVisible = autoplayActive;\n return stopAutoplay();\n }\n if (playOnDocumentVisible) startAutoplay();\n }\n function documentIsHidden() {\n const {\n ownerDocument\n } = emblaApi.internalEngine();\n return ownerDocument.visibilityState === 'hidden';\n }\n function pointerDown() {\n if (!mouseIsOver) stopAutoplay();\n }\n function pointerUp() {\n if (!mouseIsOver) startAutoplay();\n }\n function mouseEnter() {\n mouseIsOver = true;\n stopAutoplay();\n }\n function mouseLeave() {\n mouseIsOver = false;\n startAutoplay();\n }\n function play(jumpOverride) {\n if (typeof jumpOverride !== 'undefined') jump = jumpOverride;\n startAutoplay();\n }\n function stop() {\n if (autoplayActive) stopAutoplay();\n }\n function reset() {\n if (autoplayActive) startAutoplay();\n }\n function isPlaying() {\n return autoplayActive;\n }\n function next() {\n const {\n index\n } = emblaApi.internalEngine();\n const nextIndex = index.clone().add(1).get();\n const lastIndex = emblaApi.scrollSnapList().length - 1;\n const kill = options.stopOnLastSnap && nextIndex === lastIndex;\n if (emblaApi.canScrollNext()) {\n emblaApi.scrollNext(jump);\n } else {\n emblaApi.scrollTo(0, jump);\n }\n emblaApi.emit('autoplay:select');\n if (kill) return stopAutoplay();\n startAutoplay();\n }\n function timeUntilNext() {\n if (!timerStartTime) return null;\n const currentDelay = delay[emblaApi.selectedScrollSnap()];\n const timePastSinceStart = new Date().getTime() - timerStartTime;\n return currentDelay - timePastSinceStart;\n }\n const self = {\n name: 'autoplay',\n options: userOptions,\n init,\n destroy,\n play,\n stop,\n reset,\n isPlaying,\n timeUntilNext\n };\n return self;\n}\nAutoplay.globalOptions = undefined;\n\nexport { Autoplay as default };\n//# sourceMappingURL=embla-carousel-autoplay.esm.js.map\n","export enum Language {\r\n Arabic = 'ar',\r\n English = 'en',\r\n}\r\n\r\nexport enum DeviceType {\r\n Mobile = 'mob',\r\n Web = 'web',\r\n}\r\n","type TAdsEventProperties = {\r\n adTitle: string;\r\n adFriendlyId: number | string;\r\n campaignTitle: string;\r\n campaignFriendlyId: number | string;\r\n brandTitle: string;\r\n brandFriendlyId: number | string;\r\n location_id: string;\r\n slot_number: string;\r\n platform: string;\r\n userStatus: string;\r\n userId: string;\r\n};\r\ntype TAdsEventNamesEnum = 'ads_banner_impression' | 'ads_banner_click';\r\n\r\nexport const trackAdsBannerEvent = (\r\n eventName: TAdsEventNamesEnum,\r\n {\r\n adTitle,\r\n adFriendlyId,\r\n campaignTitle,\r\n campaignFriendlyId,\r\n brandTitle,\r\n brandFriendlyId,\r\n location_id,\r\n slot_number,\r\n platform,\r\n userStatus,\r\n userId,\r\n }: TAdsEventProperties,\r\n trackEvent?: (\r\n eventName: string,\r\n eventProperties: Record<string, unknown>,\r\n ) => void,\r\n) => {\r\n trackEvent?.(eventName, {\r\n ad_title: adTitle,\r\n ad_friendly_id: adFriendlyId,\r\n campaign_title: campaignTitle,\r\n campaign_friendly_id: campaignFriendlyId,\r\n brand_title: brandTitle,\r\n brand_friendly_id: brandFriendlyId,\r\n location_id,\r\n slot_number,\r\n platform,\r\n userStatus,\r\n userId,\r\n });\r\n};\r\n","import { useState } from 'react';\r\nimport { useInView } from 'react-intersection-observer';\r\nimport { type TAdsLocations, type AdData } from '@/types/ads';\r\nimport { trackAdsBannerEvent } from '@/utils/analytics/trackAdsEvent';\r\nimport fallbackImg from '@/assets/fallback-image.svg';\r\nimport { type TLogError } from '@/types/configTypes';\r\nimport Autoplay from 'embla-carousel-autoplay';\r\n\r\ninterface AdBannerProps {\r\n ad: AdData;\r\n locationId: TAdsLocations;\r\n trackAdHandler?: (\r\n eventName: string,\r\n eventProperties: Record<string, unknown>,\r\n ) => void;\r\n plugin?: ReturnType<typeof Autoplay>;\r\n fallback?: string;\r\n isLoggedin?: boolean;\r\n userId?: string;\r\n onClick?: () => void;\r\n logError?: TLogError;\r\n}\r\n\r\nconst AdBanner = ({\r\n ad,\r\n locationId,\r\n trackAdHandler,\r\n fallback,\r\n plugin,\r\n isLoggedin,\r\n userId,\r\n onClick,\r\n logError,\r\n}: AdBannerProps) => {\r\n const [hasError, setHasError] = useState(false);\r\n const imageUrl = ad.media;\r\n const altText = ad.ad_title ?? ad.default_content_title;\r\n const [w, h] = ad.media_aspect_ratio?.split(':') ?? [3, 1];\r\n const aspectRatio = Number(w) / Number(h);\r\n const { ref } = useInView({\r\n onChange: (inView: boolean) => {\r\n if (inView) {\r\n trackAdsBannerEvent(\r\n 'ads_banner_impression',\r\n {\r\n adTitle: ad.ad_title,\r\n adFriendlyId: ad.ad_id,\r\n campaignTitle: ad.campaign_title,\r\n campaignFriendlyId: ad.campaign_id,\r\n brandTitle: ad.brand_name,\r\n brandFriendlyId: ad.brand_id,\r\n location_id: locationId,\r\n slot_number: ad.ad_slot.toString(),\r\n platform: 'web',\r\n userStatus: isLoggedin ? 'logged_in' : 'guest',\r\n userId: userId ?? '',\r\n },\r\n trackAdHandler,\r\n );\r\n }\r\n },\r\n });\r\n const handleImageError = (\r\n event: React.SyntheticEvent<HTMLImageElement, Event>,\r\n ad_id: string | number,\r\n ad_title: string,\r\n location_id: TAdsLocations,\r\n ) => {\r\n if (logError) {\r\n logError(\r\n new Error(\r\n `MediaError - ${locationId === 'Green_Home_Top_Banner' ? 'Home Banner' : 'Category Banner'} AD image failed to load`,\r\n ),\r\n {\r\n level: 'error',\r\n tags: { ad_id: JSON.stringify(ad_id), ad_title, location_id },\r\n context: { data: { source: 'Ad Banner' } },\r\n },\r\n );\r\n }\r\n event.currentTarget.src = fallback ?? fallbackImg;\r\n setHasError(true);\r\n };\r\n return (\r\n <button\r\n ref={ref}\r\n onClick={onClick}\r\n className={\r\n 'block w-full cursor-pointer appearance-none p-0 m-0 bg-transparent border-0'\r\n }\r\n onMouseEnter={() => plugin?.stop()}\r\n onMouseLeave={() => plugin?.play()}\r\n >\r\n <img\r\n src={imageUrl}\r\n fetchPriority=\"high\"\r\n alt={altText}\r\n style={{\r\n aspectRatio,\r\n ...(hasError && { backgroundColor: '#D2D2D2' }),\r\n }}\r\n className={'w-full object-cover laptop:rounded-[24px] cursor-pointer'}\r\n onError={(event) =>\r\n handleImageError(event, ad.ad_id, ad.ad_title, locationId)\r\n }\r\n />\r\n </button>\r\n );\r\n};\r\n\r\nexport default AdBanner;\r\n","import { TAdsLocations } from '@/types/ads';\r\nimport { TLanguage } from '@/types/types';\r\nimport { type TTrackEvents, type TLogError } from '@/types/configTypes';\r\n\r\nexport function validateLocationId(locationId: TAdsLocations) {\r\n const allowedLocations: TAdsLocations[] = [\r\n 'Green_Category_Top_Banner',\r\n 'Green_Home_Top_Banner',\r\n ];\r\n\r\n if (!allowedLocations.includes(locationId)) {\r\n throw new Error(`ClientError - Invalid LocationID`);\r\n }\r\n}\r\n\r\nexport function validateLanguage(language: TLanguage) {\r\n const allowedLanguages: TLanguage[] = ['ar', 'en'];\r\n\r\n if (!allowedLanguages.includes(language)) {\r\n throw new Error(`ClientError - Invalid LanguageKey`);\r\n }\r\n}\r\nexport function validateTrackHandler(\r\n track?: TTrackEvents,\r\n logError?: TLogError,\r\n): TTrackEvents {\r\n return (eventName, eventProps) => {\r\n try {\r\n track?.(eventName, eventProps);\r\n } catch (err) {\r\n logError?.(new Error(`ClientError - PostHog Error: ${err}`), {\r\n level: 'warning',\r\n tags: { eventName },\r\n });\r\n }\r\n };\r\n}\r\n","import { generateAccessToken } from '@/utils/helpers/authToken';\r\nimport { type AdsDeviceType, type TAdsLocations } from '@/types/ads';\r\nimport { type TLanguage } from '@/types/types';\r\nimport { getBaseUrl } from '@/utils/helpers/getBaseUrl';\r\nimport { type TEnvironment } from '@/types/configTypes';\r\nimport { validateLanguage, validateLocationId } from '@/utils/validations/ads';\r\n\r\ntype TGetAdsProps = {\r\n deviceType: AdsDeviceType;\r\n language: TLanguage;\r\n environment: TEnvironment;\r\n locationId: TAdsLocations;\r\n adServerApiKey: string;\r\n params?: Record<string, string>;\r\n};\r\n\r\nexport const getAds = async ({\r\n deviceType,\r\n language,\r\n locationId,\r\n environment,\r\n adServerApiKey,\r\n params,\r\n}: TGetAdsProps) => {\r\n const [token, timestamp] = await generateAccessToken(adServerApiKey);\r\n const query = params ? `?${new URLSearchParams(params).toString()}` : '';\r\n const adServerBaseUrl = getBaseUrl('adServer', environment);\r\n const serverErrorMsg = `ServerError - Failed to fetch ${locationId === 'Green_Home_Top_Banner' ? 'Home Banner ADS' : 'Category Banner ADS'}`;\r\n\r\n try {\r\n const res = await fetch(\r\n `${adServerBaseUrl}/api/v2/ads/${locationId}${query}`,\r\n {\r\n headers: {\r\n 'device-type': deviceType,\r\n 'Accept-Language': language,\r\n 'auth-token': token,\r\n 'auth-timestamp': timestamp,\r\n },\r\n },\r\n );\r\n if (res.status === 401) {\r\n throw new Error('ClientError - Invalid AdServerAPIKey');\r\n } else if (res.status === 400) {\r\n validateLanguage(language);\r\n throw new Error('ClientError - invalid parameters');\r\n } else if (!res.ok) {\r\n validateLocationId(locationId);\r\n throw new Error(serverErrorMsg);\r\n }\r\n return await res.json();\r\n } catch (error) {\r\n throw new Error(error instanceof Error ? error.message : serverErrorMsg);\r\n }\r\n};\r\n","import { getAds } from '@/api/services/getAds';\r\nimport { useQuery } from '@tanstack/react-query';\r\nimport { AdsDeviceType, type TAdsLocations } from '@/types/ads';\r\nimport { type TLanguage } from '@/types/types';\r\nimport { type TEnvironment } from '@/types/configTypes';\r\n\r\ntype TGetAdsProps = {\r\n deviceType: AdsDeviceType;\r\n language: TLanguage;\r\n locationId: TAdsLocations;\r\n environment: TEnvironment;\r\n adServerApiKey: string;\r\n params?: Record<string, string>;\r\n enabled?: boolean;\r\n};\r\nexport const GET_ADS_QUERY_KEY = 'ads';\r\n\r\nexport const useGetAdsQuery = ({\r\n deviceType,\r\n language,\r\n locationId,\r\n environment,\r\n adServerApiKey,\r\n params,\r\n enabled,\r\n}: TGetAdsProps) => {\r\n const adsQueryKey = [\r\n GET_ADS_QUERY_KEY,\r\n locationId,\r\n deviceType,\r\n language,\r\n params,\r\n ];\r\n\r\n return useQuery({\r\n queryKey: adsQueryKey,\r\n queryFn: () =>\r\n getAds({\r\n deviceType,\r\n language,\r\n locationId,\r\n params,\r\n environment,\r\n adServerApiKey,\r\n }),\r\n enabled,\r\n });\r\n};\r\n","import { useEffect, useRef, useState } from 'react';\r\nimport Autoplay from 'embla-carousel-autoplay';\r\nimport { useIsPlatform } from '@/hooks/use-is-platform';\r\nimport {\r\n type TAdsLocations,\r\n type AdData,\r\n AdsDeviceType,\r\n type TLinkClickEvent,\r\n} from '@/types/ads';\r\nimport { Language } from '@/types/enums';\r\nimport { TLanguage } from '@/types/types';\r\nimport {\r\n AdCarouselApi,\r\n AdCarousel,\r\n AdCarouselContent,\r\n AdCarouselItem,\r\n AdCarouselPrevious,\r\n AdCarouselNext,\r\n AdCarouselPagination,\r\n} from './AdCarousel';\r\nimport AdBanner from './AdBanner';\r\nimport Skeleton from './AdSkeleton';\r\nimport { trackAdsBannerEvent } from '@/utils/analytics/trackAdsEvent';\r\nimport { useGetAdsQuery } from '@/api/queries/useGetAds';\r\nimport { type TLogError, type TEnvironment } from '@/types/configTypes';\r\nimport { buildLinkDestination } from '@/utils/helpers/ads';\r\nimport styles from './AdsBanner.module.css';\r\n\r\ninterface AdBannersProps {\r\n language: TLanguage;\r\n locationId: TAdsLocations;\r\n environment: TEnvironment;\r\n adServerApiKey: string;\r\n isLoggedin?: boolean;\r\n userId?: string;\r\n trackAdHandler?: (\r\n eventName: string,\r\n eventProperties: Record<string, unknown>,\r\n ) => void;\r\n params?: Record<string, string>;\r\n autoplayDelay?: number;\r\n fallbackImg?: string;\r\n banners?: AdData[];\r\n swipeThreshold?: number;\r\n transitionDuration?: number;\r\n showProgressBar?: boolean;\r\n onAdClick?: (event: TLinkClickEvent) => void;\r\n logError?: TLogError;\r\n}\r\nconst AdBanners = ({\r\n language,\r\n locationId,\r\n environment,\r\n adServerApiKey,\r\n isLoggedin,\r\n userId,\r\n trackAdHandler,\r\n params,\r\n autoplayDelay = 4000,\r\n fallbackImg,\r\n banners,\r\n swipeThreshold,\r\n transitionDuration,\r\n showProgressBar,\r\n onAdClick,\r\n logError,\r\n}: AdBannersProps) => {\r\n const [api, setApi] = useState<AdCarouselApi | null>(null);\r\n const [currentIndex, setCurrentIndex] = useState<number>(0);\r\n const { isLaptop, isDesktop } = useIsPlatform();\r\n const deviceType =\r\n isLaptop || isDesktop ? AdsDeviceType.Web : AdsDeviceType.Mobile;\r\n const plugin = useRef(\r\n Autoplay({\r\n delay: autoplayDelay,\r\n stopOnInteraction: deviceType !== AdsDeviceType.Mobile,\r\n }),\r\n );\r\n\r\n let data = banners;\r\n\r\n const {\r\n data: adsData,\r\n isLoading,\r\n error,\r\n } = useGetAdsQuery({\r\n deviceType,\r\n language,\r\n locationId,\r\n environment,\r\n adServerApiKey,\r\n params,\r\n enabled: !banners?.length,\r\n });\r\n\r\n if (!data?.length) data = adsData?.data;\r\n\r\n const handleAdClick = (ad: AdData) => {\r\n const destination = ad.link?.link_destination;\r\n if (!destination) return;\r\n\r\n trackAdsBannerEvent(\r\n 'ads_banner_click',\r\n {\r\n adTitle: ad.ad_title,\r\n adFriendlyId: ad.ad_id,\r\n campaignTitle: ad.campaign_title,\r\n campaignFriendlyId: ad.campaign_id,\r\n brandTitle: ad.brand_name,\r\n brandFriendlyId: ad.brand_id,\r\n location_id: locationId,\r\n slot_number: ad.ad_slot.toString(),\r\n platform: 'web',\r\n userStatus: isLoggedin ? 'logged_in' : 'guest',\r\n userId: userId ?? '',\r\n },\r\n trackAdHandler,\r\n );\r\n\r\n const payload = buildLinkDestination(ad.link?.link_destination);\r\n if (payload) onAdClick?.(payload);\r\n };\r\n const handleDotsClick = (index: number) => {\r\n api?.scrollTo(index);\r\n };\r\n\r\n useEffect(() => {\r\n if (!api) return;\r\n\r\n const handleSelect = () => {\r\n const newIndex = api.selectedScrollSnap();\r\n setCurrentIndex(newIndex);\r\n };\r\n\r\n setCurrentIndex(api.selectedScrollSnap());\r\n api.on('select', handleSelect);\r\n\r\n return () => {\r\n api.off('select', handleSelect);\r\n };\r\n }, [api]);\r\n\r\n if (isLoading) {\r\n return (\r\n <div className=\"laptop:px-2xlarge\">\r\n <Skeleton\r\n rounded\r\n className=\"w-full aspect-[720/400] laptop:aspect-[2400/800] object-cover laptop:rounded-[24px]\"\r\n />\r\n </div>\r\n );\r\n }\r\n if (error) {\r\n logError?.(error, {\r\n level: 'fatal',\r\n tags: { locationId, language },\r\n context: { data: { source: 'Ad Banners' } },\r\n });\r\n throw new Error(error?.message || 'unknown error');\r\n }\r\n\r\n // CASE 1: Only one banner (no carousel)\r\n if (data?.length === 1) {\r\n return (\r\n <div className={'laptop:px-2xlarge overflow-hidden'}>\r\n <AdBanner\r\n ad={data[0]}\r\n locationId={locationId}\r\n trackAdHandler={trackAdHandler}\r\n onClick={() => handleAdClick(data[0])}\r\n fallback={fallbackImg}\r\n logError={logError}\r\n isLoggedin={isLoggedin}\r\n userId={userId}\r\n />\r\n </div>\r\n );\r\n }\r\n // CASE 2: Multiple banners (carousel)\r\n return (\r\n <div\r\n className={'flex flex-col gap-large relative laptop:px-2xlarge w-full'}\r\n >\r\n <AdCarousel\r\n className={'p-0 overflow-hidden relative'}\r\n setApi={setApi}\r\n opts={{\r\n direction: language === Language.Arabic ? 'rtl' : 'ltr',\r\n loop: true,\r\n }}\r\n plugins={[plugin.current]}\r\n swipeThresholdPercentage={swipeThreshold}\r\n transitionDuration={transitionDuration}\r\n >\r\n <AdCarouselContent className={'p-0'}>\r\n {data?.map((ad) => (\r\n <AdCarouselItem className={'p-0'} key={ad.ad_slot}>\r\n <AdBanner\r\n ad={ad}\r\n locationId={locationId}\r\n trackAdHandler={trackAdHandler}\r\n onClick={() => handleAdClick(ad)}\r\n fallback={fallbackImg}\r\n logError={logError}\r\n plugin={plugin.current}\r\n isLoggedin={isLoggedin}\r\n userId={userId}\r\n />\r\n </AdCarouselItem>\r\n ))}\r\n </AdCarouselContent>\r\n <AdCarouselPrevious\r\n autoplay={plugin.current}\r\n className={styles.navButtonPrev}\r\n />\r\n <AdCarouselNext\r\n autoplay={plugin.current}\r\n className={styles.navButtonNext}\r\n />\r\n </AdCarousel>\r\n <AdCarouselPagination\r\n onClick={handleDotsClick}\r\n currentIndex={currentIndex}\r\n slidesCount={data?.length || 0}\r\n autoplay={plugin.current}\r\n delay={autoplayDelay}\r\n isRtl={language === Language.Arabic}\r\n showProgress={showProgressBar}\r\n activeDotClassName={styles.activeDot}\r\n inactiveDotClassName={styles.inactiveDot}\r\n progressBarClassName={styles.progressBar}\r\n progressContainerClassName={styles.progressContainer}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default AdBanners;\r\n","import AdBanners from './AdBanners';\r\nimport {\r\n type TLinkClickEvent,\r\n type TAdsLocations,\r\n type AdData,\r\n} from '@/types/ads';\r\nimport { ReactQueryProvider } from '@/providers/ReactQueryProvider';\r\nimport { type TLanguage } from '@/types/types';\r\nimport {\r\n type TLogError,\r\n type TEnvironment,\r\n type TTrackEvents,\r\n} from '@/types/configTypes';\r\nimport { validateTrackHandler } from '@/utils/validations/ads';\r\nimport './AdsCarousel.css';\r\n\r\ninterface AdsCarouselProps {\r\n locationId: TAdsLocations;\r\n language: TLanguage;\r\n environment: TEnvironment;\r\n adServerApiKey: string;\r\n isLoggedin?: boolean;\r\n userId?: string;\r\n trackAdHandler?: TTrackEvents;\r\n params?: Record<string, string>;\r\n autoplayDelay?: number;\r\n fallbackImg?: string;\r\n swipeThreshold?: number;\r\n banners?: AdData[];\r\n transitionDuration?: number;\r\n showProgressBar?: boolean;\r\n onAdClick?: (event: TLinkClickEvent) => void;\r\n logError?: TLogError;\r\n}\r\nfunction AdsCarousel({\r\n locationId,\r\n language,\r\n environment,\r\n adServerApiKey,\r\n isLoggedin,\r\n userId,\r\n trackAdHandler,\r\n params,\r\n autoplayDelay,\r\n fallbackImg,\r\n swipeThreshold,\r\n banners,\r\n transitionDuration,\r\n showProgressBar,\r\n onAdClick,\r\n logError,\r\n}: Readonly<AdsCarouselProps>) {\r\n return (\r\n <ReactQueryProvider>\r\n <AdBanners\r\n language={language}\r\n locationId={locationId}\r\n params={params}\r\n adServerApiKey={adServerApiKey}\r\n environment={environment}\r\n trackAdHandler={validateTrackHandler(trackAdHandler, logError)}\r\n onAdClick={onAdClick}\r\n fallbackImg={fallbackImg}\r\n autoplayDelay={autoplayDelay}\r\n swipeThreshold={swipeThreshold}\r\n transitionDuration={transitionDuration}\r\n logError={logError}\r\n showProgressBar={showProgressBar}\r\n banners={banners}\r\n isLoggedin={isLoggedin}\r\n userId={userId}\r\n />\r\n </ReactQueryProvider>\r\n );\r\n}\r\nexport default AdsCarousel;\r\n"],"names":["defaultOptions","normalizeDelay","emblaApi","delay","scrollSnaps","getAutoplayRootNode","rootNode","emblaRootNode","Autoplay","userOptions","options","destroyed","timerStartTime","timerId","autoplayActive","mouseIsOver","playOnDocumentVisible","jump","init","emblaApiInstance","optionsHandler","mergeOptions","optionsAtMedia","optionsBase","allOptions","eventStore","ownerDocument","isDraggable","root","visibilityChange","pointerDown","pointerUp","mouseEnter","mouseLeave","stopAutoplay","startAutoplay","destroy","setTimer","ownerWindow","next","clearTimer","documentIsHidden","play","jumpOverride","stop","reset","isPlaying","index","nextIndex","lastIndex","kill","timeUntilNext","currentDelay","timePastSinceStart","Language","trackAdsBannerEvent","eventName","adTitle","adFriendlyId","campaignTitle","campaignFriendlyId","brandTitle","brandFriendlyId","location_id","slot_number","platform","userStatus","userId","trackEvent","AdBanner","ad","locationId","trackAdHandler","fallback","plugin","isLoggedin","onClick","logError","hasError","setHasError","useState","imageUrl","altText","w","h","aspectRatio","ref","useInView","inView","handleImageError","event","ad_id","ad_title","fallbackImg","jsx","validateLocationId","validateLanguage","language","validateTrackHandler","track","eventProps","err","getAds","deviceType","environment","adServerApiKey","params","token","timestamp","generateAccessToken","query","adServerBaseUrl","getBaseUrl","serverErrorMsg","res","error","GET_ADS_QUERY_KEY","useGetAdsQuery","enabled","useQuery","AdBanners","autoplayDelay","banners","swipeThreshold","transitionDuration","showProgressBar","onAdClick","api","setApi","currentIndex","setCurrentIndex","isLaptop","isDesktop","useIsPlatform","AdsDeviceType","useRef","data","adsData","isLoading","handleAdClick","payload","buildLinkDestination","handleDotsClick","useEffect","handleSelect","newIndex","Skeleton","jsxs","AdCarousel","AdCarouselContent","AdCarouselItem","AdCarouselPrevious","styles","AdCarouselNext","AdCarouselPagination","AdsCarousel","ReactQueryProvider"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._brandshopContent_1lmgx_7{display:flex;align-items:center;justify-content:center;flex-direction:column;font-family:Noto sans,sans-serif;padding:32px 0;gap:48px;max-width:1440px;margin:auto}[dir=rtl] ._brandshopContent_1lmgx_7{font-family:Noto Sans Arabic,sans-serif}._sectionContainer_1lmgx_39{width:100%;display:flex;flex-direction:column;gap:32px;padding:0 48px}._sectionTitle_1lmgx_55{color:#000;font-size:24px;font-style:normal;font-weight:600;line-height:36px;text-align:left}[dir=rtl] ._sectionTitle_1lmgx_55{text-align:right}@media (max-width: 1024px){._brandshopContent_1lmgx_7{gap:32px;padding:16px 0}._sectionContainer_1lmgx_39{gap:16px;padding:0 16px}._sectionTitle_1lmgx_55{font-size:20px}}._navigationSection_1lmgx_121{display:flex;align-items:center;gap:24px;justify-content:space-between;width:100%}._navigationLogo_1lmgx_137{width:107px;border-radius:8px}._navigationLinks_1lmgx_147{display:flex;gap:1.5rem}._navigationLink_1lmgx_147{color:#000;font-size:16px;font-style:normal;font-weight:500;line-height:normal;cursor:pointer;text-align:left}[dir=rtl] ._navigationLink_1lmgx_147{text-align:right}@media (max-width: 1024px){._navigationSectionContainer_1lmgx_187{padding:0 0 0 16px}[dir=rtl] ._navigationSectionContainer_1lmgx_187{padding-left:0;padding-right:16px}._navigationSection_1lmgx_121{justify-content:start}._navigationLogo_1lmgx_137{display:none}._navigationLinks_1lmgx_147{display:flex;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none}._navigationLinks_1lmgx_147::-webkit-scrollbar{display:none}._navigationLink_1lmgx_147{font-weight:600;white-space:nowrap}._navigationLink_1lmgx_147:last-child{padding-right:16px}[dir=rtl] ._navigationLink_1lmgx_147:last-child{padding-right:0;padding-left:16px}}._bannerButton_1lmgx_281,._banner_1lmgx_281{width:100%}._bannerButton_1lmgx_281{cursor:pointer;position:relative}._bannerCta_1lmgx_301{position:absolute;bottom:32px;left:50%;transform:translate(-50%);background-color:#e6e6e6;color:#1a1a1a;padding:12px 32px;border-radius:999px;text-align:center;font-size:16px;font-weight:600}._bannerImage_1lmgx_329{width:100%;object-fit:cover;border-radius:12px}._banner_1lmgx_281 ._bannerImage_1lmgx_329{aspect-ratio:16 / 4}._bannerButton_1lmgx_281 ._bannerImage_1lmgx_329{aspect-ratio:16 / 6}@media (max-width: 1024px){._bannerImage_1lmgx_329{border-radius:8px}._banner_1lmgx_281 ._bannerImage_1lmgx_329{aspect-ratio:2 / 1}._bannerButton_1lmgx_281 ._bannerImage_1lmgx_329{aspect-ratio:1 / 1.5}._bannerCta_1lmgx_301{background-color:#fafafa;border-color:#8d8d8d;padding:9px 40.5px;white-space:nowrap;border-width:2px}}._categoryContainer_1lmgx_409{display:flex;gap:24px;justify-content:space-between;align-items:stretch}._categoryTile_1lmgx_423{flex:1 1 0;display:flex;flex-direction:column;align-items:center;cursor:pointer;border-radius:8px;min-width:0}._categoryImageWrapper_1lmgx_443{width:100%;aspect-ratio:1 / 1;border-radius:8px;overflow:hidden;position:relative;flex-shrink:0}._categoryImage_1lmgx_443{width:100%;height:100%;object-fit:cover}._categoryName_1lmgx_473{padding:12px 24px;color:#000;text-align:center;font-size:20px;font-weight:500;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;max-height:75px;flex-shrink:0}._categoryNameShrink_1lmgx_503{padding:12px 20px}._categoryShrinkGap_1lmgx_511{gap:16px}@media (max-width: 1024px){._categoryContainer_1lmgx_409{display:grid;gap:8px;align-items:stretch}._categoryContainer_1lmgx_409._cols3_1lmgx_533{grid-template-columns:repeat(3,1fr)}._categoryContainer_1lmgx_409._cols2_1lmgx_541{grid-template-columns:repeat(2,1fr)}._categoryTile_1lmgx_423{width:100%;min-width:0;height:100%}._categoryImageWrapper_1lmgx_443{width:100%;aspect-ratio:1 / 1;border-radius:8px;overflow:hidden}._categoryImage_1lmgx_443{width:100%;height:100%;object-fit:cover;display:block}._categoryName_1lmgx_473{font-size:14px;padding:4px 8px;-webkit-line-clamp:3;line-clamp:3;max-height:75px}._categoryShrinkGap_1lmgx_511{gap:8px}}._brandshopContainerSkeleton_1lmgx_621{display:flex;flex-direction:column;gap:48px;padding:32px 48px;max-width:1440px;margin:auto}._bannerSkeleton_1lmgx_639{width:100%;aspect-ratio:16 / 4;border-radius:12px}._navContainerSkeleton_1lmgx_651{display:flex;align-items:center;justify-content:end;gap:24px}._navPillSkeleton_1lmgx_665{width:100px;height:19px;border-radius:999px}._categoryGridSkeleton_1lmgx_677{display:grid;grid-template-columns:repeat(2,1fr);gap:24px}._categoryTileSkeleton_1lmgx_689{width:100%;aspect-ratio:1 / 1;border-radius:8px}._promoSkeleton_1lmgx_701{width:100%;aspect-ratio:16 / 6;border-radius:12px}@media (max-width: 1024px){._promoSkeleton_1lmgx_701{aspect-ratio:1 / 1.5}._bannerSkeleton_1lmgx_639{aspect-ratio:2 / 1}._brandshopContainerSkeleton_1lmgx_621{gap:32px;padding:16px}._navContainerSkeleton_1lmgx_651{justify-content:start}._categoryGridSkeleton_1lmgx_677{gap:8px}._promoSkeleton_1lmgx_701,._bannerSkeleton_1lmgx_639{border-radius:8px}}._brandshopError_1lmgx_775{font-family:Noto sans,sans-serif;height:85vh;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:40px}[dir=rtl] ._brandshopError_1lmgx_775{font-family:Noto Sans Arabic,sans-serif}._errorIcon_1lmgx_805{width:40px;height:40px;object-fit:contain}._errorContent_1lmgx_817{display:flex;flex-direction:column;align-items:center;gap:24px;max-width:507px}._errorText_1lmgx_833{display:flex;flex-direction:column;gap:16px;text-align:center}._errorText_1lmgx_833 h2{font-size:20px;font-weight:600;color:#000;text-align:center}._errorText_1lmgx_833 p{font-size:16px;color:#000;text-align:center;font-weight:400}._errorButton_1lmgx_875{width:100%;height:56px;border-radius:999px;background-color:#ff3b00;color:#fff6f2;cursor:pointer;padding:0 12px;text-align:center}@media (max-width: 1024px){._brandshopError_1lmgx_775{padding:24px}}._chip_fqk2t_3{display:inline-flex;align-items:center;padding:4px 8px;border-radius:4px;font-size:12px;font-weight:600;white-space:nowrap}._card_8c2od_3{display:grid;grid-template-rows:auto 1fr;gap:8px;padding:20px;outline-color:#d3d2d5;border-radius:4px;background:#fff;height:100%}._header_8c2od_25{display:grid;position:relative;min-height:220px}._header_8c2od_25>*{grid-row:1 / 2;grid-column:1 / 2}._imageContainer_8c2od_47{display:flex;align-items:center;justify-content:center;width:100%;border-radius:4px}._image_8c2od_47{object-fit:contain;width:100%;height:100%;aspect-ratio:1 / 1}._topControls_8c2od_77{display:flex;align-items:flex-start;justify-content:space-between;align-self:flex-start}._footer_8c2od_91{display:flex;flex-direction:column;gap:8px;align-items:flex-start}._priceSection_8c2od_105{display:flex;flex-direction:column;gap:4px}._priceWrapper_8c2od_117{display:flex;align-items:baseline;gap:2px}._priceCurrency_8c2od_129{font-size:12px;font-weight:600}._priceCurrency_8c2od_129._withPromotion_8c2od_139{font-size:12px;color:#ff3b00;font-weight:600}._priceAmount_8c2od_151{font-weight:600;font-size:20px;color:#111827}._priceAmount_8c2od_151._withPromotion_8c2od_139{font-size:20px;color:#ff3b00;font-weight:700}._priceOriginal_8c2od_175{font-size:12px;color:#000;text-decoration:line-through;font-weight:600}._finalPrice_8c2od_189{font-weight:700;font-size:20px}._finalPrice_8c2od_189._withPromotion_8c2od_139{color:#ff3b00}._originalPrice_8c2od_207{font-size:14px;color:#9ca3af;text-decoration:line-through;font-weight:400}._brand_8c2od_221{font-weight:500;color:#666569;font-size:14px}._ProductTitle_8c2od_233{font-size:14px;color:#000;font-weight:500;cursor:pointer;text-align:start;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;line-height:1.4}._couponBadge_8c2od_261{display:flex;align-items:center;font-size:12px;color:#1aa573;font-weight:500;gap:2px;text-align:start}._discountChipCoupon_8c2od_281{background:#f6fcf8;color:#18a573}._discountChipPromotion_8c2od_291,._discountChipPriceDrop_8c2od_293{background:#fff6f2;color:#ff3b00}._myloContainer_8c2od_303{display:flex;align-items:flex-end;gap:4px;flex-wrap:wrap}._myloText_8c2od_317{font-size:10px;font-weight:500;color:#000}._myloIcon_8c2od_329{height:12px;width:auto}._myloSkeleton_8c2od_339{width:100%;height:16px}._container_8c2od_351 *{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}._container_8c2od_351 img{pointer-events:none;-webkit-user-drag:none}._container_8c2od_351{display:flex;flex-direction:column;gap:24px;position:relative;align-items:center}._carousel_8c2od_391{width:100%;padding:24px;background:#f9f9fa;position:relative;border-radius:16px}@media (max-width: 639px){._carousel_8c2od_391{border-radius:0;padding:16px}}._carouselContent_8c2od_421{gap:16px}._carouselItem_8c2od_429{flex:0 0 calc(20% - 12.8px);cursor:pointer}@media (max-width: 1023px){._carouselItem_8c2od_429{flex:0 0 calc(33.333% - 10.667px)}}@media (max-width: 639px){._carouselItem_8c2od_429{flex:0 0 calc(66.666% - 8px)}}._navButtonNext_8c2od_467,._navButtonPrev_8c2od_469{width:44px;height:44px;display:flex;align-items:center;justify-content:center;cursor:pointer;background-color:#faf9fa;border:4px solid #fff;transform:translateY(-50%)}[dir=rtl] ._navButtonNext_8c2od_467,[dir=rtl] ._navButtonPrev_8c2od_469{transform:translateY(-50%) scaleX(-1)}._navButtonPrev_8c2od_469{inset-inline-start:8px}._navButtonNext_8c2od_467{inset-inline-end:8px}._navButtonPrevIcon_8c2od_521,._navButtonNextIcon_8c2od_523{width:20px;height:20px}@media (max-width: 1023px){._navButtonPrev_8c2od_469,._navButtonNext_8c2od_467{display:none}}._paginationContainer_8c2od_549{position:static;transform:none}._paginationDot_8c2od_559{background:#e2e2e2;width:4px;height:4px}._paginationActiveDot_8c2od_571{background:#000}._card_15xcs_1{background-color:#fff;padding:16px;display:flex;flex-direction:column;gap:12px}._imageSkeleton_15xcs_17,._titleSkeleton_15xcs_19,._descriptionSkeleton_15xcs_21,._priceSkeleton_15xcs_23,._buttonSkeleton_15xcs_25{border-radius:8px}._imageSkeleton_15xcs_17{width:100%;aspect-ratio:1 / 1}._titleSkeleton_15xcs_19{width:70%;height:30px}._descriptionSkeleton_15xcs_21{width:100%;height:60px}._priceSkeleton_15xcs_23{width:100%;height:24px}._buttonSkeleton_15xcs_25{width:100%;height:12px}._container_gnnm8_1{display:flex;flex-direction:column;gap:24px}._header_gnnm8_13{padding-left:12px;padding-right:12px;display:flex;justify-content:space-between}._titleSkeleton_gnnm8_27{height:32px;width:128px}._carouselWrapper_gnnm8_37{display:flex;flex-direction:column;gap:24px}._carouselContainer_gnnm8_49{display:flex;overflow:hidden;gap:16px;align-items:center;padding:16px;background-color:#f5f5f5}._cardWrapper_gnnm8_67{min-width:250px;flex-grow:1}@media (min-width: 639px){._header_gnnm8_13,._carouselWrapper_gnnm8_37{padding-left:40px;padding-right:40px}._carouselContainer_gnnm8_49{padding:24px;border-radius:16px}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './components/Brandshop/index'
|