kupos-ui-components-lib 9.3.2 → 9.3.4

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.
@@ -0,0 +1 @@
1
+ {"nm":"Main Scene","h":100,"w":100,"meta":{"g":"@lottiefiles/creator@1.89.0"},"layers":[{"ty":4,"nm":"Shape Layer 1","sr":1,"st":0,"op":150,"ip":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[37,9]},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100],"t":1},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[109,109],"t":48},{"s":[100,100],"t":89}]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[50,50]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"gr","nm":"Group 1","it":[{"ty":"sh","nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.51,0.27],[0.31,0.46],[0.14,0.56],[0,0.59],[-0.31,0.79],[-0.58,0.44],[-0.83,0],[-0.49,-0.27],[-0.26,-0.44],[-0.05,-0.49],[0,0],[0.25,0.2],[0.39,0],[0.27,-0.23],[0.15,-0.45],[0.02,-0.66],[0,-0.02],[0,-0.01],[-0.24,0.18],[-0.3,0.1],[-0.32,0],[-0.47,-0.26],[-0.28,-0.49],[0,-0.65],[0.3,-0.51],[0.52,-0.3],[0.67,0]],"o":[[-0.75,0],[-0.51,-0.28],[-0.31,-0.46],[-0.13,-0.57],[0,-1.1],[0.31,-0.8],[0.59,-0.44],[0.71,0],[0.49,0.27],[0.26,0.44],[0,0],[-0.07,-0.37],[-0.24,-0.21],[-0.37,0],[-0.27,0.22],[-0.15,0.45],[0,0.01],[0,0.02],[0.14,-0.24],[0.24,-0.18],[0.3,-0.1],[0.54,0],[0.47,0.25],[0.29,0.48],[0,0.61],[-0.29,0.5],[-0.51,0.3],[0,0]],"v":[[10.74,14.17],[8.85,13.76],[7.61,12.66],[6.94,11.13],[6.75,9.39],[7.21,6.55],[8.54,4.69],[10.67,4.03],[12.46,4.44],[13.58,5.5],[14.04,6.9],[12.08,6.9],[11.6,6.05],[10.65,5.74],[9.69,6.09],[9.06,7.1],[8.8,8.76],[8.8,8.81],[8.8,8.85],[9.38,8.22],[10.19,7.8],[11.11,7.64],[12.63,8.04],[13.75,9.14],[14.18,10.84],[13.73,12.52],[12.51,13.72],[10.74,14.17]]}}},{"ty":"sh","nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.23,0.12],[-0.13,0.22],[0,0.28],[0.14,0.21],[0.24,0.12],[0.31,0],[0.23,-0.12],[0.14,-0.22],[0,-0.29],[-0.14,-0.23],[-0.23,-0.13],[-0.31,0]],"o":[[0.3,0],[0.23,-0.13],[0.14,-0.22],[0,-0.31],[-0.13,-0.22],[-0.23,-0.13],[-0.3,0],[-0.23,0.12],[-0.14,0.22],[0,0.29],[0.14,0.22],[0.24,0.12],[0,0]],"v":[[10.62,12.38],[11.42,12.19],[11.97,11.66],[12.18,10.91],[11.97,10.12],[11.41,9.6],[10.6,9.41],[9.8,9.59],[9.24,10.11],[9.03,10.88],[9.24,11.66],[9.8,12.19],[10.62,12.38]]}}},{"ty":"sh","nm":"Path 3","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.64,0.43],[0.35,0.76],[0,1],[-0.35,0.76],[-0.64,0.43],[-0.91,0],[-0.64,-0.43],[-0.35,-0.77],[0,-1],[0.35,-0.77],[0.64,-0.43],[0.91,0]],"o":[[-0.91,0],[-0.64,-0.43],[-0.35,-0.77],[0,-1],[0.35,-0.77],[0.64,-0.43],[0.91,0],[0.64,0.43],[0.35,0.76],[0,1],[-0.35,0.76],[-0.64,0.43],[0,0]],"v":[[19.93,14.17],[17.61,13.52],[16.11,11.75],[15.59,9.1],[16.11,6.47],[17.61,4.68],[19.93,4.03],[22.25,4.68],[23.74,6.47],[24.27,9.1],[23.74,11.75],[22.25,13.52],[19.93,14.17]]}}},{"ty":"sh","nm":"Path 4","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.33,0.26],[-0.18,0.47],[0,0.65],[0.19,0.47],[0.34,0.25],[0.44,0],[0.34,-0.26],[0.19,-0.48],[0,-0.65],[-0.18,-0.48],[-0.33,-0.26],[-0.44,0]],"o":[[0.44,0],[0.34,-0.26],[0.19,-0.48],[0,-0.65],[-0.18,-0.48],[-0.33,-0.26],[-0.44,0],[-0.33,0.25],[-0.18,0.47],[0,0.65],[0.19,0.47],[0.34,0.26],[0,0]],"v":[[19.93,12.28],[21.08,11.89],[21.85,10.79],[22.13,9.1],[21.85,7.42],[21.08,6.33],[19.93,5.94],[18.77,6.33],[18,7.42],[17.73,9.1],[18,10.79],[18.77,11.89],[19.93,12.28]]}}},{"ty":"sh","nm":"Path 5","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[27.69,14],[33.13,4.2],[35.18,4.2],[29.73,14],[27.69,14]]}}},{"ty":"sh","nm":"Path 6","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.38,0.21],[0.22,0.38],[0,0.52],[-0.22,0.37],[-0.37,0.21],[-0.46,0],[-0.37,-0.21],[-0.21,-0.38],[0,-0.54],[0.22,-0.38],[0.37,-0.21],[0.47,0]],"o":[[-0.47,0],[-0.37,-0.21],[-0.22,-0.38],[0,-0.54],[0.22,-0.38],[0.38,-0.21],[0.48,0],[0.37,0.21],[0.22,0.37],[0,0.52],[-0.22,0.38],[-0.36,0.21],[0,0]],"v":[[34.94,14.17],[33.66,13.86],[32.77,12.98],[32.43,11.62],[32.77,10.25],[33.66,9.37],[34.92,9.06],[36.2,9.37],[37.08,10.25],[37.42,11.62],[37.08,12.98],[36.18,13.86],[34.94,14.17]]}}},{"ty":"sh","nm":"Path 7","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.13,0.08],[-0.07,0.17],[0,0.24],[0.07,0.17],[0.13,0.08],[0.17,0],[0.13,-0.09],[0.07,-0.17],[0,-0.25],[-0.07,-0.17],[-0.13,-0.09],[-0.17,0]],"o":[[0.17,0],[0.13,-0.09],[0.07,-0.17],[0,-0.26],[-0.07,-0.17],[-0.13,-0.09],[-0.17,0],[-0.13,0.08],[-0.07,0.17],[0,0.25],[0.07,0.17],[0.13,0.08],[0,0]],"v":[[34.92,12.75],[35.37,12.63],[35.68,12.24],[35.79,11.62],[35.68,10.98],[35.37,10.6],[34.92,10.46],[34.48,10.6],[34.17,10.98],[34.06,11.61],[34.17,12.24],[34.48,12.63],[34.92,12.75]]}}},{"ty":"sh","nm":"Path 8","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.38,0.21],[0.22,0.38],[0,0.52],[-0.22,0.37],[-0.37,0.21],[-0.47,0],[-0.37,-0.21],[-0.21,-0.38],[0,-0.54],[0.22,-0.38],[0.37,-0.21],[0.47,0]],"o":[[-0.47,0],[-0.37,-0.21],[-0.22,-0.38],[0,-0.54],[0.22,-0.38],[0.38,-0.21],[0.47,0],[0.37,0.21],[0.22,0.37],[0,0.52],[-0.21,0.38],[-0.37,0.21],[0,0]],"v":[[27.99,9.14],[26.72,8.83],[25.82,7.95],[25.49,6.59],[25.82,5.22],[26.72,4.34],[27.99,4.03],[29.25,4.34],[30.14,5.22],[30.47,6.59],[30.14,7.95],[29.25,8.83],[27.99,9.14]]}}},{"ty":"sh","nm":"Path 9","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.13,0.08],[-0.07,0.17],[0,0.24],[0.07,0.17],[0.13,0.08],[0.17,0],[0.13,-0.09],[0.07,-0.17],[0,-0.26],[-0.07,-0.17],[-0.13,-0.09],[-0.17,0]],"o":[[0.17,0],[0.13,-0.09],[0.07,-0.17],[0,-0.26],[-0.07,-0.17],[-0.13,-0.09],[-0.17,0],[-0.13,0.08],[-0.07,0.17],[0,0.24],[0.07,0.17],[0.13,0.08],[0,0]],"v":[[27.98,7.73],[28.43,7.6],[28.74,7.21],[28.85,6.59],[28.74,5.95],[28.43,5.57],[27.98,5.43],[27.53,5.57],[27.22,5.95],[27.11,6.59],[27.22,7.21],[27.53,7.6],[27.98,7.73]]}}},{"ty":"sh","nm":"Path 10","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0.73,0.43],[0.42,0.76],[0,1],[-0.41,0.76],[-0.73,0.43],[-0.96,0],[-0.74,-0.43],[-0.4,-0.77],[0,-1],[0.41,-0.77],[0.74,-0.43],[0.96,0]],"o":[[-0.96,0],[-0.73,-0.43],[-0.41,-0.77],[0,-1],[0.42,-0.77],[0.73,-0.43],[0.96,0],[0.74,0.43],[0.41,0.76],[0,1],[-0.4,0.76],[-0.74,0.43],[0,0]],"v":[[46.66,14.17],[44.12,13.52],[42.4,11.75],[41.79,9.1],[42.4,6.47],[44.12,4.68],[46.66,4.03],[49.21,4.68],[50.91,6.47],[51.53,9.1],[50.91,11.75],[49.21,13.52],[46.66,14.17]]}}},{"ty":"sh","nm":"Path 11","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[-0.4,0.26],[-0.22,0.47],[0,0.65],[0.22,0.47],[0.41,0.25],[0.57,0],[0.41,-0.26],[0.22,-0.48],[0,-0.65],[-0.22,-0.48],[-0.41,-0.26],[-0.55,0]],"o":[[0.57,0],[0.41,-0.26],[0.22,-0.48],[0,-0.65],[-0.22,-0.48],[-0.4,-0.26],[-0.55,0],[-0.41,0.25],[-0.22,0.47],[0,0.65],[0.22,0.47],[0.41,0.26],[0,0]],"v":[[46.66,12.28],[48.11,11.89],[49.07,10.79],[49.4,9.1],[49.07,7.42],[48.11,6.33],[46.66,5.94],[45.22,6.33],[44.26,7.42],[43.93,9.1],[44.26,10.79],[45.22,11.89],[46.66,12.28]]}}},{"ty":"sh","nm":"Path 12","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[53.1,14],[53.1,4.2],[59.61,4.2],[59.61,5.89],[55.2,5.89],[55.2,8.27],[58.67,8.27],[58.67,9.91],[55.2,9.91],[55.2,14],[53.1,14]]}}},{"ty":"sh","nm":"Path 13","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[60.99,14],[60.99,4.2],[67.5,4.2],[67.5,5.89],[63.09,5.89],[63.09,8.27],[66.56,8.27],[66.56,9.91],[63.09,9.91],[63.09,14],[60.99,14]]}}},{"ty":"fl","nm":"Fill","c":{"a":0,"k":[1,1,1]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[37.094,9.075]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[37.094,9.075]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]},{"ty":"gr","nm":"Group 2","it":[{"ty":"sh","nm":"Path 14","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,-3.53],[0,0],[3.53,0],[0,0],[0,3.53],[0,0],[-3.53,0]],"o":[[0,0],[3.53,0],[0,0],[0,3.53],[0,0],[-3.53,0],[0,0],[0,-3.53],[0,0]],"v":[[6.4,0],[67.6,0],[74,6.4],[74,11.6],[67.6,18],[6.4,18],[0,11.6],[0,6.4],[6.4,0]]}}},{"ty":"fl","nm":"Fill","c":{"a":0,"k":[1,0.361,0.38]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[37,9]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[37,9]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":1}],"v":"5.7.0","fr":30,"op":89,"ip":0,"assets":[]}
@@ -30,6 +30,7 @@ import KuposButton from "../../ui/KuposButton/KuposButton";
30
30
  import BottomAmenities from "../../ui/BottomAmenities/BottomAmenities";
31
31
  import SeatSection from "../../ui/SeatSection/SeatSection";
32
32
  import DateTimeSection from "../../ui/DateTimeSection/DateTimeSection";
33
+ import ServiceBadges from "../../ui/ServiceBadges/ServiceBadges";
33
34
  const SEAT_EXCEPTIONS = ["Asiento mascota"];
34
35
  const ANIMATION_MAP = {
35
36
  promoAnim: {
@@ -66,24 +67,8 @@ const ANIMATION_MAP = {
66
67
  },
67
68
  };
68
69
  function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, children, busStage, serviceDetailsLoading, cityOrigin, cityDestination, translation, orignLabel, destinationLabel, currencySign, isCiva, showRating, showLastSeats, removeArrivalTime, removeDuplicateSeats, isPeruSites, showAvailableSeats, isSeatIcon, isLinatal, isPeru, t = (key) => key, siteType, isAllinBus, isExpand, setIsExpand, coachKey, viewersConfig, }) {
69
- const startViewerCount = (node) => {
70
- if (!node || !viewersConfig)
71
- return;
72
- const prevId = node.dataset.viewerId;
73
- if (prevId)
74
- clearInterval(Number(prevId));
75
- const { min, max, interval = 5000 } = viewersConfig;
76
- const clamp = (v) => Math.min(max, Math.max(min, v));
77
- const initialValue = Math.floor(Math.random() * (max - min + 1)) + min;
78
- node.textContent = String(initialValue);
79
- const id = setInterval(() => {
80
- const current = Number(node.textContent) || initialValue;
81
- const delta = Math.ceil(current * 0.2);
82
- const next = current + Math.floor(Math.random() * (2 * delta + 1)) - delta;
83
- node.textContent = String(clamp(Math.round(next)));
84
- }, interval);
85
- node.dataset.viewerId = String(id);
86
- };
70
+ var _a;
71
+ console.log("🚀 ~ ServiceItemPB ~ serviceItem:", serviceItem);
87
72
  const getAnimationIcon = (icon) => {
88
73
  var _a;
89
74
  const animation = ANIMATION_MAP[icon];
@@ -115,17 +100,21 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
115
100
  busStage[labelId].split("|")[1] === "true" &&
116
101
  busStage[labelId].split("|")[0];
117
102
  let isSoldOut = serviceItem.available_seats <= 0;
118
- const showPromo = Math.random() > 0.5;
119
103
  const isItemExpanded = serviceItem.id === isExpand || isExpand === true;
120
104
  const grayscaleClass = isSoldOut ? "grayscale" : "";
121
105
  const hasOfferText = Boolean(serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.offer_text);
122
- const offerGradient = "linear-gradient(90deg, #ff5964 0%, #ff8842 100%)";
106
+ const seats = removeDuplicateSeats
107
+ ? ((_a = serviceItem.seat_types) === null || _a === void 0 ? void 0 : _a.filter((seat, index, self) => index === self.findIndex((s) => s.label === seat.label))) || []
108
+ : serviceItem.seat_types || [];
109
+ const discountedSeats = seats.map((seat) => (Object.assign(Object.assign({}, seat), CommonService.calculateDiscountedPrice(seat.fare, serviceItem))));
110
+ const hasDiscount = discountedSeats.some((seat) => seat.originalPrice !== seat.discountedPrice);
111
+ const offerGradient = `linear-gradient(90deg, ${colors.rightGradiantColor || "#ff5964"} 0%, ${colors.leftGradiantColor || "#ff8842"} 100%)`;
123
112
  const serviceCardStyle = hasOfferText
124
113
  ? {
125
114
  borderColor: "transparent",
126
115
  borderStyle: "solid",
127
116
  borderWidth: "6px 6px 0 6px",
128
- borderRadius: isItemExpanded ? "18px 18px 0 0" : "18px",
117
+ borderRadius: isItemExpanded || coachKey ? "18px 18px 0 0" : "18px",
129
118
  background: `linear-gradient(#fff, #fff) padding-box, ${offerGradient} border-box`,
130
119
  }
131
120
  : {};
@@ -214,29 +203,6 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
214
203
  }
215
204
  onBookButtonPress();
216
205
  };
217
- const countdownSeconds = 599;
218
- const startCountdown = (node) => {
219
- if (!node)
220
- return;
221
- const prevId = node.dataset.countdownId;
222
- if (prevId)
223
- clearInterval(Number(prevId));
224
- let remaining = countdownSeconds;
225
- const formatTime = (totalSecs) => {
226
- const m = Math.floor(totalSecs / 60);
227
- const s = totalSecs % 60;
228
- return `${String(m).padStart(2, "0")}:${String(s).padStart(2, "0")}`;
229
- };
230
- node.textContent = formatTime(remaining);
231
- const id = setInterval(() => {
232
- remaining -= 1;
233
- if (remaining <= 0) {
234
- remaining = countdownSeconds;
235
- }
236
- node.textContent = formatTime(remaining);
237
- }, 1000);
238
- node.dataset.countdownId = String(id);
239
- };
240
206
  const items = [
241
207
  {
242
208
  key: "amenities",
@@ -277,10 +243,9 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
277
243
  padding: coachKey
278
244
  ? "15px 15px 20px 15px"
279
245
  : "20px 15px 11px 15px",
246
+ marginTop: hasDiscount || hasOfferText ? "14px" : "0",
280
247
  } },
281
- React.createElement("div", { className: "grid text-[#464647] w-full [grid-template-columns:22%_28%_2.5%_24%_15.5%] gap-x-[2%] items-center", style: {
282
- marginTop: showTopLabel || (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_direct_trip) ? "8px" : "",
283
- } },
248
+ React.createElement("div", { className: "grid text-[#464647] w-full [grid-template-columns:22%_28%_2.5%_24%_15.5%] gap-x-[2%] items-center" },
284
249
  React.createElement("div", { className: "flex flex-col gap-[5px]" },
285
250
  React.createElement("div", null,
286
251
  React.createElement("img", { src: serviceItem.operator_details[0], alt: "service logo", className: `h-[30px] w-[auto] ${isSoldOut ? "grayscale" : ""}` }),
@@ -295,12 +260,8 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
295
260
  React.createElement("div", { className: "content-center" },
296
261
  React.createElement(SeatSection, { seatTypes: serviceItem.seat_types, serviceItem: serviceItem, availableSeats: serviceItem.available_seats, isSoldOut: isSoldOut, priceColor: colors.priceColor, currencySign: currencySign, removeDuplicateSeats: removeDuplicateSeats, isPeru: isPeru, renderIcon: renderIcon })),
297
262
  React.createElement("div", { className: "relative" },
298
- showLastSeats ? (React.createElement("div", { className: "flex justify-end mr-[11px] w-[100%] right-[0px] absolute", style: {
299
- top: serviceDetailsLoading ? "-17px" : "-20px",
300
- } }, (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) < 10 &&
301
- (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) > 0 && (React.createElement("div", { className: "text-[12px] text-[#464647] mt-1 text-center" }, "\u00A1\u00DAltimos Asientos!")))) : null,
302
263
  React.createElement(KuposButton, { isSoldOut: isSoldOut, isLoading: serviceDetailsLoading, buttonColor: colors.kuposButtonColor, buyLabel: translation === null || translation === void 0 ? void 0 : translation.buyButton, soldOutLabel: translation === null || translation === void 0 ? void 0 : translation.soldOutButton, soldOutIcon: renderIcon("soldOutIcon", "14px"), onClick: checkMidnight }),
303
- showLastSeats ? (React.createElement("div", { className: "flex justify-end mr-[11px] w-[100%] right-[0px]", style: {
264
+ showLastSeats ? (React.createElement("div", { className: "flex justify-center mr-[11px] w-[100%] right-[0px]", style: {
304
265
  top: serviceDetailsLoading ? "-17px" : "-20px",
305
266
  } }, (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) < 10 &&
306
267
  (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) > 0 && (React.createElement("div", { className: "text-[12px] text-[#464647] mt-1 text-center" }, "\u00A1\u00DAltimos Asientos!")))) : null)),
@@ -338,7 +299,7 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
338
299
  "\u00A0"),
339
300
  " ",
340
301
  "| Termina en\u00A0",
341
- React.createElement("span", { className: "bold-text text-end", ref: startCountdown, style: {
302
+ React.createElement("span", { className: "bold-text text-end", ref: (node) => CommonService.startCountdown(node, 599), style: {
342
303
  fontVariantNumeric: "tabular-nums",
343
304
  display: "inline-block",
344
305
  // minWidth: "70px",
@@ -346,41 +307,21 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
346
307
  React.createElement("div", { className: "flex items-center" },
347
308
  React.createElement(LottiePlayer, { animationData: getAnimationIcon("dotAnimation"), width: "12px", height: "12px" }),
348
309
  React.createElement("span", { className: "ml-[6px]" },
349
- React.createElement("span", { className: "bold-text", ref: startViewerCount, style: { fontVariantNumeric: "tabular-nums" } }),
310
+ React.createElement("span", { className: "bold-text", ref: (node) => CommonService.startViewerCount(node, viewersConfig), style: { fontVariantNumeric: "tabular-nums" } }),
350
311
  " ",
351
312
  React.createElement("span", { className: "bold-text" }, "personas"),
352
313
  " ",
353
314
  React.createElement("span", null,
354
315
  " ",
355
- (viewersConfig === null || viewersConfig === void 0 ? void 0 : viewersConfig.label) || " están viendo este viaje")))))),
356
- React.createElement("div", { className: "absolute -top-[11px] left-0 w-full flex items-center justify-end gap-[12px] pr-[22px] z-10 " },
357
- showTopLabel && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] px-[14px] rounded-[38px] text-[12.5px] z-10`, style: {
358
- backgroundColor: "#fff",
359
- border: `1px solid ${colors.topLabelColor}`,
360
- color: colors.topLabelColor,
361
- } },
362
- React.createElement("div", { className: isSoldOut ? "grayscale" : "" }, renderIcon("specialDeparture", "12px")),
363
- React.createElement("div", { className: isSoldOut ? "text-white" : `text-[${colors.topLabelColor}]` }, showTopLabel))),
364
- (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_transpordo) && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] px-[14px] rounded-[38px] text-[12.5px] z-20`, style: {
365
- backgroundColor: "#fff",
366
- border: `1px solid ${colors.topLabelColor}`,
367
- color: colors.topLabelColor,
368
- } },
369
- renderIcon("connectingServiceIcon", "12px"),
370
- React.createElement("div", null, "Conexión"))),
371
- (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_direct_trip) && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] px-[14px] rounded-[38px] text-[12.5px] z-20 `, style: {
372
- backgroundColor: "#fff",
373
- border: `1px solid ${colors.topLabelColor}`,
374
- color: colors.topLabelColor,
375
- } },
376
- renderIcon("directo", "12px"),
377
- React.createElement("div", null, translation === null || translation === void 0 ? void 0 : translation.directService))),
378
- (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.train_type_label) === "Tren Express (Nuevo)" && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] px-[14px] rounded-[38px] text-[12.5px] z-20 `, style: {
379
- backgroundColor: "#fff",
380
- border: `1px solid ${colors.topLabelColor}`,
381
- color: colors.topLabelColor,
382
- } },
383
- renderIcon("directo", "12px"),
384
- React.createElement("div", null, "Tren Express"))))))));
316
+ (viewersConfig === null || viewersConfig === void 0 ? void 0 : viewersConfig.label) || " viendo",
317
+ " |",
318
+ " ",
319
+ React.createElement("span", { className: "" },
320
+ "\u26A1 Quedan pocos",
321
+ " ",
322
+ React.createElement("span", { className: "bold-text", ref: (node) => CommonService.startComprandoCount(node, 4, 16), style: { fontVariantNumeric: "tabular-nums" } }),
323
+ " ",
324
+ "comprando"))))))),
325
+ React.createElement(ServiceBadges, { showTopLabel: showTopLabel, isSoldOut: isSoldOut, colors: colors, renderIcon: renderIcon, translation: translation, serviceItem: serviceItem })))));
385
326
  }
