kupos-ui-components-lib 9.2.8 → 9.2.9

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.
@@ -34,15 +34,53 @@ import linatalDirectoAnimation from "../../assets/images/anims/service_list/dire
34
34
  import linatalPriorityStageAnimation from "../../assets/images/anims/service_list/priority_stage.json";
35
35
  import linatalPetFriendlyAnimation from "../../assets/images/anims/service_list/pet_friendly.json";
36
36
  import linatalLocationAnimation from "../../assets/images/anims/service_list/location.json";
37
+
38
+ import bombAnimation from "../../assets/images/anims/service_list/bomb.json";
39
+
37
40
  import StageTooltip from "../../ui/StagesTooltip";
38
41
  import RatingBlock from "../../ui/RatingBlock";
39
42
  import DurationBlock from "../../ui/DurationBlock";
40
43
  import PetBlock from "../../ui/PetBlock";
41
44
  import FlexibleBlock from "../../ui/FlexibleBlock";
42
45
  import AmenitiesBlock from "../../ui/AmenitiesBlock";
46
+ import SeatSection from "../../ui/SeatSection/SeatSection";
47
+ import KuposButton from "../../ui/KuposButton/KuposButton";
48
+ import BottomAmenities from "../../ui/BottomAmenities/BottomAmenities";
43
49
 
44
50
  const SEAT_EXCEPTIONS = ["Asiento mascota"];
45
51
 
