kupos-ui-components-lib 9.0.10 → 9.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/components/ServiceItem/PeruServiceItemDesktop.js +1 -1
  2. package/dist/components/ServiceItem/RatingHover.d.ts +1 -0
  3. package/dist/components/ServiceItem/RatingHover.js +30 -29
  4. package/dist/components/ServiceItem/ServiceItemDesktop.js +5 -3
  5. package/dist/components/ServiceItem/ServiceItemMobile.d.ts +1 -1
  6. package/dist/components/ServiceItem/ServiceItemMobile.js +35 -10
  7. package/dist/components/ServiceItem/mobileTypes.d.ts +2 -0
  8. package/dist/styles.css +43 -0
  9. package/dist/ui/BottomAmenities/BottomAmenities.js +1 -1
  10. package/dist/ui/ExpendedDropDown/ExpandedDropdown.d.ts +1 -10
  11. package/dist/ui/ExpendedDropDown/ExpandedDropdown.js +1 -1
  12. package/dist/ui/RatingBlock.d.ts +2 -1
  13. package/dist/ui/RatingBlock.js +2 -2
  14. package/dist/ui/SeatSection/SeatSection.js +20 -2
  15. package/dist/ui/TopAmenities/TopAmenities.js +6 -2
  16. package/dist/ui/mobileweb/BottomAmenitiesMobile.d.ts +2 -1
  17. package/dist/ui/mobileweb/BottomAmenitiesMobile.js +18 -18
  18. package/dist/ui/mobileweb/ExpandedDropdownMobile.d.ts +11 -0
  19. package/dist/ui/mobileweb/ExpandedDropdownMobile.js +32 -0
  20. package/dist/ui/mobileweb/TopAmenitieMobile.d.ts +4 -1
  21. package/dist/ui/mobileweb/TopAmenitieMobile.js +40 -7
  22. package/package.json +1 -1
  23. package/src/components/ServiceItem/PeruServiceItemDesktop.tsx +1 -0
  24. package/src/components/ServiceItem/RatingHover.tsx +51 -48
  25. package/src/components/ServiceItem/ServiceItemDesktop.tsx +5 -9
  26. package/src/components/ServiceItem/ServiceItemMobile.tsx +47 -8
  27. package/src/components/ServiceItem/mobileTypes.ts +2 -0
  28. package/src/ui/BottomAmenities/BottomAmenities.tsx +8 -8
  29. package/src/ui/ExpendedDropDown/ExpandedDropdown.tsx +0 -12
  30. package/src/ui/RatingBlock.tsx +2 -0
  31. package/src/ui/SeatSection/SeatSection.tsx +22 -2
  32. package/src/ui/TopAmenities/TopAmenities.tsx +11 -3
  33. package/src/ui/mobileweb/BottomAmenitiesMobile.tsx +65 -64
  34. package/src/ui/mobileweb/ExpandedDropdownMobile.tsx +56 -0
  35. package/src/ui/mobileweb/TopAmenitieMobile.tsx +46 -6