386
327
  export default ServiceItemPB;
@@ -4,6 +4,7 @@ import commonService from "../../utils/CommonService";
4
4
  import BottomAmenitiesMobile from "../../ui/mobileweb/BottomAmenitiesMobile";
5
5
  import DateTimeSectionMobile from "../../ui/mobileweb/DateTimeSectionMobile";
6
6
  import ExpandedDropdownMobile from "../../ui/mobileweb/ExpandedDropdownMobile";
7
+ import ServiceBadgesMobile from "../../ui/mobileweb/ServiceBadgesMobile";
7
8
  const SEAT_EXCEPTIONS = ["Asiento mascota"];
8
9
  const exceptions = [
9
10
  "gy",
@@ -33,47 +34,6 @@ function ServiceItemMobile({ serviceItem, onBookButtonPress, colors, busStage, o
33
34
  background: `linear-gradient(#fff, #fff) padding-box, ${offerGradient} border-box`,
34
35
  }
35
36
  : {};
36
- const startViewerCount = (node) => {
37
- if (!node || !viewersConfig)
38
- return;
39
- const prevId = node.dataset.viewerId;
40
- if (prevId)
41
- clearInterval(Number(prevId));
42
- const { min, max, interval = 5000 } = viewersConfig;
43
- const clamp = (v) => Math.min(max, Math.max(min, v));
44
- const initialValue = Math.floor(Math.random() * (max - min + 1)) + min;
45
- node.textContent = String(initialValue);
46
- const id = setInterval(() => {
47
- const current = Number(node.textContent) || initialValue;
48
- const delta = Math.ceil(current * 0.2);
49
- const next = current + Math.floor(Math.random() * (2 * delta + 1)) - delta;
50
- node.textContent = String(clamp(Math.round(next)));
51
- }, interval);
52
- node.dataset.viewerId = String(id);
53
- };
54
- const countdownSeconds = 599;
55
- const startCountdown = (node) => {
56
- if (!node)
57
- return;
58
- const prevId = node.dataset.countdownId;
59
- if (prevId)
60
- clearInterval(Number(prevId));
61
- let remaining = countdownSeconds;
62
- const formatTime = (totalSecs) => {
63
- const m = Math.floor(totalSecs / 60);
64
- const s = totalSecs % 60;
65
- return `${String(m).padStart(2, "0")}:${String(s).padStart(2, "0")}`;
66
- };
67
- node.textContent = formatTime(remaining);
68
- const id = setInterval(() => {
69
- remaining -= 1;
70
- if (remaining <= 0) {
71
- remaining = countdownSeconds;
72
- }
73
- node.textContent = formatTime(remaining);
74
- }, 1000);
75
- node.dataset.countdownId = String(id);
76
- };
77
37
  const labelId = typeof serviceItem.boarding_stages === "string"
78
38
  ? serviceItem.boarding_stages.split("|")[0]
79
39
  : "";
@@ -132,7 +92,7 @@ function ServiceItemMobile({ serviceItem, onBookButtonPress, colors, busStage, o
132
92
  : "rounded-[10px] border border-[#ccc]"}`, style: serviceCardStyle },
133
93
  React.createElement("div", { style: { padding: "12px 12px 8px 12px" } },
134
94
  React.createElement("div", { className: "flex justify-between items-center mb-[10px]" },
135
- React.createElement("div", { className: "flex items-center justify-between" },
95
+ React.createElement("div", { className: "flex items-center justify-between", style: { marginBottom: (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.offer_text) ? "10px" : "" } },
136
96
  React.createElement("div", { className: "w-[120px] overflow-y-hidden" },
137
97
  React.createElement("img", { src: serviceItem.operator_details[0], alt: "service logo", className: `w-[100px] h-auto object-contain ${isSoldOut ? "grayscale" : ""}` })),
138
98
  isCiva ? (React.createElement("div", { className: "black-text min-[420]:text-[12px] text-[12px]" }, serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.operator_details[2])) : showRating ? (React.createElement("div", { className: "flex min-[420]:text-[13px] text-[12px] items-center" },
@@ -144,50 +104,12 @@ function ServiceItemMobile({ serviceItem, onBookButtonPress, colors, busStage, o
144
104
  React.createElement("span", { className: "ml-[3px] min-[420]:text-[13px] text-[12px] text-ellipsis overflow-hidden whitespace-nowrap max-w-[120px]" }, serviceItem.operator_details[2]))))) : null),
145
105
  showLastSeats ? (React.createElement("div", { className: "flex justify-end " }, (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) < 10 &&
146
106
  (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.available_seats) > 0 && (React.createElement("div", { className: "text-[10px] text-[#464647] text-center" }, "\u00A1 \u00DAltimos Asientos!")))) : null),
147
- React.createElement(DateTimeSectionMobile, { onBookButtonPress: onBookButtonPress, isCiva: isCiva, isSoldOut: isSoldOut, isLinatal: isLinatal, isPeru: isPeru, orignLabel: orignLabel, destinationLabel: destinationLabel, originIcon: (_b = serviceItem.icons) === null || _b === void 0 ? void 0 : _b.origin, destinationIcon: (_c = serviceItem.icons) === null || _c === void 0 ? void 0 : _c.destination, travelDate: serviceItem.travel_date, arrivalDate: serviceItem.arrival_date, depTime: serviceItem.dep_time, arrTime: serviceItem.arr_time, seatTypes: serviceItem.seat_types, seatPriceColor: colors.seatPriceColor, currencySign: currencySign, availableSeats: serviceItem.available_seats, removeDuplicateSeats: removeDuplicateSeats, serviceItem: serviceItem }),
107
+ React.createElement(DateTimeSectionMobile, { onBookButtonPress: onBookButtonPress, isCiva: isCiva, isSoldOut: isSoldOut, isLinatal: isLinatal, isPeru: isPeru, orignLabel: orignLabel, destinationLabel: destinationLabel, originIcon: (_b = serviceItem.icons) === null || _b === void 0 ? void 0 : _b.origin, destinationIcon: (_c = serviceItem.icons) === null || _c === void 0 ? void 0 : _c.destination, travelDate: serviceItem.travel_date, arrivalDate: serviceItem.arrival_date, depTime: serviceItem.dep_time, arrTime: serviceItem.arr_time, seatTypes: serviceItem.seat_types, seatPriceColor: colors.seatPriceColor, tooltipBgColor: colors.tooltipBgColor, currencySign: currencySign, availableSeats: serviceItem.available_seats, removeDuplicateSeats: removeDuplicateSeats, serviceItem: serviceItem }),
148
108
  React.createElement("div", { className: "bg-[#E6E6E6] mt-[10px] mb-[10px] h-[1px]" }),
149
- React.createElement(BottomAmenitiesMobile, { isSoldOut: isSoldOut, amenitiesNodes: amenities(), hoursIcon: renderIcon("hours", "14px"), duration: (_d = serviceItem.duration) === null || _d === void 0 ? void 0 : _d.toString(), isDirectTrip: serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_direct_trip, directoColor: colors.directoColor, directoAnim: serviceItem.icons.directoAnim, isChangeTicket: serviceItem.is_change_ticket, isPetSeat: isPetSeat, petSeatInfo: serviceItem.pet_seat_info, petFriendlyAnim: serviceItem.icons.petFriendlyAnim, flexibleAnim: serviceItem.icons.flexibleAnim, isTrackingEnabled: serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_tracking_enabled, locationAnim: serviceItem.icons.locationAnim, downArrowIcon: serviceItem.icons.downArrow, showDropdown: isItemExpanded, setShowDropdown: () => setIsExpanded(isItemExpanded ? null : serviceItem.id),
150
- // onDropdownToggle={() => {
151
- // setShowDropdown(!showDropdown);
152
- // setAmenetiesAtomValue({
153
- // service: serviceItem,
154
- // showTopLabel: showTopLabel,
155
- // });
156
- // }}
157
- onDropdownToggle: () => {
109
+ React.createElement(BottomAmenitiesMobile, { isSoldOut: isSoldOut, amenitiesNodes: amenities(), hoursIcon: renderIcon("hours", "14px"), duration: (_d = serviceItem.duration) === null || _d === void 0 ? void 0 : _d.toString(), isDirectTrip: serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_direct_trip, directoColor: colors.directoColor, directoAnim: serviceItem.icons.directoAnim, isChangeTicket: serviceItem.is_change_ticket, isPetSeat: isPetSeat, petSeatInfo: serviceItem.pet_seat_info, petFriendlyAnim: serviceItem.icons.petFriendlyAnim, flexibleAnim: serviceItem.icons.flexibleAnim, isTrackingEnabled: serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_tracking_enabled, locationAnim: serviceItem.icons.locationAnim, downArrowIcon: serviceItem.icons.downArrow, showDropdown: isItemExpanded, setShowDropdown: () => setIsExpanded(isItemExpanded ? null : serviceItem.id), onDropdownToggle: () => {
158
110
  setIsExpanded(isItemExpanded ? null : serviceItem.id);
159
111
  }, isPeru: isPeru })),
160
- React.createElement("div", { className: "absolute -top-[9px] left-0 w-full flex items-center justify-end gap-[12px] pr-[20px] z-10 " },
161
- showTopLabel && (React.createElement("div", { className: `flex items-center gap-[2px] py-[4px] px-[10px] rounded-[38px] min-[420]:text-[12px] text-[10px] z-20 `, style: {
162
- backgroundColor: "#fff",
163
- border: `1px solid ${colors.topLabelColor}`,
164
- color: colors.topLabelColor,
165
- } },
166
- React.createElement("div", { className: isSoldOut ? "grayscale" : "" }, renderIcon("specialDeparture", "12px")),
167
- React.createElement("div", { style: {
168
- color: colors.topLabelColor,
169
- } }, showTopLabel))),
170
- (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_direct_trip) && (React.createElement("div", { className: `flex items-center gap-[2px] py-[5px] px-[10px] rounded-[38px] min-[420]:text-[12px] text-[10px] z-20 `, style: {
171
- backgroundColor: "#fff",
172
- border: `1px solid ${colors.topLabelColor}`,
173
- color: colors.topLabelColor,
174
- } },
175
- renderIcon("directo", "12px"),
176
- React.createElement("div", { className: "ml-[5px]" }, "Directo"))),
177
- isConexion && (React.createElement("div", { className: `flex items-center gap-[2px] py-[5px] text-white px-[10px] rounded-[38px] min-[420]:text-[12px] text-[11px] z-20 `, style: {
178
- backgroundColor: "#fff",
179
- border: `1px solid ${colors.topLabelColor}`,
180
- color: colors.topLabelColor,
181
- } },
182
- renderIcon("airportIcon", "14px"),
183
- React.createElement("div", null, "Conexi\u00F3n"))),
184
- (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.train_type_label) === "Tren Express (Nuevo)" && (React.createElement("div", { className: `flex items-center gap-[2px] py-[5px] text-white px-[10px] rounded-[38px] min-[420]:text-[12px] text-[10px] z-20 `, style: {
185
- backgroundColor: "#fff",
186
- border: `1px solid ${colors.topLabelColor}`,
187
- color: colors.topLabelColor,
188
- } },
189
- renderIcon("directo", "12px"),
190
- React.createElement("div", null, "Tren Express"))))),
112
+ React.createElement(ServiceBadgesMobile, { showTopLabel: showTopLabel, isSoldOut: isSoldOut, colors: colors, renderIcon: renderIcon, serviceItem: serviceItem, isConexion: isConexion })),
191
113
  (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.offer_text) && (React.createElement("div", { className: "px-[12px] pt-[22px] pb-[8px] relative -z-9 -mt-[15px]", style: {
192
114
  background: isSoldOut ? "#ccc" : offerGradient,
193
115
  opacity: isSoldOut ? 0.5 : 1,
@@ -195,34 +117,42 @@ function ServiceItemMobile({ serviceItem, onBookButtonPress, colors, busStage, o
195
117
  zIndex: -1,
196
118
  } },
197
119
  React.createElement("div", { className: "flex flex-col gap-[8px] text-[12px] min-[420px]:text-[12px] text-[#464647]", style: { lineHeight: 1.6 } },
198
- React.createElement("div", { className: "flex justify-between items-center" },
120
+ React.createElement("div", { className: "flex justify-between items-start" },
199
121
  React.createElement("div", { className: `flex ${isLongOfferText ? "items-start" : "items-center"}` },
200
122
  React.createElement("div", { className: isLongOfferText ? "mt-[2px]" : "" },
201
- React.createElement(LottiePlayer, { animationData: serviceItem.icons.bombAnim, width: "12px", height: "12px" })),
123
+ React.createElement(LottiePlayer, { animationData: serviceItem.icons.bombAnim, width: "14px", height: "14px" })),
202
124
  React.createElement("div", { className: `ml-[4px] flex-1 outline-none ${isLongOfferText ? "mt-[2px]" : ""}`, style: {
203
125
  color: "#fff",
204
126
  lineHeight: 1.4,
205
127
  } },
206
128
  React.createElement("span", { className: "whitespace-nowrap min-[380px]:text-[12px]" },
207
129
  "Termina en\u00A0",
208
- React.createElement("span", { className: "bold-text", ref: startCountdown, style: {
130
+ React.createElement("span", { className: "bold-text", ref: (node) => commonService.startCountdown(node, 599), style: {
209
131
  fontVariantNumeric: "tabular-nums",
210
132
  display: "inline-block",
211
133
  } })))),
212
- React.createElement("div", { className: "flex items-center", style: {
134
+ React.createElement("div", { className: "flex flex-col items-end", style: {
213
135
  color: "#fff",
214
136
  } },
215
- React.createElement("div", { className: "mr-[4px]" },
216
- " ",
217
- React.createElement(LottiePlayer, { animationData: serviceItem.icons.dotAnimation, width: "12px", height: "12px" })),
218
- React.createElement("span", { className: "flex-1", style: { lineHeight: 1.4 } },
219
- React.createElement("span", { className: "bold-text", ref: startViewerCount, style: { fontVariantNumeric: "tabular-nums" } }),
220
- " ",
221
- React.createElement("span", { className: "bold-text" }, "personas"),
222
- " ",
223
- React.createElement("span", null,
137
+ React.createElement("div", { className: "flex items-center" },
138
+ React.createElement("div", { className: "mr-[4px]" },
139
+ " ",
140
+ React.createElement(LottiePlayer, { animationData: serviceItem.icons.dotAnimation, width: "12px", height: "12px" })),
141
+ React.createElement("span", { className: "flex-1", style: { lineHeight: 1.4 } },
142
+ React.createElement("span", { className: "bold-text", ref: (node) => commonService.startViewerCount(node, viewersConfig), style: { fontVariantNumeric: "tabular-nums" } }),
143
+ " ",
144
+ React.createElement("span", { className: "bold-text" }, "personas"),
145
+ " ",
146
+ React.createElement("span", null,
147
+ " ",
148
+ "viendo"))),
149
+ React.createElement("div", { className: "flex items-center" },
150
+ React.createElement("span", { className: "whitespace-nowrap" },
151
+ "\u26A1 Quedan pocos",
152
+ " ",
153
+ React.createElement("span", { className: "bold-text", ref: (node) => commonService.startComprandoCount(node, 4, 16), style: { fontVariantNumeric: "tabular-nums" } }),
224
154
  " ",
225
- "viendo"))))))),
155
+ "comprando"))))))),
226
156
  React.createElement("div", { style: {
227
157
  display: "grid",
228
158
  gridTemplateRows: isItemExpanded ? "1fr" : "0fr",
@@ -146,6 +146,8 @@ export interface ServiceItemProps {
146
146
  bottomStripColor?: string;
147
147
  directoColor?: string;
148
148
  seatPriceColor?: string;
149
+ rightGradiantColor?: string;
150
+ leftGradiantColor?: string;
149
151
  };
150
152
  cityOrigin?: {
151
153
  value: number;
package/dist/styles.css CHANGED
@@ -433,6 +433,9 @@
433
433
  .rotate-180 {
434
434
  rotate: 180deg;
435
435
  }
436
+ .transform {
437
+ transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
438
+ }
436
439
  .cursor-default {
437
440
  cursor: default;
438
441
  }
@@ -1081,6 +1084,15 @@
1081
1084
  transform: translateY(0);
1082
1085
  }
1083
1086
  }
1087
+ @keyframes pulse-zoom {
1088
+ 0%,
1089
+ 100% {
1090
+ transform: scale(1);
1091
+ }
1092
+ 50% {
1093
+ transform: scale(1.05);
1094
+ }
1095
+ }
1084
1096
  .hide-scrollbar::-webkit-scrollbar {
1085
1097
  display: none;
1086
1098
  }
@@ -1103,6 +1115,26 @@
1103
1115
  inherits: false;
1104
1116
  initial-value: 0;
1105
1117
  }
1118
+ @property --tw-rotate-x {
1119
+ syntax: "*";
1120
+ inherits: false;
1121
+ }
1122
+ @property --tw-rotate-y {
1123
+ syntax: "*";
1124
+ inherits: false;
1125
+ }
1126
+ @property --tw-rotate-z {
1127
+ syntax: "*";
1128
+ inherits: false;
1129
+ }
1130
+ @property --tw-skew-x {
1131
+ syntax: "*";
1132
+ inherits: false;
1133
+ }
1134
+ @property --tw-skew-y {
1135
+ syntax: "*";
1136
+ inherits: false;
1137
+ }
1106
1138
  @property --tw-border-style {
1107
1139
  syntax: "*";
1108
1140
  inherits: false;
@@ -1214,6 +1246,11 @@
1214
1246
  --tw-translate-x: 0;
1215
1247
  --tw-translate-y: 0;
1216
1248
  --tw-translate-z: 0;
1249
+ --tw-rotate-x: initial;
1250
+ --tw-rotate-y: initial;
1251
+ --tw-rotate-z: initial;
1252
+ --tw-skew-x: initial;
1253
+ --tw-skew-y: initial;
1217
1254
  --tw-border-style: solid;
1218
1255
  --tw-leading: initial;
1219
1256
  --tw-font-weight: initial;
@@ -122,15 +122,30 @@ function SeatSection({ seatTypes, availableSeats, isSoldOut, priceColor, currenc
122
122
  React.createElement("span", { className: "text-[13.33px] font-normal leading-[22px] text-[#c2c2c2]" }, "Antes")),
123
123
  React.createElement("div", { className: "col-start-1 row-start-3 flex h-[30px] items-end" },
124
124
  React.createElement("span", { className: "text-[13.33px] font-normal leading-[24px] text-[#464647]" }, "Desde")),
125
- React.createElement("div", { className: "col-start-2 row-start-1 flex items-center justify-center absolute", style: { top: "-22px", right: "30px" } }, discountValue != null && (React.createElement("span", { className: "rounded-[100px] bg-[#ff5964] px-[6px] text-[12px] bold-text leading-[20px] text-white" },
125
+ React.createElement("div", { className: "col-start-2 row-start-1 flex items-center justify-center absolute", style: { top: "-22px", right: "30px" } }, discountValue != null && (React.createElement("span", { className: "rounded-[100px] bg-[#ff5964] px-[6px] text-[12px] bold-text leading-[20px] text-white", style: {
126
+ animation: "pulse-zoom 2s ease-in-out infinite",
127
+ } },
126
128
  discountValue,
127
129
  "% OFF"))),
128
130
  React.createElement("div", { className: "col-start-2 row-start-2 flex items-center justify-center ", style: { textAlign: "center" } },
129
- React.createElement("span", { className: "text-[13.33px] font-normal leading-[20px] text-[#9f9f9f] line-through" }, formatPrice(discountSeat.originalPrice))),
131
+ React.createElement("span", { className: "text-[13.33px] font-normal leading-[20px] text-[#9f9f9f] relative", style: {
132
+ position: "relative",
133
+ } },
134
+ formatPrice(discountSeat.originalPrice),
135
+ React.createElement("span", { style: {
136
+ position: "absolute",
137
+ left: "-2px",
138
+ top: "50%",
139
+ width: "calc(100% + 4px)",
140
+ height: "1px",
141
+ backgroundColor: "#9f9f9f",
142
+ transform: "rotate(-10deg)",
143
+ transformOrigin: "center",
144
+ } }))),
130
145
  React.createElement("div", { className: "col-start-2 row-start-3 flex h-[30px] items-end justify-start" },
131
146
  React.createElement("span", { className: "flex items-center gap-[6px] text-[22px] bold-text leading-[30px]", style: { color: isSoldOut ? "#c0c0c0" : "#ff5964" } },
132
147
  renderIcon("fireIcon", "16px"),
133
- formatPrice(discountSeat.discountedPrice)))));
148
+ formatPrice(Math.floor(discountSeat.discountedPrice * 1000) / 1000)))));
134
149
  }
135
150
  return (React.createElement("div", { className: "relative flex gap-[10px] text-[13.33px] justify-between min-h-[2.2rem]", style: isCentered ? { alignItems: "center" } : {} },
136
151
  React.createElement("div", { className: "flex flex-col justify-between", style: { gap: "10px" } }, renderLabels()),
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ interface ServiceBadgesProps {
3
+ showTopLabel?: string;
4
+ isSoldOut: boolean;
5
+ colors: any;
6
+ renderIcon: (iconKey: string, size?: string) => React.ReactNode;
7
+ translation?: {
8
+ directService?: string;
9
+ };
10
+ serviceItem: {
11
+ is_transpordo?: boolean;
12
+ is_direct_trip?: boolean;
13
+ train_type_label?: string;
14
+ };
15
+ }
16
+ declare const ServiceBadges: React.FC<ServiceBadgesProps>;
17
+ export default ServiceBadges;
@@ -0,0 +1,33 @@
1
+ import React from "react";
2
+ const ServiceBadges = ({ showTopLabel, isSoldOut, colors, renderIcon, translation, serviceItem, }) => {
3
+ return (React.createElement("div", { className: "absolute -top-[11px] left-0 w-full flex items-center justify-end gap-[12px] pr-[22px] z-10" },
4
+ showTopLabel && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] px-[14px] rounded-[38px] text-[12.5px] z-10`, style: {
5
+ backgroundColor: "#fff",
6
+ border: `1px solid ${colors.topLabelColor}`,
7
+ color: colors.topLabelColor,
8
+ } },
9
+ React.createElement("div", { className: isSoldOut ? "grayscale" : "" }, renderIcon("specialDeparture", "12px")),
10
+ React.createElement("div", { className: isSoldOut ? "text-white" : `text-[${colors.topLabelColor}]` }, showTopLabel))),
11
+ (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_transpordo) && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] px-[14px] rounded-[38px] text-[12.5px] z-20`, style: {
12
+ backgroundColor: "#fff",
13
+ border: `1px solid ${colors.topLabelColor}`,
14
+ color: colors.topLabelColor,
15
+ } },
16
+ renderIcon("connectingServiceIcon", "12px"),
17
+ React.createElement("div", null, "Conexión"))),
18
+ (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.is_direct_trip) && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] px-[14px] rounded-[38px] text-[12.5px] z-20`, style: {
19
+ backgroundColor: "#fff",
20
+ border: `1px solid ${colors.topLabelColor}`,
21
+ color: colors.topLabelColor,
22
+ } },
23
+ renderIcon("directo", "12px"),
24
+ React.createElement("div", null, translation === null || translation === void 0 ? void 0 : translation.directService))),
25
+ (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.train_type_label) === "Tren Express (Nuevo)" && (React.createElement("div", { className: `flex items-center gap-[10px] py-[4px] px-[14px] rounded-[38px] text-[12.5px] z-20`, style: {
26
+ backgroundColor: "#fff",
27
+ border: `1px solid ${colors.topLabelColor}`,
28
+ color: colors.topLabelColor,
29
+ } },
30
+ renderIcon("directo", "12px"),
31
+ React.createElement("div", null, "Tren Express")))));
32
+ };
33
+ export default ServiceBadges;
@@ -19,6 +19,7 @@ interface DateTimeSectionMobileProps {
19
19
  availableSeats: number;
20
20
  removeDuplicateSeats?: boolean;
21
21
  serviceItem?: any;
22
+ tooltipBgColor?: string;
22
23
  }