52
+ const ANIMATION_MAP: Record<string, Record<string, any>> = {
53
+ promoAnim: {
54
+ kupos: promoAnimation,
55
+ },
56
+ locationAnim: {
57
+ kupos: locationAnimation,
58
+ pullman: pullmanLocationAnimation,
59
+ opsites: opsitesLocationAnimation,
60
+ },
61
+ directoAnim: {
62
+ kupos: directoAnimation,
63
+ },
64
+ petFriendlyAnim: {
65
+ kupos: petFriendlyAnimation,
66
+ pullman: pullmanPetFriendlyAnimation,
67
+ opsites: opsitesPetFriendlyAnimation,
68
+ },
69
+ priorityStageAnim: {
70
+ kupos: priorityStageAnimation,
71
+ pullman: pullmanPriorityStageAnimation,
72
+ opsites: opsitesPriorityStageAnimation,
73
+ },
74
+ flexibleIcon: {
75
+ kupos: flexibleAnimation,
76
+ pullman: pullmanFlexibleAnimation,
77
+ opsites: opsitesFlexibleAnimation,
78
+ },
79
+ bombAnimation: {
80
+ kupos: bombAnimation,
81
+ },
82
+ };
83
+
46
84
  function PeruServiceItemDesktop({
47
85
  serviceItem,
48
86
  onBookButtonPress,
@@ -67,52 +105,39 @@ function PeruServiceItemDesktop({
67
105
  isPeru,
68
106
  siteType,
69
107
  isAllinBus,
108
+ viewersConfig,
109
+ isExpand,
110
+ setIsExpand,
111
+ coachKey,
70
112
  t = (key: string) => key,
71
113
  }: ServiceItemProps & { currencySign?: string }): React.ReactElement {
72
- const animationMap: Record<string, Record<string, any>> = {
73
- promoAnim: {
74
- kupos: promoAnimation,
75
- pullman: pullmanPromoAnimation,
76
- opsites: opsitesPromoAnimation,
77
- linatal: linatalPromoAnimation,
78
- },
79
- locationAnim: {
80
- kupos: locationAnimation,
81
- pullman: pullmanLocationAnimation,
82
- opsites: opsitesLocationAnimation,
83
- linatal: linatalLocationAnimation,
84
- },
85
- directoAnim: {
86
- kupos: directoAnimation,
87
- pullman: pullmanDirectoAnimation,
88
- opsites: opsitesDirectoAnimation,
89
- linatal: linatalDirectoAnimation,
90
- },
91
- petFriendlyAnim: {
92
- kupos: petFriendlyAnimation,
93
- pullman: pullmanPetFriendlyAnimation,
94
- opsites: opsitesPetFriendlyAnimation,
95
- linatal: linatalPetFriendlyAnimation,
96
- },
97
- priorityStageAnim: {
98
- kupos: priorityStageAnimation,
99
- pullman: pullmanPriorityStageAnimation,
100
- opsites: opsitesPriorityStageAnimation,
101
- linatal: linatalPriorityStageAnimation,
102
- },
103
- flexibleIcon: {
104
- kupos: flexibleAnimation,
105
- pullman: pullmanFlexibleAnimation,
106
- opsites: opsitesFlexibleAnimation,
107
- linatal: linatalFlexibleAnimation,
108
- },
114
+ const startViewerCount = (node: HTMLSpanElement | null) => {
115
+ if (!node || !viewersConfig) return;
116
+
117
+ const prevId = node.dataset.viewerId;
118
+ if (prevId) clearInterval(Number(prevId));
119
+
120
+ const { min, max, interval = 5000 } = viewersConfig;
121
+ const clamp = (v: number) => Math.min(max, Math.max(min, v));
122
+ const initialValue = Math.floor(Math.random() * (max - min + 1)) + min;
123
+
124
+ node.textContent = String(initialValue);
125
+
126
+ const id = setInterval(() => {
127
+ const current = Number(node.textContent) || initialValue;
128
+ const delta = Math.ceil(current * 0.2);
129
+ const next =
130
+ current + Math.floor(Math.random() * (2 * delta + 1)) - delta;
131
+ node.textContent = String(clamp(Math.round(next)));
132
+ }, interval);
133
+
134
+ node.dataset.viewerId = String(id);
109
135
  };
110
136
 
111
137
  const getAnimationIcon = (icon: string) => {
112
- const animation = animationMap[icon];
138
+ const animation = ANIMATION_MAP[icon];
113
139
  if (!animation) return null;
114
- const currentSiteType = siteType || "kupos";
115
- return animation[currentSiteType];
140
+ return animation[siteType] ?? animation.kupos;
116
141
  };
117
142
  const SvgAmenities = ({
118
143
  moreAnemities,
@@ -450,26 +475,56 @@ function PeruServiceItemDesktop({
450
475
  ? extractStage(serviceItem.stage_details_arr, 1)
451
476
  : null;
452
477
 
478
+ const countdownSeconds = 599;
479
+
480
+ const startCountdown = (node: HTMLSpanElement | null) => {
481
+ if (!node) return;
482
+
483
+ const prevId = node.dataset.countdownId;
484
+ if (prevId) clearInterval(Number(prevId));
485
+
486
+ let remaining = countdownSeconds;
487
+
488
+ const formatTime = (totalSecs: number) => {
489
+ const m = Math.floor(totalSecs / 60);
490
+ const s = totalSecs % 60;
491
+ return `${String(m).padStart(2, "0")}:${String(s).padStart(2, "0")}`;
492
+ };
493
+
494
+ node.textContent = formatTime(remaining);
495
+
496
+ const id = setInterval(() => {
497
+ remaining -= 1;
498
+ if (remaining <= 0) {
499
+ remaining = countdownSeconds;
500
+ }
501
+ node.textContent = formatTime(remaining);
502
+ }, 1000);
503
+
504
+ node.dataset.countdownId = String(id);
505
+ };
506
+
453
507
  const items = [
454
508
  {
455
- key: "rating",
456
- width: "30%",
509
+ key: "amenities",
510
+ width: "20%",
511
+ condition: true,
457
512
  render: (
458
- <RatingBlock
459
- showRating={showRating}
513
+ <AmenitiesBlock
460
514
  serviceItem={serviceItem}
515
+ metaData={metaData}
461
516
  isSoldOut={isSoldOut}
462
517
  colors={colors}
463
- t={t}
464
- translation={translation}
518
+ getAnimationIcon={getAnimationIcon}
519
+ getAmenityName={CommonService.getAmenityName}
520
+ SvgAmenities={SvgAmenities}
465
521
  isPeru={isPeru}
466
522
  />
467
523
  ),
468
524
  },
469
-
470
525
  {
471
526
  key: "duration",
472
- width: "20%",
527
+ width: "12%",
473
528
  condition: serviceItem.duration,
474
529
  render: (
475
530
  <DurationBlock
@@ -482,6 +537,20 @@ function PeruServiceItemDesktop({
482
537
  ),
483
538
  },
484
539
 
540
+ // {
541
+ // key: "directo",
542
+ // width: "12%",
543
+ // condition: serviceItem?.is_direct_trip === true,
544
+ // render: (
545
+ // <DirectoBlock
546
+ // translation={translation}
547
+ // getAnimationIcon={getAnimationIcon}
548
+ // colors={colors}
549
+ // isSoldOut={isSoldOut}
550
+ // />
551
+ // ),
552
+ // },
553
+
485
554
  {
486
555
  key: "pet",
487
556
  width: "20%",
@@ -501,7 +570,7 @@ function PeruServiceItemDesktop({
501
570
  {
502
571
  key: "flexible",
503
572
  width: "20%",
504
- condition: false,
573
+ condition: serviceItem.is_change_ticket === true,
505
574
  render: (
506
575
  <FlexibleBlock
507
576
  translation={translation}
@@ -512,30 +581,101 @@ function PeruServiceItemDesktop({
512
581
  />
513
582
  ),
514
583
  },
515
-
516
- {
517
- key: "amenities",
518
- width: "20%",
519
- render: (
520
- <AmenitiesBlock
521
- serviceItem={serviceItem}
522
- metaData={metaData}
523
- isSoldOut={isSoldOut}
524
- colors={colors}
525
- isPeru={isPeru}
526
- getAnimationIcon={getAnimationIcon}
527
- getAmenityName={CommonService.getAmenityName}
528
- SvgAmenities={SvgAmenities}
529
- />
530
- ),
531
- },
532
584
  ];
533
585
 
534
- const amenitiesItem = items.find((i) => i.key === "amenities");
535
586
  const otherItems = items.filter(
536
- (i) => i.key !== "amenities" && i.condition !== false,
587
+ (i) => i.key !== "pet" && i.key !== "flexible" && !!i.condition,
537
588
  );
538
589
 
590
+ const isItemExpanded = serviceItem.id === isExpand || isExpand === true;
591
+ const grayscaleClass = isSoldOut ? "grayscale" : "";
592
+
593
+ // const items = [
594
+ // {
595
+ // key: "rating",
596
+ // width: "30%",
597
+ // render: (
598
+ // <RatingBlock
599
+ // showRating={showRating}
600
+ // serviceItem={serviceItem}
601
+ // isSoldOut={isSoldOut}
602
+ // colors={colors}
603
+ // t={t}
604
+ // translation={translation}
605
+ // isPeru={isPeru}
606
+ // />
607
+ // ),
608
+ // },
609
+
610
+ // {
611
+ // key: "duration",
612
+ // width: "20%",
613
+ // condition: serviceItem.duration,
614
+ // render: (
615
+ // <DurationBlock
616
+ // serviceItem={serviceItem}
617
+ // translation={translation}
618
+ // renderIcon={renderIcon}
619
+ // isSoldOut={isSoldOut}
620
+ // colors={colors}
621
+ // />
622
+ // ),
623
+ // },
624
+
625
+ // {
626
+ // key: "pet",
627
+ // width: "20%",
628
+ // condition:
629
+ // serviceItem.pet_seat_info &&
630
+ // Object.keys(serviceItem.pet_seat_info).length > 0,
631
+ // render: (
632
+ // <PetBlock
633
+ // translation={translation}
634
+ // getAnimationIcon={getAnimationIcon}
635
+ // colors={colors}
636
+ // isSoldOut={isSoldOut}
637
+ // />
638
+ // ),
639
+ // },
640
+
641
+ // {
642
+ // key: "flexible",
643
+ // width: "20%",
644
+ // condition: false,
645
+ // render: (
646
+ // <FlexibleBlock
647
+ // translation={translation}
648
+ // getAnimationIcon={getAnimationIcon}
649
+ // colors={colors}
650
+ // serviceItem={serviceItem}
651
+ // isSoldOut={isSoldOut}
652
+ // />
653
+ // ),
654
+ // },
655
+
656
+ // {
657
+ // key: "amenities",
658
+ // width: "20%",
659
+ // render: (
660
+ // <AmenitiesBlock
661
+ // serviceItem={serviceItem}
662
+ // metaData={metaData}
663
+ // isSoldOut={isSoldOut}
664
+ // colors={colors}
665
+ // isPeru={isPeru}
666
+ // getAnimationIcon={getAnimationIcon}
667
+ // getAmenityName={CommonService.getAmenityName}
668
+ // SvgAmenities={SvgAmenities}
669
+ // />
670
+ // ),
671
+ // },
672
+ // ];
673
+
674
+ // const amenitiesItem = items.find((i) => i.key === "amenities");
675
+ // const otherItems = items.filter(
676
+ // (i) => i.key !== "amenities" && i.condition !== false,
677
+ // );
678
+
539
679
  return (
540
680
  <div
541
681
  className={`relative ${
@@ -549,9 +689,15 @@ function PeruServiceItemDesktop({
549
689
  } `}
550
690
  >
551
691
  <div
552
- className={"bg-white rounded-[20px] shadow-service mx-auto relative"}
692
+ id={`service-card-${serviceItem.id}`}
693
+ className="bg-white mx-auto relative rounded-[10px] border border-[#ccc]"
553
694
  >
554
- <div className="p-[15px] pt-[20px]">
695
+ <div
696
+ className=" pt-[20px]"
697
+ style={{
698
+ padding: coachKey ? "15px 15px 20px 15px" : "20px 15px 11px 15px",
699
+ }}
700
+ >
555
701
  {/* Header with operator info and favorite */}
556
702
  {/* <div className="flex justify-between items-center mb-[15px]">
557
703
  <div className="flex items-center justify-between w-[250px]">
@@ -579,10 +725,48 @@ function PeruServiceItemDesktop({
579
725
  {/* <div className="grid grid-cols-[1.5fr_1fr_auto] gap-[3rem] sm:gap-[4rem] md:gap-[5rem] lg:gap-[6rem] xl:gap-[5rem] 2xl:gap-[7rem] text-[#464647]"> */}
580
726
  <div
581
727
  className="grid text-[#464647] w-full [grid-template-columns:14%_40%_0.5%_24%_13.5%] gap-x-[2%] items-center"
582
- style={{ marginTop: showTopLabel ? "8px" : "" }}
728
+ // style={{ marginTop: showTopLabel ? "8px" : "" }}
729
+ style={{
730
+ marginTop:
731
+ showTopLabel || serviceItem?.is_direct_trip ? "8px" : "",
732
+ }}
583
733
  >
584
734
  {/* OPERATOR LOGO */}
585
- <div className="flex items-center justify-center m-[auto]">
735
+ <div
736
+ style={{
737
+ display: "flex",
738
+ flexDirection: "column",
739
+ // gap: "5px",
740
+ }}
741
+ >
742
+ <div
743
+ // className="flex items-center justify-center m-[auto]"
744
+ className=""
745
+ >
746
+ <img
747
+ src={serviceItem.operator_details[0]}
748
+ alt="service logo"
749
+ className={`h-[30px] w-[auto] ${
750
+ isSoldOut ? "grayscale" : ""
751
+ }`}
752
+ />
753
+ {isCiva ? (
754
+ <div className="text-[13.33px] black-text ml-2">
755
+ {serviceItem.operator_details[2]}
756
+ </div>
757
+ ) : null}
758
+ </div>
759
+ <RatingBlock
760
+ showRating={showRating}
761
+ serviceItem={serviceItem}
762
+ isSoldOut={isSoldOut}
763
+ colors={colors}
764
+ t={t}
765
+ translation={translation}
766
+ isPeru={isPeru}
767
+ />
768
+ </div>
769
+ {/* <div className="flex items-center justify-center m-[auto]">
586
770
  <div className=" ">
587
771
  <img
588
772
  src={serviceItem.operator_details[0]}
@@ -597,7 +781,7 @@ function PeruServiceItemDesktop({
597
781
  {serviceItem.operator_details[2]}
598
782
  </div>
599
783
  ) : null}
600
- </div>
784
+ </div> */}
601
785
 
602
786
  {/* DATE AND TIME - Grid Layout */}
603
787
  <div
@@ -609,7 +793,7 @@ function PeruServiceItemDesktop({
609
793
  }}
610
794
  >
611
795
  {/* ICONS COLUMN */}
612
- <div className="flex flex-col gap-[10px]">
796
+ <div className="flex flex-col gap-[4px]">
613
797
  {/* Origin Icon */}
614
798
  {orignLabel ? (
615
799
  <div className="w-[60px] h-[20px] flex items-center bold-text">
@@ -647,7 +831,7 @@ function PeruServiceItemDesktop({
647
831
  </div>
648
832
 
649
833
  {/* DATES COLUMN */}
650
- <div className="flex flex-col gap-[10px]">
834
+ <div className="flex flex-col gap-[4px]">
651
835
  {/* Departure Date */}
652
836
  <StageTooltip
653
837
  stageData={serviceItem.boarding_stages}
@@ -680,7 +864,7 @@ function PeruServiceItemDesktop({
680
864
  </div>
681
865
 
682
866
  {/* DOTS COLUMN */}
683
- <div className="flex flex-col gap-[10px] items-center">
867
+ <div className="flex flex-col gap-[4px] items-center">
684
868
  {/* Departure Dot */}
685
869
  <div className="h-[20px] flex items-center justify-center">
686
870
  <div>•</div>
@@ -697,7 +881,7 @@ function PeruServiceItemDesktop({
697
881
  </div>
698
882
 
699
883
  {/* TIMES COLUMN */}
700
- <div className="flex flex-col gap-[10px]">
884
+ <div className="flex flex-col gap-[4px]">
701
885
  {/* Departure Time */}
702
886
  <StageTooltip
703
887
  stageData={serviceItem.dropoff_stages}
@@ -743,6 +927,18 @@ function PeruServiceItemDesktop({
743
927
  ></div>
744
928
  {/* SEATS */}
745
929
  <div className="content-center">
930
+ <SeatSection
931
+ seatTypes={serviceItem.seat_types}
932
+ serviceItem={serviceItem}
933
+ availableSeats={serviceItem.available_seats}
934
+ isSoldOut={isSoldOut}
935
+ priceColor={colors.priceColor}
936
+ currencySign={currencySign}
937
+ removeDuplicateSeats={removeDuplicateSeats}
938
+ isPeru={isPeru}
939
+ />
940
+ </div>
941
+ {/* <div className="content-center">
746
942
  <div
747
943
  className={`relative flex gap-[10px] text-[13.33px] justify-between min-h-[2.5rem] ${
748
944
  getNumberOfSeats() < 3 ? "" : ""
@@ -784,10 +980,38 @@ function PeruServiceItemDesktop({
784
980
  {getSeatPrice()}
785
981
  </div>
786
982
  </div>
787
- </div>
983
+ </div> */}
788
984
 
789
985
  {/* BUTTON */}
790
986
  <div>
987
+ {showLastSeats ? (
988
+ <div
989
+ className="flex justify-end mr-[11px] "
990
+ style={{
991
+ position: "absolute",
992
+ top: serviceDetailsLoading ? "7px" : "5px",
993
+ right: "16px",
994
+ }}
995
+ >
996
+ {serviceItem?.available_seats < 10 &&
997
+ serviceItem?.available_seats > 0 && (
998
+ <div className="text-[12px] text-[#464647] mt-1 text-center">
999
+ ¡Últimos Asientos!
1000
+ </div>
1001
+ )}
1002
+ </div>
1003
+ ) : null}
1004
+ <KuposButton
1005
+ isSoldOut={isSoldOut}
1006
+ isLoading={serviceDetailsLoading}
1007
+ buttonColor={colors.kuposButtonColor}
1008
+ buyLabel={translation?.buyButton}
1009
+ soldOutLabel={translation?.soldOutButton}
1010
+ soldOutIcon={renderIcon("soldOutIcon", "14px")}
1011
+ onClick={checkMidnight}
1012
+ />
1013
+ </div>
1014
+ {/* <div>
791
1015
  <button
792
1016
  onClick={() => (!isSoldOut ? checkMidnight() : null)}
793
1017
  disabled={serviceDetailsLoading}
@@ -817,9 +1041,24 @@ function PeruServiceItemDesktop({
817
1041
  )}
818
1042
  </span>
819
1043
  </button>
820
- </div>
1044
+ </div> */}
821
1045
  </div>
822
- {showLastSeats ? (
1046
+ <BottomAmenities
1047
+ otherItems={otherItems}
1048
+ serviceItem={serviceItem}
1049
+ grayscaleClass={grayscaleClass}
1050
+ isSoldOut={isSoldOut}
1051
+ isItemExpanded={isItemExpanded}
1052
+ colors={colors}
1053
+ translation={translation}
1054
+ getAnimationIcon={getAnimationIcon}
1055
+ downArrowIcon={renderIcon("downArrow", "10px")}
1056
+ onToggleExpand={() =>
1057
+ setIsExpand && setIsExpand(isItemExpanded ? null : serviceItem.id)
1058
+ }
1059
+ isPeru={isPeru}
1060
+ />
1061
+ {/* {showLastSeats ? (
823
1062
  <div className="flex justify-end mr-[11px]">
824
1063
  {serviceItem?.available_seats < 10 &&
825
1064
  serviceItem?.available_seats > 0 && (
@@ -828,18 +1067,13 @@ function PeruServiceItemDesktop({
828
1067
  </div>
829
1068
  )}
830
1069
  </div>
831
- ) : null}
832
-
1070
+ ) : null} */}
1071
+ {/*
833
1072
  <div className="flex items-center mt-[15px] border-t border-[#eee] pt-[10px]">
834
- {/* 🔹 LEFT SIDE (GRID ITEMS) */}
835
1073
  <div
836
1074
  className="grid items-center gap-[2%] flex-1"
837
1075
  style={{
838
1076
  gridTemplateColumns: "30% 18% 23% 23%",
839
-
840
- // otherItems
841
- // .map((i) => i.width)
842
- // .join(" "),
843
1077
  }}
844
1078
  >
845
1079
  {otherItems.map((item) => (
@@ -849,17 +1083,16 @@ function PeruServiceItemDesktop({
849
1083
  ))}
850
1084
  </div>
851
1085
 
852
- {/* 🔹 RIGHT SIDE (ALWAYS END) */}
853
1086
  <div className="flex items-center ml-[12px] shrink-0 w-[130px] justify-end">
854
1087
  {amenitiesItem?.render}
855
1088
  </div>
856
- </div>
1089
+ </div> */}
857
1090
  </div>
858
1091
  </div>
859
1092
 
860
1093
  {children}
861
1094
  {/* Bottom discount banner */}
862
- {serviceItem?.offer_text && (
1095
+ {/* {serviceItem?.offer_text && (
863
1096
  <div
864
1097
  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]`}
865
1098
  style={{
@@ -877,6 +1110,84 @@ function PeruServiceItemDesktop({
877
1110
  />
878
1111
  <span className="ml-[10px]">{serviceItem?.offer_text}</span>
879
1112
  </div>
1113
+ )} */}
1114
+
1115
+ {serviceItem?.offer_text && (
1116
+ <div
1117
+ 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]"
1118
+ style={{
1119
+ backgroundColor: colors?.bottomStripColor,
1120
+ opacity: isSoldOut ? 0.5 : 1,
1121
+ }}
1122
+ >
1123
+ {/* <div className="flex justify-between items-center w-full">
1124
+ <div className="flex items-center">
1125
+ <LottiePlayer
1126
+ animationData={getAnimationIcon("bombAnimation")}
1127
+ width="18px"
1128
+ height="18px"
1129
+ />
1130
+ <span className="bold-text ml-[8px]">
1131
+ {" "}
1132
+ {serviceItem?.offer_text || ""}
1133
+ </span>
1134
+ </div>
1135
+ <div>
1136
+ Termina en&nbsp;
1137
+ <span
1138
+ className="bold-text text-end"
1139
+ ref={startCountdown}
1140
+ style={{
1141
+ fontVariantNumeric: "tabular-nums",
1142
+ display: "inline-block",
1143
+ // minWidth: "70px",
1144
+ }}
1145
+ />
1146
+ </div>
1147
+ </div> */}
1148
+ <div className="flex justify-between items-center w-full">
1149
+ <div className="flex items-center ">
1150
+ <div className="flex items-center">
1151
+ <LottiePlayer
1152
+ animationData={getAnimationIcon("bombAnimation")}
1153
+ width="18px"
1154
+ height="18px"
1155
+ />
1156
+ <div className="flex items-center mt-[2px]">
1157
+ <span className="bold-text ml-[6px]">
1158
+ {serviceItem?.offer_text || ""}&nbsp;
1159
+ </span>{" "}
1160
+ | Termina en&nbsp;
1161
+ <span
1162
+ className="bold-text text-end"
1163
+ ref={startCountdown}
1164
+ style={{
1165
+ fontVariantNumeric: "tabular-nums",
1166
+ display: "inline-block",
1167
+ // minWidth: "70px",
1168
+ }}
1169
+ />
1170
+ </div>
1171
+ </div>
1172
+ </div>
1173
+ <div className="flex items-center">
1174
+ {renderIcon("personIcon", "16px")}
1175
+ &nbsp;
1176
+ <span className="ml-[6px]">
1177
+ <span
1178
+ className="bold-text"
1179
+ ref={startViewerCount}
1180
+ style={{ fontVariantNumeric: "tabular-nums" }}
1181
+ />{" "}
1182
+ <span className="bold-text">personas</span>{" "}
1183
+ <span>
1184
+ {" "}
1185
+ {viewersConfig?.label || " están viendo este viaje"}
1186
+ </span>
1187
+ </span>
1188
+ </div>
1189
+ </div>
1190
+ </div>
880
1191
  )}
881
1192
 
882
1193
  <div className="absolute -top-[11px] left-0 w-full flex items-center justify-end gap-[12px] pr-[15px] z-10 ">
@@ -961,11 +1272,12 @@ function PeruServiceItemDesktop({
961
1272
  backgroundColor: isSoldOut ? "#ddd" : colors.tooltipColor,
962
1273
  }}
963
1274
  >
964
- <LottiePlayer
1275
+ {renderIcon("connectingServiceIcon", "12px")}
1276
+ {/* <LottiePlayer
965
1277
  animationData={serviceItem.icons.connectingServiceIcon}
966
1278
  width="14px"
967
1279
  height="14px"
968
- />
1280
+ /> */}
969
1281
  <div>{"Conexión"}</div>
970
1282
  </div>
971
1283
  )}