@@ -316,7 +316,7 @@ function PeruServiceItemDesktop({ serviceItem, onBookButtonPress, colors, metaDa
316
316
  {
317
317
  key: "rating",
318
318
  width: "30%",
319
- render: (React.createElement(RatingBlock, { showRating: showRating, serviceItem: serviceItem, isSoldOut: isSoldOut, colors: colors, t: t, translation: translation })),
319
+ render: (React.createElement(RatingBlock, { showRating: showRating, serviceItem: serviceItem, isSoldOut: isSoldOut, colors: colors, t: t, translation: translation, isPeru: isPeru })),
320
320
  },
321
321
  {
322
322
  key: "duration",
@@ -7,6 +7,7 @@ interface RatingHoverProps {
7
7
  translation?: {
8
8
  [key: string]: string;
9
9
  };
10
+ isPeru?: boolean;
10
11
  }
11
12
  declare const RatingHover: React.FC<RatingHoverProps>;
12
13
  export default RatingHover;
@@ -1,6 +1,7 @@
1
1
  import React from "react";
2
2
  import RatingItem from "./RatingItem";
3
- const RatingHover = ({ serviceItem, isSoldOut, colors, t = (key) => key, translation, }) => {
3
+ const RatingHover = ({ serviceItem, isSoldOut, colors, t = (key) => key, translation, isPeru, }) => {
4
+ const ratingIndex = isPeru ? 7 : 6;
4
5
  return (React.createElement("div", { className: "flex items-center" },
5
6
  React.createElement("div", { className: "w-[18px] h-auto mr-[4px] relative" },
6
7
  React.createElement("img", { src: serviceItem.icons.rating, alt: "origin", className: `w-[16px] h-[16px] mr-[4px] object-contain mb-[4px] ${isSoldOut ? "grayscale" : ""}`, onMouseEnter: (e) => {
@@ -22,37 +23,37 @@ const RatingHover = ({ serviceItem, isSoldOut, colors, t = (key) => key, transla
22
23
  React.createElement("div", { className: "text-[12px] bold-text" }, translation === null || translation === void 0 ? void 0 : translation.ratingMouseOverText),
23
24
  React.createElement("div", { className: "text-[12px] font-light" }, serviceItem.operator_service_name)),
24
25
  React.createElement("div", { className: "px-3 py-2 flex flex-col gap-[10px] font9" },
25
- React.createElement(RatingItem, { rating: serviceItem.operator_details[6] &&
26
- serviceItem.operator_details[6][Object.keys(serviceItem.operator_details[6] &&
27
- serviceItem.operator_details[6])[0]] &&
28
- parseFloat(serviceItem.operator_details[6][Object.keys(serviceItem.operator_details[6] &&
29
- serviceItem.operator_details[6])[0]]).toFixed(1)
30
- ? +parseFloat(serviceItem.operator_details[6][Object.keys(serviceItem.operator_details[6] &&
31
- serviceItem.operator_details[6])[0]]).toFixed(1)
26
+ React.createElement(RatingItem, { rating: serviceItem.operator_details[ratingIndex] &&
27
+ serviceItem.operator_details[ratingIndex][Object.keys(serviceItem.operator_details[ratingIndex] &&
28
+ serviceItem.operator_details[ratingIndex])[0]] &&
29
+ parseFloat(serviceItem.operator_details[ratingIndex][Object.keys(serviceItem.operator_details[ratingIndex] &&
30
+ serviceItem.operator_details[ratingIndex])[0]]).toFixed(1)
31
+ ? +parseFloat(serviceItem.operator_details[ratingIndex][Object.keys(serviceItem.operator_details[ratingIndex] &&
32
+ serviceItem.operator_details[ratingIndex])[0]]).toFixed(1)
32
33
  : 0, label: translation === null || translation === void 0 ? void 0 : translation.busQuality, isSoldOut: isSoldOut }),
33
- React.createElement(RatingItem, { rating: serviceItem.operator_details[6] &&
34
- serviceItem.operator_details[6][Object.keys(serviceItem.operator_details[6] &&
35
- serviceItem.operator_details[6])[1]] &&
36
- parseFloat(serviceItem.operator_details[6][Object.keys(serviceItem.operator_details[6] &&
37
- serviceItem.operator_details[6])[1]]).toFixed(1)
38
- ? +parseFloat(serviceItem.operator_details[6][Object.keys(serviceItem.operator_details[6] &&
39
- serviceItem.operator_details[6])[1]]).toFixed(1)
34
+ React.createElement(RatingItem, { rating: serviceItem.operator_details[ratingIndex] &&
35
+ serviceItem.operator_details[ratingIndex][Object.keys(serviceItem.operator_details[ratingIndex] &&
36
+ serviceItem.operator_details[ratingIndex])[1]] &&
37
+ parseFloat(serviceItem.operator_details[ratingIndex][Object.keys(serviceItem.operator_details[ratingIndex] &&
38
+ serviceItem.operator_details[ratingIndex])[1]]).toFixed(1)
39
+ ? +parseFloat(serviceItem.operator_details[ratingIndex][Object.keys(serviceItem.operator_details[ratingIndex] &&
40
+ serviceItem.operator_details[ratingIndex])[1]]).toFixed(1)
40
41
  : 0, label: translation === null || translation === void 0 ? void 0 : translation.punctuality, isSoldOut: isSoldOut }),
41
- React.createElement(RatingItem, { rating: serviceItem.operator_details[6] &&
42
- serviceItem.operator_details[6][Object.keys(serviceItem.operator_details[6] &&
43
- serviceItem.operator_details[6])[2]] &&
44
- parseFloat(serviceItem.operator_details[6][Object.keys(serviceItem.operator_details[6] &&
45
- serviceItem.operator_details[6])[2]]).toFixed(1)
46
- ? +parseFloat(serviceItem.operator_details[6][Object.keys(serviceItem.operator_details[6] &&
47
- serviceItem.operator_details[6])[2]]).toFixed(1)
42
+ React.createElement(RatingItem, { rating: serviceItem.operator_details[ratingIndex] &&
43
+ serviceItem.operator_details[ratingIndex][Object.keys(serviceItem.operator_details[ratingIndex] &&
44
+ serviceItem.operator_details[ratingIndex])[2]] &&
45
+ parseFloat(serviceItem.operator_details[ratingIndex][Object.keys(serviceItem.operator_details[ratingIndex] &&
46
+ serviceItem.operator_details[ratingIndex])[2]]).toFixed(1)
47
+ ? +parseFloat(serviceItem.operator_details[ratingIndex][Object.keys(serviceItem.operator_details[ratingIndex] &&
48
+ serviceItem.operator_details[ratingIndex])[2]]).toFixed(1)
48
49
  : 0, label: translation === null || translation === void 0 ? void 0 : translation.serviceQuality, isSoldOut: isSoldOut }),
49
- React.createElement(RatingItem, { rating: serviceItem.operator_details[6] &&
50
- serviceItem.operator_details[6][Object.keys(serviceItem.operator_details[6] &&
51
- serviceItem.operator_details[6])[3]] &&
52
- parseFloat(serviceItem.operator_details[6][Object.keys(serviceItem.operator_details[6] &&
53
- serviceItem.operator_details[6])[3]]).toFixed(1)
54
- ? +parseFloat(serviceItem.operator_details[6][Object.keys(serviceItem.operator_details[6] &&
55
- serviceItem.operator_details[6])[3]]).toFixed(1)
50
+ React.createElement(RatingItem, { rating: serviceItem.operator_details[ratingIndex] &&
51
+ serviceItem.operator_details[ratingIndex][Object.keys(serviceItem.operator_details[ratingIndex] &&
52
+ serviceItem.operator_details[ratingIndex])[3]] &&
53
+ parseFloat(serviceItem.operator_details[ratingIndex][Object.keys(serviceItem.operator_details[ratingIndex] &&
54
+ serviceItem.operator_details[ratingIndex])[3]]).toFixed(1)
55
+ ? +parseFloat(serviceItem.operator_details[ratingIndex][Object.keys(serviceItem.operator_details[ratingIndex] &&
56
+ serviceItem.operator_details[ratingIndex])[3]]).toFixed(1)
56
57
  : 0, label: translation === null || translation === void 0 ? void 0 : translation.serviceRecommendation, isSoldOut: isSoldOut })),
57
58
  React.createElement("div", { className: "px-1 py-2 text-center text-[12px] font9", style: {
58
59
  backgroundColor: isSoldOut ? "#f5f5f5" : colors.ratingBottomColor,
@@ -110,7 +110,7 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
110
110
  };
111
111
  const checkMidnight = () => {
112
112
  var _a, _b;
113
- setIsExpand(null);
113
+ setIsExpand === null || setIsExpand === void 0 ? void 0 : setIsExpand(null);
114
114
  if ((cityOrigin === null || cityOrigin === void 0 ? void 0 : cityOrigin.label) &&
115
115
  (cityDestination === null || cityDestination === void 0 ? void 0 : cityDestination.label) &&
116
116
  ((cityOrigin.label.toLowerCase().includes("argentina") &&
@@ -258,7 +258,7 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
258
258
  className: "" },
259
259
  React.createElement("img", { src: serviceItem.operator_details[0], alt: "service logo", className: `h-auto w-[150px] object-contain ${isSoldOut ? "grayscale" : ""}` }),
260
260
  isCiva ? (React.createElement("div", { className: "text-[13.33px] black-text ml-2" }, serviceItem.operator_details[2])) : null),
261
- React.createElement(RatingBlock, { showRating: showRating, serviceItem: serviceItem, isSoldOut: isSoldOut, colors: colors, t: t, translation: translation })),
261
+ React.createElement(RatingBlock, { showRating: showRating, serviceItem: serviceItem, isSoldOut: isSoldOut, colors: colors, t: t, translation: translation, isPeru: isPeru })),
262
262
  React.createElement(DateTimeSection, { serviceItem: serviceItem, isSoldOut: isSoldOut, isCiva: isCiva, isLinatal: isLinatal, removeArrivalTime: removeArrivalTime, orignLabel: orignLabel, destinationLabel: destinationLabel, busStage: busStage, metaData: metaData, colors: colors }),
263
263
  React.createElement("div", { style: {
264
264
  width: "1px",
@@ -283,9 +283,11 @@ function ServiceItemPB({ serviceItem, onBookButtonPress, colors, metaData, child
283
283
  gridTemplateRows: isItemExpanded ? "1fr" : "0fr",
284
284
  opacity: isItemExpanded ? 1 : 0,
285
285
  transition: "grid-template-rows 0.3s ease-in-out, opacity 0.25s ease-in-out",
286
+ position: "relative",
287
+ zIndex: -1,
286
288
  } },
287
289
  React.createElement("div", { style: { overflow: "hidden", minHeight: 0, marginTop: "-10px" } },
288
- React.createElement(ExpandedDropdown, { serviceItem: serviceItem, showPromo: showPromo, colors: colors, grayscaleClass: grayscaleClass, translation: translation, getAnimationIcon: getAnimationIcon }))),
290
+ React.createElement(ExpandedDropdown, { serviceItem: serviceItem }))),
289
291
  children,
290
292
  (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.offer_text) && (React.createElement("div", { className: "text-white p-[10px_15px] text-left w-full flex items-center absolute -bottom-[36px] pt-[50px] -z-10 rounded-b-[14px] text-[14px]", style: {
291
293
  backgroundColor: colors === null || colors === void 0 ? void 0 : colors.bottomStripColor,
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
2
  import { MobileServiceItemProps } from "./mobileTypes";
3
- declare function ServiceItemMobile({ serviceItem, onBookButtonPress, colors, busStage, orignLabel, destinationLabel, amenitiesData, setShowDropdown, showDropdown, setAmenetiesAtomValue, isCiva, currencySign, isPeru, showRating, showLastSeats, removeDuplicateSeats, isLinatal, }: MobileServiceItemProps): React.ReactElement;
3
+ declare function ServiceItemMobile({ serviceItem, onBookButtonPress, colors, busStage, orignLabel, destinationLabel, amenitiesData, setShowDropdown, showDropdown, isExpanded, setIsExpanded, setAmenetiesAtomValue, isCiva, currencySign, isPeru, showRating, showLastSeats, removeDuplicateSeats, isLinatal, }: MobileServiceItemProps): React.ReactElement;
4
4
  export default ServiceItemMobile;
@@ -4,6 +4,7 @@ import commonService from "../../utils/CommonService";
4
4
  import TopAmenitieMobile from "../../ui/mobileweb/TopAmenitieMobile";
5
5
  import BottomAmenitiesMobile from "../../ui/mobileweb/BottomAmenitiesMobile";
6
6
  import DateTimeSectionMobile from "../../ui/mobileweb/DateTimeSectionMobile";
7
+ import ExpandedDropdownMobile from "../../ui/mobileweb/ExpandedDropdownMobile";
7
8
  const SEAT_EXCEPTIONS = ["Asiento mascota"];
8
9
  const exceptions = [
9
10
  "gy",
@@ -16,11 +17,13 @@ const exceptions = [
16
17
  "blanco",
17
18
  "asiento_mascota",
18
19
  ];
19
- function ServiceItemMobile({ serviceItem, onBookButtonPress, colors, busStage, orignLabel, destinationLabel, amenitiesData, setShowDropdown, showDropdown, setAmenetiesAtomValue, isCiva, currencySign, isPeru, showRating, showLastSeats, removeDuplicateSeats, isLinatal, }) {
20
+ function ServiceItemMobile({ serviceItem, onBookButtonPress, colors, busStage, orignLabel, destinationLabel, amenitiesData, setShowDropdown, showDropdown, isExpanded, setIsExpanded, setAmenetiesAtomValue, isCiva, currencySign, isPeru, showRating, showLastSeats, removeDuplicateSeats, isLinatal, }) {
20
21
  var _a, _b, _c;
22
+ const isItemExpanded = serviceItem.id === isExpanded;
21
23
  const isPetSeat = (Object.keys(serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.pet_seat_info) || []).length > 0;
22
24
  let isSoldOut = serviceItem.available_seats <= 0;
23
25
  const showPromo = Math.random() > 0.5;
26
+ const countdownSeconds = 7830;
24
27
  const labelId = typeof serviceItem.boarding_stages === "string"
25
28
  ? serviceItem.boarding_stages.split("|")[0]
26
29
  : "";
@@ -74,12 +77,20 @@ function ServiceItemMobile({ serviceItem, onBookButtonPress, colors, busStage, o
74
77
  showTopLabel
75
78
  ? "mt-[10px]"
76
79
  : "mt-[10px]"} `, style: { backgroundColor: "#fff", zIndex: 1 } },
77
- React.createElement(TopAmenitieMobile, { showTopLabel: showTopLabel, isSoldOut: isSoldOut, seatPriceColor: colors.seatPriceColor, bombAnim: serviceItem.icons.bombAnim, priorityStageAnim: serviceItem.icons.priorityStageAnim }),
80
+ React.createElement(TopAmenitieMobile, { showTopLabel: showTopLabel, isSoldOut: isSoldOut, seatPriceColor: colors.seatPriceColor, bombAnim: serviceItem.icons.bombAnim, priorityStageAnim: serviceItem.icons.priorityStageAnim, countdownSeconds: countdownSeconds, onCountdownEnd: () => {
81
+ const cardEl = document.getElementById(`service-card-${serviceItem.id}`);
82
+ if (!cardEl)
83
+ return;
84
+ cardEl.style.border = "1px solid #ccc";
85
+ if (!showTopLabel) {
86
+ cardEl.style.borderRadius = "10px";
87
+ }
88
+ } }),
78
89
  React.createElement("div", { className: " rounded-[20px]", style: {
79
90
  backgroundColor: "#fff",
80
91
  zIndex: 1,
81
92
  // borderRadius: showTopLabel ? "10px 0 10px 10px" : "10px",
82
- borderRadius: "14px 0 14px 14px",
93
+ borderRadius: "12px 0 12px 12px",
83
94
  border: `1px solid ${colors.bottomStripColor}`,
84
95
  } },
85
96
  React.createElement("div", {
@@ -107,12 +118,16 @@ function ServiceItemMobile({ serviceItem, onBookButtonPress, colors, busStage, o
107
118
  (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),
108
119
  React.createElement(DateTimeSectionMobile, { onBookButtonPress: onBookButtonPress, isCiva: isCiva, isSoldOut: isSoldOut, isLinatal: isLinatal, isPeru: isPeru, orignLabel: orignLabel, destinationLabel: destinationLabel, originIcon: (_a = serviceItem.icons) === null || _a === void 0 ? void 0 : _a.origin, destinationIcon: (_b = serviceItem.icons) === null || _b === void 0 ? void 0 : _b.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 }),
109
120
  React.createElement("div", { className: "bg-[#E6E6E6] mt-[10px] mb-[10px] h-[1px]" }),
110
- React.createElement(BottomAmenitiesMobile, { isSoldOut: isSoldOut, amenitiesNodes: amenities(), hoursIcon: renderIcon("hours", "14px"), duration: (_c = serviceItem.duration) === null || _c === void 0 ? void 0 : _c.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: showDropdown, setShowDropdown: setShowDropdown, onDropdownToggle: () => {
111
- setShowDropdown(!showDropdown);
112
- setAmenetiesAtomValue({
113
- service: serviceItem,
114
- showTopLabel: showTopLabel,
115
- });
121
+ React.createElement(BottomAmenitiesMobile, { isSoldOut: isSoldOut, amenitiesNodes: amenities(), hoursIcon: renderIcon("hours", "14px"), duration: (_c = serviceItem.duration) === null || _c === void 0 ? void 0 : _c.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),
122
+ // onDropdownToggle={() => {
123
+ // setShowDropdown(!showDropdown);
124
+ // setAmenetiesAtomValue({
125
+ // service: serviceItem,
126
+ // showTopLabel: showTopLabel,
127
+ // });
128
+ // }}
129
+ onDropdownToggle: () => {
130
+ setIsExpanded(isItemExpanded ? null : serviceItem.id);
116
131
  } })),
117
132
  (serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.offer_text) && (React.createElement("div", { className: ` text-white p-[10px_15px] text-left w-full flex items-center absolute -bottom-[35px] pt-[50px] z-10 rounded-b-[14px] min-[420]:text-[14px] text-[12px]`, style: {
118
133
  backgroundColor: isSoldOut ? "#ccc" : colors === null || colors === void 0 ? void 0 : colors.bottomStripColor,
@@ -123,6 +138,16 @@ function ServiceItemMobile({ serviceItem, onBookButtonPress, colors, busStage, o
123
138
  } },
124
139
  React.createElement(LottiePlayer, { animationData: serviceItem.icons.promoAnim, width: "18px", height: "18px" }),
125
140
  React.createElement("span", { className: "ml-[10px] text-[#fff] min-[380px]:text-[11px] text-[10px]" }, serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.offer_text))),
126
- React.createElement("div", { className: "absolute -top-[14px] left-0 w-full flex items-center justify-end gap-[12px] pr-[20px] z-10 " }))));
141
+ React.createElement("div", { className: "absolute -top-[14px] left-0 w-full flex items-center justify-end gap-[12px] pr-[20px] z-10 " })),
142
+ React.createElement("div", { style: {
143
+ display: "grid",
144
+ gridTemplateRows: isItemExpanded ? "1fr" : "0fr",
145
+ opacity: isItemExpanded ? 1 : 0,
146
+ transition: "grid-template-rows 0.3s ease-in-out, opacity 0.25s ease-in-out",
147
+ position: "relative",
148
+ zIndex: -1,
149
+ } },
150
+ React.createElement("div", { style: { overflow: "hidden", minHeight: 0, marginTop: "-10px" } },
151
+ React.createElement(ExpandedDropdownMobile, { serviceItem: serviceItem })))));
127
152
  }
128
153
  export default ServiceItemMobile;
@@ -121,6 +121,8 @@ export interface MobileServiceItemProps {
121
121
  terminals?: any[];
122
122
  showDropdown?: boolean;
123
123
  setShowDropdown?: (value: boolean) => void;
124
+ isExpanded?: string | null;
125
+ setIsExpanded?: (value: string | null) => void;
124
126
  setAmenetiesAtomValue?: (value: {
125
127
  service: MobileServiceItemProps["serviceItem"];
126
128
  showTopLabel: string | boolean;
package/dist/styles.css CHANGED
@@ -626,6 +626,9 @@
626
626
  .px-\[10px\] {
627
627
  padding-inline: 10px;
628
628
  }
629
+ .px-\[12px\] {
630
+ padding-inline: 12px;
631
+ }
629
632
  .px-\[14px\] {
630
633
  padding-inline: 14px;
631
634
  }
@@ -665,6 +668,9 @@
665
668
  .pt-\[20px\] {
666
669
  padding-top: 20px;
667
670
  }
671
+ .pt-\[22px\] {
672
+ padding-top: 22px;
673
+ }
668
674
  .pt-\[26px\] {
669
675
  padding-top: 26px;
670
676
  }
@@ -689,6 +695,9 @@
689
695
  .pb-\[10px\] {
690
696
  padding-bottom: 10px;
691
697
  }
698
+ .pb-\[12px\] {
699
+ padding-bottom: 12px;
700
+ }
692
701
  .pb-\[14px\] {
693
702
  padding-bottom: 14px;
694
703
  }
@@ -786,6 +795,10 @@
786
795
  .uppercase {
787
796
  text-transform: uppercase;
788
797
  }
798
+ .tabular-nums {
799
+ --tw-numeric-spacing: tabular-nums;
800
+ font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);
801
+ }
789
802
  .line-through {
790
803
  text-decoration-line: line-through;
791
804
  }
@@ -877,6 +890,11 @@
877
890
  font-size: 11px;
878
891
  }
879
892
  }
893
+ .min-\[420px\]\:text-\[12px\] {
894
+ @media (width >= 420px) {
895
+ font-size: 12px;
896
+ }
897
+ }
880
898
  @keyframes load8 {
881
899
  0% {
882
900
  transform: rotate(0deg);
@@ -962,6 +980,26 @@
962
980
  syntax: "*";
963
981
  inherits: false;
964
982
  }
983
+ @property --tw-ordinal {
984
+ syntax: "*";
985
+ inherits: false;
986
+ }
987
+ @property --tw-slashed-zero {
988
+ syntax: "*";
989
+ inherits: false;
990
+ }
991
+ @property --tw-numeric-figure {
992
+ syntax: "*";
993
+ inherits: false;
994
+ }
995
+ @property --tw-numeric-spacing {
996
+ syntax: "*";
997
+ inherits: false;
998
+ }
999
+ @property --tw-numeric-fraction {
1000
+ syntax: "*";
1001
+ inherits: false;
1002
+ }
965
1003
  @property --tw-blur {
966
1004
  syntax: "*";
967
1005
  inherits: false;
@@ -1043,6 +1081,11 @@
1043
1081
  --tw-border-style: solid;
1044
1082
  --tw-leading: initial;
1045
1083
  --tw-font-weight: initial;
1084
+ --tw-ordinal: initial;
1085
+ --tw-slashed-zero: initial;
1086
+ --tw-numeric-figure: initial;
1087
+ --tw-numeric-spacing: initial;
1088
+ --tw-numeric-fraction: initial;
1046
1089
  --tw-blur: initial;
1047
1090
  --tw-brightness: initial;
1048
1091
  --tw-contrast: initial;
@@ -18,6 +18,6 @@ function BottomAmenities({ otherItems, serviceItem, grayscaleClass, isSoldOut, i
18
18
  React.createElement(LottiePlayer, { animationData: getAnimationIcon("locationAnim"), width: "20px", height: "20px" }))),
19
19
  serviceItem.is_change_ticket && (React.createElement(FlexibleBlock, { translation: translation, getAnimationIcon: getAnimationIcon, colors: colors, serviceItem: serviceItem, isSoldOut: isSoldOut })),
20
20
  hasPetInfo && (React.createElement(PetBlock, { translation: translation, getAnimationIcon: getAnimationIcon, colors: colors, isSoldOut: isSoldOut })),
21
- showDownArrow ? (React.createElement("div", { className: `flex items-center cursor-pointer ml-[4px] transition-transform duration-300 w-[14px] h-[14px] ${isItemExpanded ? "rotate-180" : ""}`, onClick: onToggleExpand }, downArrowIcon)) : null)));
21
+ React.createElement("div", { className: `flex items-center cursor-pointer ml-[4px] transition-transform duration-300 w-[14px] h-[14px] `, onClick: onToggleExpand }, downArrowIcon))));
22
22
  }
23
23
  export default BottomAmenities;
@@ -6,15 +6,6 @@ interface ExpandedDropdownProps {
6
6
  is_change_ticket?: boolean;
7
7
  is_tracking_enabled?: boolean;
8
8
  };
9
- showPromo: boolean;
10
- colors: {
11
- priceColor?: string;
12
- };
13
- grayscaleClass: string;
14
- translation?: {
15
- [key: string]: string;
16
- };
17
- getAnimationIcon: (icon: string) => any;
18
9
  }
19
- declare function ExpandedDropdown({ serviceItem, showPromo, colors, grayscaleClass, translation, getAnimationIcon, }: ExpandedDropdownProps): React.ReactElement;
10
+ declare function ExpandedDropdown({ serviceItem, }: ExpandedDropdownProps): React.ReactElement;
20
11
  export default ExpandedDropdown;
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- function ExpandedDropdown({ serviceItem, showPromo, colors, grayscaleClass, translation, getAnimationIcon, }) {
2
+ function ExpandedDropdown({ serviceItem, }) {
3
3
  var _a, _b;
4
4
  const hasPetInfo = serviceItem.pet_seat_info &&
5
5
  Object.keys(serviceItem.pet_seat_info).length > 0;
@@ -1,10 +1,11 @@
1
1
  import React from "react";
2
- declare const RatingBlock: ({ showRating, serviceItem, isSoldOut, colors, t, translation, }: {
2
+ declare const RatingBlock: ({ showRating, serviceItem, isSoldOut, colors, t, translation, isPeru, }: {
3
3
  showRating: any;
4
4
  serviceItem: any;
5
5
  isSoldOut: any;
6
6
  colors: any;
7
7
  t: any;
8
8
  translation: any;
9
+ isPeru: any;
9
10
  }) => React.JSX.Element;
10
11
  export default RatingBlock;
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import RatingHover from "../components/ServiceItem/RatingHover";
3
- const RatingBlock = ({ showRating, serviceItem, isSoldOut, colors, t, translation, }) => (React.createElement("div", { className: "flex items-center whitespace-nowrap" },
4
- showRating && (React.createElement(RatingHover, { serviceItem: serviceItem, isSoldOut: isSoldOut, colors: colors, t: t, translation: translation })),
3
+ const RatingBlock = ({ showRating, serviceItem, isSoldOut, colors, t, translation, isPeru, }) => (React.createElement("div", { className: "flex items-center whitespace-nowrap" },
4
+ showRating && (React.createElement(RatingHover, { serviceItem: serviceItem, isSoldOut: isSoldOut, colors: colors, t: t, translation: translation, isPeru: isPeru })),
5
5
  React.createElement("div", { className: "group relative ml-[10px] text-[13.33px]", style: {
6
6
  marginLeft: showRating ? "10px" : "0",
7
7
  color: isSoldOut ? "#c0c0c0" : "#464647",
@@ -22,6 +22,13 @@ function getSortedSeatTypes(seatTypes) {
22
22
  seatTypesWithPrices[2] = seatTypesWithPrices[premiumIndex];
23
23
  }
24
24
  seatTypesWithPrices = seatTypesWithPrices.slice(0, 2);
25
+ const seenPrices = new Set();
26
+ seatTypesWithPrices = seatTypesWithPrices.filter((seat) => {
27
+ if (seenPrices.has(seat.price))
28
+ return false;
29
+ seenPrices.add(seat.price);
30
+ return true;
31
+ });
25
32
  return seatTypesWithPrices;
26
33
  }
27
34
  function getUniqueSeats(seatTypes) {
@@ -35,7 +42,14 @@ function getUniqueSeats(seatTypes) {
35
42
  seatMap.set(seat.label, seat);
36
43
  }
37
44
  });
38
- return Array.from(seatMap.values());
45
+ const uniqueByLabel = Array.from(seatMap.values());
46
+ const seenPrices = new Set();
47
+ return uniqueByLabel.filter((seat) => {
48
+ if (seenPrices.has(seat.price))
49
+ return false;
50
+ seenPrices.add(seat.price);
51
+ return true;
52
+ });
39
53
  }
40
54
  function getNumberOfSeats(seatTypes) {
41
55
  return seatTypes.filter((val) => !SEAT_EXCEPTIONS.includes(val.label)).length;
@@ -67,7 +81,11 @@ function SeatSection({ seatTypes, availableSeats, isSoldOut, priceColor, currenc
67
81
  const renderLabels = () => {
68
82
  if (isPeru) {
69
83
  return (React.createElement(React.Fragment, null,
70
- React.createElement("span", { className: "text-[13.33px]", style: { color: "#999" } }, "Antes"),
84
+ React.createElement("span", { className: "text-[13.33px]", style: {
85
+ color: "#999",
86
+ // position: "relative",
87
+ // bottom: numberOfSeats ? "10px" : "",
88
+ } }, "Antes"),
71
89
  React.createElement("span", { className: "text-[13.33px]" }, "Desde")));
72
90
  }
73
91
  return renderSeatNames();
@@ -43,11 +43,15 @@ function TopAmenities({ showPromo, showTopLabel, isSoldOut, priceColor, buttonCo
43
43
  borderTopLeftRadius: "10px",
44
44
  } },
45
45
  React.createElement("div", { style: { display: "flex", alignItems: "center" } },
46
- React.createElement(LottiePlayer, { animationData: getAnimationIcon("bombAnimation"), width: "16px", height: "16px" }),
46
+ React.createElement(LottiePlayer, { animationData: getAnimationIcon("bombAnimation"), width: "20px", height: "20px" }),
47
47
  React.createElement("span", { className: "flex items-center py-[10px] pl-[6px] text-white text-[13.33px] z-20", style: { paddingRight: showTopLabel ? "18px" : "" } },
48
48
  React.createElement("span", { className: "bold-text" }, "kuponazo 20%\u00A0"),
49
49
  " | Termina en\u00A0",
50
- React.createElement("span", { className: "bold-text", ref: startCountdown })))),
50
+ React.createElement("span", { className: "bold-text", ref: startCountdown, style: {
51
+ fontVariantNumeric: "tabular-nums",
52
+ display: "inline-block",
53
+ minWidth: "70px",
54
+ } })))),
51
55
  showTopLabel && (React.createElement("div", { className: "flex items-center py-[10px] px-[14px] text-[13.33px] z-20", style: {
52
56
  backgroundColor: isSoldOut ? "#ddd" : buttonColor,
53
57
  borderTopRightRadius: "10px",
@@ -18,6 +18,7 @@ interface BottomAmenitiesMobileProps {
18
18
  showDropdown: boolean;
19
19
  setShowDropdown: (val: boolean) => void;
20
20
  onDropdownToggle: () => void;
21
+ isItemExpanded?: boolean;
21
22
  }
22
- declare function BottomAmenitiesMobile({ isSoldOut, amenitiesNodes, hoursIcon, duration, isDirectTrip, directoColor, directoAnim, isChangeTicket, isPetSeat, petSeatInfo, petFriendlyAnim, flexibleAnim, isTrackingEnabled, locationAnim, downArrowIcon, showDropdown, setShowDropdown, onDropdownToggle, }: BottomAmenitiesMobileProps): React.ReactElement;
23
+ declare function BottomAmenitiesMobile({ isSoldOut, amenitiesNodes, hoursIcon, duration, isDirectTrip, directoColor, directoAnim, isChangeTicket, isPetSeat, petSeatInfo, petFriendlyAnim, flexibleAnim, isTrackingEnabled, locationAnim, downArrowIcon, showDropdown, setShowDropdown, onDropdownToggle, isItemExpanded, }: BottomAmenitiesMobileProps): React.ReactElement;
23
24
  export default BottomAmenitiesMobile;
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  import LottiePlayer from "../../assets/LottiePlayer";
3
- function BottomAmenitiesMobile({ isSoldOut, amenitiesNodes, hoursIcon, duration, isDirectTrip, directoColor, directoAnim, isChangeTicket, isPetSeat, petSeatInfo, petFriendlyAnim, flexibleAnim, isTrackingEnabled, locationAnim, downArrowIcon, showDropdown, setShowDropdown, onDropdownToggle, }) {
3
+ function BottomAmenitiesMobile({ isSoldOut, amenitiesNodes, hoursIcon, duration, isDirectTrip, directoColor, directoAnim, isChangeTicket, isPetSeat, petSeatInfo, petFriendlyAnim, flexibleAnim, isTrackingEnabled, locationAnim, downArrowIcon, showDropdown, setShowDropdown, onDropdownToggle, isItemExpanded, }) {
4
4
  return (React.createElement("div", { className: `${"flex justify-between items-center items-center "}` },
5
5
  React.createElement("div", { className: "w-[55%] flex justify-between items-center" },
6
6
  React.createElement("div", { style: { opacity: isSoldOut ? 0.5 : 1 } }, amenitiesNodes),
@@ -16,22 +16,22 @@ function BottomAmenitiesMobile({ isSoldOut, amenitiesNodes, hoursIcon, duration,
16
16
  } },
17
17
  React.createElement(LottiePlayer, { animationData: directoAnim, width: "14px", height: "14px" }),
18
18
  React.createElement("div", { className: "ml-[5px]" }, "Directo")))),
19
- React.createElement("div", null, (isChangeTicket || isPetSeat) && (React.createElement("div", { onClick: onDropdownToggle, className: "flex items-center" },
20
- petSeatInfo && Object.keys(petSeatInfo).length > 0 ? (React.createElement("div", { className: "flex items-center" },
21
- React.createElement("div", { className: `relative group cursor-default ` },
22
- React.createElement("div", { className: "flex items-center" },
23
- React.createElement("div", { className: `mr-[5px] ${isSoldOut ? "grayscale" : ""}` },
24
- React.createElement(LottiePlayer, { animationData: petFriendlyAnim, width: "16px", height: "16px" })))))) : null,
25
- isChangeTicket && (React.createElement("div", { className: "flex items-center" },
26
- React.createElement("div", { className: "relative group cursor-default" },
27
- React.createElement("div", { className: "flex items-center" },
28
- React.createElement("div", { className: `mr-[5px] ${isSoldOut ? "grayscale" : ""}` },
29
- React.createElement(LottiePlayer, { animationData: flexibleAnim, width: "16px", height: "16px" })))))),
30
- isTrackingEnabled && (React.createElement("div", { className: "flex items-center mr-[10px]" },
31
- React.createElement("div", { className: `h-auto mr-[4px] min-[420]:text-[13px] text-[11px] text-[#464647] ${isSoldOut ? "grayscale" : ""}` },
32
- React.createElement(LottiePlayer, { animationData: locationAnim, width: "16px", height: "16px" })))),
33
- (isChangeTicket || isPetSeat) && (
34
- // <img src={serviceItem.icons.plus} alt="icon" width={11} />
35
- React.createElement("img", { src: downArrowIcon, alt: "icon", width: 14, height: 14 })))))));
19
+ React.createElement("div", { className: "flex items-center" },
20
+ React.createElement("div", null, (isChangeTicket || isPetSeat) && (React.createElement("div", { className: "flex items-center" },
21
+ petSeatInfo && Object.keys(petSeatInfo).length > 0 ? (React.createElement("div", { className: "flex items-center" },
22
+ React.createElement("div", { className: `relative group cursor-default ` },
23
+ React.createElement("div", { className: "flex items-center" },
24
+ React.createElement("div", { className: `mr-[5px] ${isSoldOut ? "grayscale" : ""}` },
25
+ React.createElement(LottiePlayer, { animationData: petFriendlyAnim, width: "16px", height: "16px" })))))) : null,
26
+ isChangeTicket && (React.createElement("div", { className: "flex items-center" },
27
+ React.createElement("div", { className: "relative group cursor-default" },
28
+ React.createElement("div", { className: "flex items-center" },
29
+ React.createElement("div", { className: `mr-[5px] ${isSoldOut ? "grayscale" : ""}` },
30
+ React.createElement(LottiePlayer, { animationData: flexibleAnim, width: "16px", height: "16px" })))))),
31
+ isTrackingEnabled && (React.createElement("div", { className: "flex items-center mr-[10px]" },
32
+ React.createElement("div", { className: `h-auto mr-[4px] min-[420]:text-[13px] text-[11px] text-[#464647] ${isSoldOut ? "grayscale" : ""}` },
33
+ React.createElement(LottiePlayer, { animationData: locationAnim, width: "16px", height: "16px" }))))))),
34
+ React.createElement("div", { onClick: onDropdownToggle },
35
+ React.createElement("img", { src: downArrowIcon, alt: "icon", width: 14, height: 14, className: `${showDropdown ? "rotate-180" : ""} transition-transform duration-300` })))));
36
36
  }
37
37
  export default BottomAmenitiesMobile;
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ interface ExpandedDropdownMobileProps {
3
+ serviceItem: {
4
+ change_ticket_hours?: number;
5
+ pet_seat_info?: Record<string, any>;
6
+ is_change_ticket?: boolean;
7
+ is_tracking_enabled?: boolean;
8
+ };
9
+ }
10
+ declare function ExpandedDropdownMobile({ serviceItem, }: ExpandedDropdownMobileProps): React.ReactElement;
11
+ export default ExpandedDropdownMobile;
@@ -0,0 +1,32 @@
1
+ import React from "react";
2
+ function ExpandedDropdownMobile({ serviceItem, }) {
3
+ var _a, _b;
4
+ return (React.createElement("div", { className: "px-[12px] pt-[22px] pb-[12px] relative -z-9", style: {
5
+ backgroundColor: "#ffefef",
6
+ borderRadius: "0 0 14px 14px",
7
+ } },
8
+ React.createElement("div", { className: "flex flex-col gap-[8px] text-[11px] min-[420px]:text-[12px] text-[#464647]", style: { lineHeight: 1.6 } },
9
+ React.createElement("div", { className: "flex gap-[6px]" },
10
+ React.createElement("span", { style: { marginTop: "2px" } }, "\u2022"),
11
+ React.createElement("span", null,
12
+ React.createElement("span", { className: "bold-text" }, "Pol\u00EDticas de anulaci\u00F3n:"),
13
+ " Tu pasaje puede ser anulado de forma online",
14
+ " ",
15
+ React.createElement("span", { className: "bold-text" },
16
+ "hasta ", (_a = serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.change_ticket_hours) !== null && _a !== void 0 ? _a : 6,
17
+ " horas antes"),
18
+ " ",
19
+ "de la salida del bus. Al anular tu pasaje recibir\u00E1s una devoluci\u00F3n del 85% del monto de tu compra.")),
20
+ React.createElement("div", { className: "flex gap-[6px]" },
21
+ React.createElement("span", { style: { marginTop: "2px" } }, "\u2022"),
22
+ React.createElement("span", null,
23
+ React.createElement("span", { className: "bold-text" }, "Pol\u00EDticas de cambios:"),
24
+ " Tu pasaje puede ser cambiado de manera online",
25
+ " ",
26
+ React.createElement("span", { className: "bold-text" },
27
+ "hasta ", (_b = serviceItem === null || serviceItem === void 0 ? void 0 : serviceItem.change_ticket_hours) !== null && _b !== void 0 ? _b : 6,
28
+ " horas antes"),
29
+ " ",
30
+ "de la salida del bus. El monto ser\u00E1 reembolsado a tu billetera kupospay.")))));
31
+ }
32
+ export default ExpandedDropdownMobile;
@@ -5,6 +5,9 @@ interface TopAmenitieMobileProps {
5
5
  seatPriceColor?: string;
6
6
  bombAnim?: any;
7
7
  priorityStageAnim?: any;
8
+ countdownSeconds?: number;
9
+ promoText?: string;
10
+ onCountdownEnd?: () => void;
8
11
  }
9
- declare function TopAmenitieMobile({ showTopLabel, isSoldOut, seatPriceColor, bombAnim, priorityStageAnim, }: TopAmenitieMobileProps): React.ReactElement;
12
+ declare function TopAmenitieMobile({ showTopLabel, isSoldOut, seatPriceColor, bombAnim, priorityStageAnim, countdownSeconds, onCountdownEnd, }: TopAmenitieMobileProps): React.ReactElement;
10
13
  export default TopAmenitieMobile;