23
- declare function DateTimeSectionMobile({ onBookButtonPress, isCiva, isSoldOut, isLinatal, isPeru, orignLabel, destinationLabel, originIcon, destinationIcon, travelDate, arrivalDate, depTime, arrTime, seatTypes, seatPriceColor, currencySign, availableSeats, removeDuplicateSeats, serviceItem, }: DateTimeSectionMobileProps): React.ReactElement;
24
+ declare function DateTimeSectionMobile({ onBookButtonPress, isCiva, isSoldOut, isLinatal, isPeru, orignLabel, destinationLabel, originIcon, destinationIcon, travelDate, arrivalDate, depTime, arrTime, seatTypes, seatPriceColor, currencySign, availableSeats, removeDuplicateSeats, serviceItem, tooltipBgColor, }: DateTimeSectionMobileProps): React.ReactElement;
24
25
  export default DateTimeSectionMobile;
@@ -31,7 +31,7 @@ const TimeRow = ({ label, icon, alt, date, timeContent, isSoldOut, }) => (React.
31
31
  React.createElement("span", { className: "cursor-pointer black-text" }, DateService.getServiceItemDate(date)),
32
32
  React.createElement("div", { className: "absolute left-[50%]" }, "\u2022"),
33
33
  React.createElement("div", { className: "font-[900] relative black-text" }, timeContent)))));
34
- function DateTimeSectionMobile({ onBookButtonPress, isCiva, isSoldOut, isLinatal, isPeru, orignLabel, destinationLabel, originIcon, destinationIcon, travelDate, arrivalDate, depTime, arrTime, seatTypes, seatPriceColor, currencySign, availableSeats, removeDuplicateSeats, serviceItem, }) {
34
+ function DateTimeSectionMobile({ onBookButtonPress, isCiva, isSoldOut, isLinatal, isPeru, orignLabel, destinationLabel, originIcon, destinationIcon, travelDate, arrivalDate, depTime, arrTime, seatTypes, seatPriceColor, currencySign, availableSeats, removeDuplicateSeats, serviceItem, tooltipBgColor, }) {
35
35
  const { cleaned: cleanedDepTime, hasAM, hasPM } = getCleanedDepTime(depTime);
36
36
  const depTimeContent = isLinatal ? (React.createElement("div", null,
37
37
  React.createElement("span", null,
@@ -52,6 +52,6 @@ function DateTimeSectionMobile({ onBookButtonPress, isCiva, isSoldOut, isLinatal
52
52
  backgroundColor: "#ccc",
53
53
  margin: "auto",
54
54
  } })),
55
- React.createElement(SeatSectionMobile, { seatTypes: seatTypes, isSoldOut: isSoldOut, isPeru: isPeru, seatPriceColor: seatPriceColor, currencySign: currencySign, availableSeats: availableSeats, removeDuplicateSeats: removeDuplicateSeats, serviceItem: serviceItem })));
55
+ React.createElement(SeatSectionMobile, { seatTypes: seatTypes, isSoldOut: isSoldOut, isPeru: isPeru, seatPriceColor: seatPriceColor, currencySign: currencySign, availableSeats: availableSeats, removeDuplicateSeats: removeDuplicateSeats, serviceItem: serviceItem, tooltipBgColor: tooltipBgColor })));
56
56
  }
57
57
  export default DateTimeSectionMobile;
@@ -13,6 +13,7 @@ interface SeatSectionMobileProps {
13
13
  availableSeats: number;
14
14
  removeDuplicateSeats?: boolean;
15
15
  serviceItem?: any;
16
+ tooltipBgColor?: string;
16
17
  }
17
- declare function SeatSectionMobile({ seatTypes: seatTypesData, isSoldOut, isPeru, seatPriceColor, currencySign, availableSeats, removeDuplicateSeats, serviceItem, }: SeatSectionMobileProps): React.ReactElement;
18
+ declare function SeatSectionMobile({ seatTypes: seatTypesData, isSoldOut, isPeru, seatPriceColor, currencySign, availableSeats, removeDuplicateSeats, serviceItem, tooltipBgColor, }: SeatSectionMobileProps): React.ReactElement;
18
19
  export default SeatSectionMobile;
@@ -42,7 +42,7 @@ const getUniqueSeats = (data, limit) => {
42
42
  .sort((a, b) => a.fare - b.fare)
43
43
  .slice(0, limit);
44
44
  };
45
- function SeatSectionMobile({ seatTypes: seatTypesData, isSoldOut, isPeru, seatPriceColor, currencySign, availableSeats, removeDuplicateSeats, serviceItem, }) {
45
+ function SeatSectionMobile({ seatTypes: seatTypesData, isSoldOut, isPeru, seatPriceColor, currencySign, availableSeats, removeDuplicateSeats, serviceItem, tooltipBgColor, }) {
46
46
  var _a, _b, _c, _d, _e;
47
47
  const hasMultipleTypes = ((_a = seatTypesData === null || seatTypesData === void 0 ? void 0 : seatTypesData.length) !== null && _a !== void 0 ? _a : 0) > 2;
48
48
  const getFare = (fare) => {
@@ -94,9 +94,13 @@ function SeatSectionMobile({ seatTypes: seatTypesData, isSoldOut, isPeru, seatPr
94
94
  typeof (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.discount_value) === "number"
95
95
  ? Math.round(serviceItem.discount_value)
96
96
  : null;
97
- return (React.createElement("div", { className: "content-center relative", style: { width: "40%" } }, hasDiscount && discountSeat ? (React.createElement("div", { className: "relative grid grid-cols-[auto_auto] justify-between gap-x-[8px]" },
98
- discountValue != null && (React.createElement("div", { className: "absolute -top-[18px] right-[0px]" },
99
- React.createElement("span", { className: "rounded-[100px] px-[8px] text-[12px] bold-text leading-[20px] text-[#fff]", style: { backgroundColor: seatPriceColor } },
97
+ return (React.createElement("div", { className: "content-center relative", style: { width: "40%" } }, hasDiscount && discountSeat ? (React.createElement("div", { className: "relative grid grid-cols-[auto_auto] justify-between gap-x-[8px] " },
98
+ discountValue != null && (React.createElement("div", { className: "absolute -top-[18px] right-[0px]", style: {
99
+ animation: "pulse-zoom 2s ease-in-out infinite",
100
+ } },
101
+ React.createElement("span", { className: "rounded-[100px] px-[8px] text-[12px] bold-text leading-[20px] text-[#fff]", style: {
102
+ backgroundColor: tooltipBgColor,
103
+ } },
100
104
  discountValue,
101
105
  "% OFF"))),
102
106
  React.createElement("span", { className: "min-[420]:text-[13px] text-[12px] leading-[20px] text-[#c2c2c2]" }, "Antes"),