kupos-ui-components-lib 9.7.4 → 9.7.5

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 (29) hide show
  1. package/dist/KuposUIComponent.d.ts +0 -3
  2. package/dist/components/ServiceItem/ServiceItemDesktop.d.ts +1 -1
  3. package/dist/components/ServiceItem/ServiceItemDesktop.js +2 -15
  4. package/dist/components/ServiceItem/ServiceItemMobile.d.ts +1 -1
  5. package/dist/components/ServiceItem/ServiceItemMobile.js +7 -16
  6. package/dist/components/ServiceItem/mobileTypes.d.ts +3 -28
  7. package/dist/components/ServiceItem/types.d.ts +0 -18
  8. package/dist/styles.css +6 -165
  9. package/dist/types.d.ts +3 -0
  10. package/dist/ui/ExpendedDropDown/ExpandedDropdown.js +6 -13
  11. package/dist/ui/FeaturServiceUiMobile/FeatureServiceUiMobile.js +101 -31
  12. package/dist/ui/SeatSection/SeatSection.js +1 -1
  13. package/dist/ui/mobileweb/ExpandedDropdownMobile.js +6 -15
  14. package/dist/utils/CommonService.js +1 -11
  15. package/package.json +1 -1
  16. package/src/KuposUIComponent.tsx +0 -3
  17. package/src/components/ServiceItem/ServiceItemDesktop.tsx +0 -42
  18. package/src/components/ServiceItem/ServiceItemMobile.tsx +286 -332
  19. package/src/components/ServiceItem/mobileTypes.ts +4 -24
  20. package/src/components/ServiceItem/types.ts +0 -19
  21. package/src/types.ts +3 -0
  22. package/src/ui/ExpendedDropDown/ExpandedDropdown.tsx +11 -25
  23. package/src/ui/SeatSection/SeatSection.tsx +1 -1
  24. package/src/ui/mobileweb/ExpandedDropdownMobile.tsx +14 -34
  25. package/src/utils/CommonService.ts +1 -13
  26. package/src/assets/images/anims/service_list/thunder_icon.json +0 -1
  27. package/src/assets/images/anims/service_list/users_anim.json +0 -1
  28. package/src/ui/FeaturServiceUiMobile/FeatureServiceUiMobile.tsx +0 -1021
  29. package/src/ui/FeatureServiceUI/FeatureServiceUi.tsx +0 -480
@@ -1,1021 +0,0 @@
1
- import React from "react";
2
- import LottiePlayer from "../../assets/LottiePlayer";
3
- import commonService from "../../utils/CommonService";
4
-
5
- const HARDCODED_OPERATORS = [
6
- {
7
- logo: "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Turbus_logo.svg/320px-Turbus_logo.svg.png",
8
- name: "Turbus",
9
- time: "7:00 am",
10
- seatsAvailable: "3 disponibles",
11
- },
12
- {
13
- logo: "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Pullman_Bus_logo.svg/320px-Pullman_Bus_logo.svg.png",
14
- name: "Pullmanbus",
15
- time: "8:00 am",
16
- seatsAvailable: "5 disponibles",
17
- },
18
- {
19
- logo: "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Turbus_logo.svg/320px-Turbus_logo.svg.png",
20
- name: "Expreso Santa C...",
21
- time: "9:00 am",
22
- seatsAvailable: "3 disponibles",
23
- },
24
- ];
25
-
26
- const FeatureServiceUiMobile = ({
27
- serviceItem,
28
- showTopLabel,
29
- colors,
30
- isSoldOut,
31
- cityOrigin,
32
- cityDestination,
33
- renderIcon,
34
- viewersConfig,
35
- isFeatureDropDownExpand,
36
- onToggleExpand,
37
- ticketQuantity = 1,
38
- onIncreaseTicketQuantity,
39
- onDecreaseTicketQuantity,
40
- onBookButtonPress,
41
- }) => {
42
- const operators =
43
- serviceItem?.operators?.length > 0
44
- ? serviceItem.operators
45
- : HARDCODED_OPERATORS;
46
-
47
- const isItemExpanded =
48
- serviceItem.id === isFeatureDropDownExpand ||
49
- isFeatureDropDownExpand === true;
50
- const canDecreaseTicketQuantity = ticketQuantity > 1;
51
-
52
- const HOW_IT_WORKS_STEPS = [
53
- {
54
- icon: "flexible",
55
- name: "1. Salida flexible",
56
- text: "Viajas en un horario entre las 07:00 y las 10:00 AM del día elegido.",
57
- },
58
- {
59
- icon: "bus",
60
- name: "2. Empresa asignada",
61
- text: "Una de las empresas confirmará tu viaje al instante tras el pago.",
62
- },
63
- {
64
- icon: "price",
65
- name: "3. Precio garantizado",
66
- text: "Mejor precio garantizado. Sin cambios ni cancelación.",
67
- },
68
- {
69
- icon: "ticket",
70
- name: "4. ¡Listo!",
71
- text: "Recibe todos los detalles de tu viaje al instante tras la compra.",
72
- },
73
- ];
74
-
75
- const FeatureStepIcon = ({ icon }) => {
76
- switch (icon) {
77
- case "flexible":
78
- return renderIcon("flexibleIcon", "20px");
79
- case "bus":
80
- return renderIcon("empressaIcon", "20px");
81
- case "price":
82
- return renderIcon("precioIcon", "20px");
83
- default:
84
- return renderIcon("listoIcon", "20px");
85
- }
86
- };
87
-
88
- return (
89
- <div
90
- // ${
91
- // serviceItem.offer_text ? "mb-[55px]" : "mb-[10px]"
92
- // }
93
- className={`relative mb-[10px]
94
- ${
95
- serviceItem?.is_direct_trip ||
96
- serviceItem?.train_type_label === "Tren Express (Nuevo)" ||
97
- showTopLabel
98
- ? "mt-[24px]"
99
- : "mt-[20px]"
100
- }`}
101
- >
102
- <div
103
- className="shadow-service"
104
- style={{
105
- // border: "1px solid #c0c0c0",
106
- padding: "12px",
107
- borderRadius: "14px",
108
- }}
109
- >
110
- <div className="flex flex-col items-center px-[12px] pb-[8px] text-[13.33px] gap-[8px]">
111
- <div>
112
- <span className="flex items-center">
113
- <img
114
- src={serviceItem?.icons?.fireIcon}
115
- alt="fire"
116
- className="h-[14px] w-[14px] mr-[4px]"
117
- />
118
- <span className="bold-text">Remate</span> términa en{" "}
119
- <span
120
- className="bold-text text-end"
121
- ref={(node) => commonService.startCountdown(node, 599)}
122
- style={{
123
- fontVariantNumeric: "tabular-nums",
124
- display: "inline-block",
125
- color: "#FF5C60",
126
- minWidth: "40px",
127
- }}
128
- />
129
- </span>
130
- </div>
131
- <div className="flex items-center gap-[10px]">
132
- <span>Salida flexible</span>
133
- <div
134
- className="bold-text font-[9px]"
135
- style={{
136
- backgroundColor: "#FF5C60",
137
- padding: "1px 8px",
138
- borderRadius: "4px",
139
- color: "#fff",
140
- animation: "pulse-zoom 2s ease-in-out infinite",
141
- whiteSpace: "nowrap",
142
- }}
143
- >
144
- <span>AHORRAS 60%</span>
145
- </div>
146
- </div>
147
- </div>
148
- <div
149
- id={`service-card-${serviceItem.id}`}
150
- className="bg-[#0C1421] text-white mx-auto relative rounded-[14px] p-[14px] text-[13.33px]"
151
- >
152
- <div className="flex flex-col gap-[10px]">
153
- <div className=" text-[white]">
154
- <div className="flex flex-col gap-[10px] relative">
155
- <div className="flex items-center gap-[6px]">
156
- <img
157
- src={serviceItem.icons?.whiteOrigin}
158
- alt="origin"
159
- className={`w-[14px] h-[14px] shrink-0 ${
160
- isSoldOut ? "grayscale" : ""
161
- }`}
162
- />
163
- <span className="text-[13px] bold-text">
164
- {cityOrigin?.label.split(",")[0]}
165
- <span className="mx-[6px]">→</span>
166
- {cityDestination?.label.split(",")[0]}
167
- </span>
168
- </div>
169
- <div
170
- style={{
171
- width: "1px",
172
- flex: 1,
173
- backgroundColor: "#fff",
174
- margin: "3px 0",
175
- minHeight: "8px",
176
- position: "absolute",
177
- top: "13px",
178
- left: "7px",
179
- }}
180
- />
181
- <div className="flex items-center gap-[6px]">
182
- <img
183
- src={serviceItem.icons?.whiteDestination}
184
- alt="destination"
185
- className={`w-[14px] h-[14px] shrink-0 ${
186
- isSoldOut ? "grayscale" : ""
187
- }`}
188
- style={{ opacity: isSoldOut ? 0.5 : 1 }}
189
- />
190
- <span className="text-[13px]">
191
- 23 de mayo,{" "}
192
- <span className="bold-text">Entre 07:00 AM y 10:00 AM</span>
193
- </span>
194
- </div>
195
- </div>
196
- {/* <div className="flex gap-[8px]">
197
- <div className="flex flex-col items-center">
198
- <img
199
- src={serviceItem.icons?.whiteOrigin}
200
- alt="origin"
201
- className={`w-[14px] h-[14px] shrink-0 ${
202
- isSoldOut ? "grayscale" : ""
203
- }`}
204
- />
205
- <div
206
- style={{
207
- width: "1px",
208
- flex: 1,
209
- backgroundColor: "#fff",
210
- margin: "3px 0",
211
- minHeight: "8px",
212
- }}
213
- />
214
- <img
215
- src={serviceItem.icons?.whiteDestination}
216
- alt="destination"
217
- className={`w-[14px] h-[14px] shrink-0 ${
218
- isSoldOut ? "grayscale" : ""
219
- }`}
220
- style={{ opacity: isSoldOut ? 0.5 : 1 }}
221
- />
222
- </div>
223
- <div className="flex flex-col gap-[8px]">
224
- <span className="text-[13px] bold-text">
225
- {cityOrigin?.label.split(",")[0]}
226
- <span className="mx-[6px]">→</span>
227
- {cityDestination?.label.split(",")[0]}
228
- </span>
229
- <span className="text-[13px]">
230
- 23 de mayo,{" "}
231
- <span className="bold-text">Entre 07:00 AM y 10:00 AM</span>
232
- </span>
233
- </div>
234
- </div> */}
235
- </div>
236
-
237
- <div className="border-t border-[#363c48] my-[8px]" />
238
-
239
- <div>
240
- <span className="text-[15px] bold-text text-[white] flex items-center justify-center mb-[10px]">
241
- 3 operadores compitiendo por tu compra
242
- </span>
243
- <div className="flex gap-[8px] text-[white]">
244
- {operators.map((op, idx) => (
245
- <div
246
- key={idx}
247
- className="flex min-w-0 flex-col items-center justify-center gap-[8px] rounded-[8px]"
248
- style={{
249
- // height: "80px",
250
- border: "1px solid #363c48",
251
- backgroundColor: "#1a202e",
252
- padding: "14px 10px",
253
- }}
254
- >
255
- <img
256
- src={serviceItem.operator_details[0]}
257
- alt={op.name}
258
- className={`h-[24px] max-w-full object-contain ${
259
- isSoldOut ? "grayscale" : ""
260
- }`}
261
- />
262
- <span className="text-[11px] truncate max-w-full text-center">
263
- {serviceItem.operator_details[2]}
264
- </span>
265
- <div className="bg-[#FF8F45] text-[12px] font-bold px-[10px] py-[4px] rounded-[4px] bold-text whitespace-nowrap">
266
- <span>{op?.time}</span>
267
- </div>
268
- <span className="text-[10px] mt-[6px]">
269
- {op?.seatsAvailable}
270
- </span>
271
- </div>
272
- ))}
273
- </div>
274
-
275
- <div
276
- className="flex w-full items-center justify-center gap-[6px] text-[12px] mt-[12px]"
277
- style={{
278
- border: "1px solid #363c48",
279
- backgroundColor: "#1a202e",
280
- padding: "4px 14px",
281
- borderRadius: "24px",
282
- }}
283
- >
284
- <LottiePlayer
285
- animationData={serviceItem.icons.personsAnim}
286
- // animationData={getAnimationIcon("usersAnimation")}
287
- width="18px"
288
- height="18px"
289
- />
290
- <span>
291
- <span className="bold-text text-[white]">
292
- {" "}
293
- <span
294
- className="bold-text"
295
- ref={(node) =>
296
- commonService.startViewerCount(node, viewersConfig)
297
- }
298
- style={{
299
- fontVariantNumeric: "tabular-nums",
300
- color: "#FF5C60",
301
- }}
302
- />{" "}
303
- </span>{" "}
304
- <span className="text-[white]">viendo |</span>{" "}
305
- <span
306
- className="bold-text text-[white]"
307
- ref={(node) =>
308
- commonService.startComprandoCount(node, 4, 16)
309
- }
310
- style={{ fontVariantNumeric: "tabular-nums" }}
311
- />{" "}
312
- <span className="text-[white]">han comprado</span>
313
- </span>
314
- </div>
315
-
316
- <div className="mt-[10px] flex flex-col items-center gap-[8px]">
317
- <span className="text-[12px] text-[white]">
318
- ¿Cuántos pasajes quieres?
319
- </span>
320
- <div
321
- className="flex w-[50%] items-center justify-between"
322
- style={{
323
- border: "1px solid #363c48",
324
- backgroundColor: "#1a202e",
325
- padding: "6px 14px",
326
- borderRadius: "14px",
327
- }}
328
- >
329
- <button
330
- type="button"
331
- aria-label="Disminuir pasajes"
332
- disabled={!canDecreaseTicketQuantity}
333
- onClick={() => onDecreaseTicketQuantity?.(serviceItem)}
334
- className={`flex h-[34px] w-[34px] items-center justify-center rounded-full border-none text-[25px] leading-none text-[white] ${
335
- canDecreaseTicketQuantity
336
- ? "cursor-pointer bg-[#2d374d]"
337
- : "cursor-not-allowed bg-[#222b3d] opacity-50"
338
- }`}
339
- >
340
- -
341
- </button>
342
- <span className="bold-text text-[20px] text-white">
343
- {ticketQuantity}
344
- </span>
345
- <button
346
- type="button"
347
- aria-label="Aumentar pasajes"
348
- onClick={() => onIncreaseTicketQuantity?.(serviceItem)}
349
- className="flex h-[34px] w-[34px] cursor-pointer items-center justify-center rounded-full border-none bg-[#2d374d] text-[25px] leading-none text-[white]"
350
- >
351
- +
352
- </button>
353
- </div>
354
- </div>
355
-
356
- <div
357
- className="mt-[10px] flex justify-between items-center rounded-[14px]"
358
- style={{
359
- // height: "80px",
360
- border: "1px solid #363c48",
361
- backgroundColor: "#1a202e",
362
- padding: "14px 10px",
363
- }}
364
- >
365
- <div className="flex flex-col">
366
- <span
367
- className="text-[20px] font-normal leading-[20px] text-[#9f9f9f] relative"
368
- style={{ position: "relative" }}
369
- >
370
- $10.000
371
- <span
372
- style={{
373
- position: "absolute",
374
- left: "-2px",
375
- top: "50%",
376
- width: "calc(80% + 4px)",
377
- height: "1px",
378
-
379
- backgroundColor: "#FF5C60",
380
-
381
- transform: "rotate(-10deg)",
382
- transformOrigin: "center",
383
- }}
384
- />
385
- </span>
386
- <span className="text-[white] bold-text text-[28px] leading-none mt-[4px]">
387
- {`$${(4000 * ticketQuantity).toLocaleString()}`}
388
- </span>
389
- </div>
390
- <div>
391
- <span
392
- className="text-[#FF8F45] bold-text text-[26px] leading-tight"
393
- style={{
394
- animation: "pulse-zoom 2s ease-in-out infinite",
395
- whiteSpace: "nowrap",
396
- }}
397
- >
398
- 60% OFF
399
- </span>
400
- </div>
401
- </div>
402
-
403
- <button
404
- type="button"
405
- onClick={onBookButtonPress}
406
- className="flex items-center gap-[6px] px-[20px] py-[10px] rounded-[16px] text-[white] bold-text text-[13px] mt-[10px] justify-center border-none cursor-pointer"
407
- style={{
408
- backgroundColor: "#FF5C60",
409
- animation: "pulse-zoom 2s ease-in-out infinite",
410
- whiteSpace: "nowrap",
411
- width: "100%",
412
- }}
413
- >
414
- <LottiePlayer
415
- animationData={serviceItem.icons.thunderAnim}
416
- width="18px"
417
- height="18px"
418
- />
419
- <span className="whitespace-nowrap">¡Lo quiero!</span>
420
- </button>
421
-
422
- <div
423
- className={`flex justify-end mt-[10px] transition-transform duration-300 ease-in-out ${isItemExpanded ? "rotate-180" : ""}`}
424
- onClick={onToggleExpand}
425
- >
426
- <img
427
- src={serviceItem?.icons?.downArrow}
428
- alt="down arrow"
429
- style={{
430
- width: "14px",
431
- height: "8px",
432
- filter: "brightness(0) invert(1)",
433
- }}
434
- />
435
- </div>
436
- </div>
437
-
438
- {/* <div>
439
- <div className="flex items-center text-[white]">
440
- <span>Vie, 04/11</span>
441
- <span className="h-[20px] flex items-center justify-center mx-[10px]">
442
-
443
- </span>
444
- <span>07:00 AM - 10:00 AM</span>
445
- </div>
446
- <div
447
- style={{
448
- // height: "80px",
449
- border: "1px solid #363c48",
450
- backgroundColor: "#1a202e",
451
- padding: "14px 10px",
452
- borderRadius: "14px",
453
- marginTop: "14px",
454
- }}
455
- >
456
- <div className="flex flex-col justify-center items-center text-[white]">
457
- <span className="text-[15px] bold-text">
458
- 3 operadores compitiendo por tu compra
459
- </span>
460
-
461
- <span className="mt-[8px]">
462
- Empresa a confirmar después de tu pago
463
- </span>
464
- </div>
465
- <div className="grid w-full grid-cols-3 items-stretch gap-[14px] mb-[12px] mt-[12px] text-[white]">
466
- {operators.map((op, idx) => (
467
- <div
468
- key={idx}
469
- className="flex min-w-0 flex-col items-center justify-center gap-[8px] rounded-[8px]"
470
- style={{
471
- // height: "80px",
472
- border: "1px solid #363c48",
473
- backgroundColor: "#1a202e",
474
- padding: "14px 10px",
475
- }}
476
- >
477
- <img
478
- src={serviceItem.operator_details[0]}
479
- alt={op.name}
480
- className={`h-[24px] max-w-full object-contain ${
481
- isSoldOut ? "grayscale" : ""
482
- }`}
483
- />
484
- <span className="text-[11px] truncate max-w-full text-center">
485
- {serviceItem.operator_details[2]}
486
- </span>
487
- <div className="bg-[#FF8F45] text-[12px] font-bold px-[10px] py-[4px] rounded-[4px] bold-text whitespace-nowrap">
488
- <span>{op?.time}</span>
489
- </div>
490
- <span className="text-[10px] mt-[6px]">
491
- {op?.seatsAvailable}
492
- </span>
493
- </div>
494
- ))}
495
- </div>
496
- <div className="flex items-center gap-[4px]">
497
- {renderIcon("sheildIcon", "14px")}
498
- <span className="text-[white]">
499
- Tu asiento confirmado al instante.
500
- </span>
501
- </div>
502
- </div>
503
- </div>
504
- <div>
505
- <div className="mt-[4px] flex flex-col items-center gap-[8px]">
506
- <span className="text-[12px] text-[white]">
507
- ¿Cuántos pasajes quieres?
508
- </span>
509
- <div
510
- className="flex w-full items-center justify-between"
511
- style={{
512
- border: "1px solid #363c48",
513
- backgroundColor: "#1a202e",
514
- padding: "6px 14px",
515
- borderRadius: "14px",
516
- }}
517
- >
518
- <button
519
- type="button"
520
- aria-label="Disminuir pasajes"
521
- disabled={!canDecreaseTicketQuantity}
522
- onClick={() => onDecreaseTicketQuantity?.(serviceItem)}
523
- className={`flex h-[34px] w-[34px] items-center justify-center rounded-full border-none text-[25px] leading-none text-[white] ${
524
- canDecreaseTicketQuantity
525
- ? "cursor-pointer bg-[#2d374d]"
526
- : "cursor-not-allowed bg-[#222b3d] opacity-50"
527
- }`}
528
- >
529
- -
530
- </button>
531
- <span className="bold-text text-[20px] text-[white]">
532
- {ticketQuantity}
533
- </span>
534
- <button
535
- type="button"
536
- aria-label="Aumentar pasajes"
537
- onClick={() => onIncreaseTicketQuantity?.(serviceItem)}
538
- className="flex h-[34px] w-[34px] cursor-pointer items-center justify-center rounded-full border-none bg-[#2d374d] text-[25px] leading-none text-[white]"
539
- >
540
- +
541
- </button>
542
- </div>
543
- <button
544
- type="button"
545
- onClick={onBookButtonPress}
546
- className="flex items-center gap-[6px] px-[20px] py-[10px] rounded-[16px] text-[white] bold-text text-[13px] mt-[4px] justify-center border-none cursor-pointer"
547
- style={{
548
- backgroundColor: "#FF5C60",
549
- animation: "pulse-zoom 2s ease-in-out infinite",
550
- whiteSpace: "nowrap",
551
- width: "100%",
552
- }}
553
- >
554
- <LottiePlayer
555
- animationData={serviceItem.icons.thunderAnim}
556
- width="18px"
557
- height="18px"
558
- />
559
- <span className="whitespace-nowrap">¡Lo quiero!</span>
560
- </button>
561
- </div>
562
- </div>
563
- <div className="flex justify-between items-center">
564
- <div className="flex items-center">
565
- <LottiePlayer
566
- animationData={serviceItem.icons.dotAnimation}
567
- width="12px"
568
- height="12px"
569
- />
570
- <span className="ml-[5px]">
571
- <span className="bold-text text-[white]">
572
- {" "}
573
- <span
574
- className="bold-text"
575
- ref={(node) =>
576
- commonService.startViewerCount(node, viewersConfig)
577
- }
578
- style={{
579
- fontVariantNumeric: "tabular-nums",
580
- }}
581
- />{" "}
582
- </span>{" "}
583
- <span className="text-[white]">viendo |</span>{" "}
584
- <span
585
- className="bold-text text-[white]"
586
- ref={(node) =>
587
- commonService.startComprandoCount(node, 4, 16)
588
- }
589
- style={{ fontVariantNumeric: "tabular-nums" }}
590
- />{" "}
591
- <span className="text-[white]">han comprado</span>
592
- </span>
593
- </div>
594
- <div
595
- className={`transition-transform duration-300 ease-in-out ${isItemExpanded ? "rotate-180" : ""}`}
596
- onClick={onToggleExpand}
597
- >
598
- <img
599
- src={serviceItem?.icons?.downArrow}
600
- alt="down arrow"
601
- style={{
602
- width: "14px",
603
- height: "8px",
604
- filter: "brightness(0) invert(1)",
605
- }}
606
- />
607
- </div>
608
- </div> */}
609
- </div>
610
- </div>
611
-
612
- {isItemExpanded && (
613
- <div
614
- className="flex flex-col gap-[10px]"
615
- style={{
616
- opacity: isItemExpanded ? 1 : 0,
617
- transition: "opacity 250ms ease-in-out",
618
- }}
619
- >
620
- <div
621
- className={` text-[12px] ${
622
- isItemExpanded ? "pt-[14px] pb-[6px]" : "py-0"
623
- }`}
624
- style={{ transition: "padding 300ms ease-in-out" }}
625
- >
626
- <span className="bold-text">¿Cómo funciona?</span>
627
-
628
- <div className="flex flex-col">
629
- {HOW_IT_WORKS_STEPS.map((step) => (
630
- <div className="flex items-start gap-[8px] mt-[10px]">
631
- <div>
632
- <FeatureStepIcon icon={step.icon} />
633
- </div>
634
- <div className="flex flex-col">
635
- <span className="bold-text">{step.name}</span>
636
- <span>{step.text}</span>
637
- </div>
638
- </div>
639
- // <div
640
- // key={step.name}
641
- // className="flex flex-col items-center text-center text-[#272727]"
642
- // >
643
- // <FeatureStepIcon icon={step.icon} />
644
- // <span className="bold-text mt-[10px] text-[12px] leading-[14px]">
645
- // {step.name}
646
- // </span>
647
- // <span className="mt-[2px] max-w-[220px] text-[12px] leading-[14px] text-[#4a4a4a]">
648
- // {step.text}
649
- // </span>
650
- // </div>
651
- ))}
652
- </div>
653
- </div>
654
- </div>
655
- )}
656
- </div>
657
- {/* <div
658
- className=""
659
- style={{
660
- border: "1px solid #c0c0c0",
661
- padding: "14px",
662
- borderRadius: "14px",
663
- }}
664
- >
665
- <div className="flex justify-between items-center px-[14px] pb-[10px] text-[13.33px]">
666
- <div className="flex items-center gap-[10px]">
667
- <span>Salida flexible</span>
668
- <div
669
- className="bold-text font-[9px]"
670
- style={{
671
- backgroundColor: "#FF5C60",
672
- padding: "1px 8px",
673
- borderRadius: "4px",
674
- color: "#fff",
675
- animation: "pulse-zoom 2s ease-in-out infinite",
676
- whiteSpace: "nowrap",
677
- }}
678
- >
679
- <span>AHORRAS 60%</span>
680
- </div>
681
- </div>
682
- <div>
683
- <span>
684
- {renderIcon("fireIcon", "14px")}{" "}
685
- <span className="bold-text">Remate</span> términa en{" "}
686
- <span
687
- className="bold-text text-end"
688
- ref={(node) => commonService.startCountdown(node, 599)}
689
- style={{
690
- fontVariantNumeric: "tabular-nums",
691
- display: "inline-block",
692
- color: "#FF5C60",
693
- minWidth: "40px",
694
- }}
695
- />
696
- </span>
697
- </div>
698
- </div>
699
- <div
700
- id={`service-card-${serviceItem.id}`}
701
- className="bg-[#0C1421] text-white mx-auto relative rounded-[14px] p-[14px] text-[13.33px]"
702
- >
703
- <div className="grid grid-cols-[23%_50%_27%] items-stretch">
704
- <div className="flex flex-col justify-between gap-[20px] my-[14px] pr-[22px]">
705
- <div className="flex flex-col gap-[8px]">
706
- <div className="flex items-center gap-[8px]">
707
- <img
708
- src={serviceItem.icons?.whiteOrigin}
709
- alt="origin"
710
- className={`w-[14px] h-[14px] shrink-0 ${
711
- isSoldOut ? "grayscale" : ""
712
- }`}
713
- />
714
- <span className="text-[13px] bold-text">
715
- {cityOrigin?.label.split(",")[0]}
716
- </span>
717
- </div>
718
- <div className="flex items-center gap-[8px]">
719
- <img
720
- src={serviceItem.icons?.whiteDestination}
721
- alt="destination"
722
- className={`w-[14px] h-[14px] shrink-0 ${
723
- isSoldOut ? "grayscale" : ""
724
- }`}
725
- style={{ opacity: isSoldOut ? 0.5 : 1 }}
726
- />
727
- <span className="text-[13px] bold-text">
728
- {cityDestination?.label.split(",")[0]}
729
- </span>
730
- </div>
731
- </div>
732
-
733
- <div className="flex flex-col gap-[8px]">
734
- <div className="text-[12px] bold-text whitespace-nowrap">
735
- Entre 07:00 AM y 10:00 AM
736
- </div>
737
- <div className="text-[11px] bold-text">Viernes 23 de mayo</div>
738
- </div>
739
-
740
- <div className="flex flex-col items-start gap-[10px] text-[12px] ">
741
- <div className="flex items-justify gap-[8px]">
742
- <AssuranceIcon type="pending" />
743
-
744
- <span
745
- className="text-[10px]"
746
- style={{
747
- lineHeight: 1.3,
748
- }}
749
- >
750
- Empresa y hora a confirmar luego del pago.
751
- </span>
752
- </div>
753
- <div className="flex items-justify gap-[8px]">
754
- <AssuranceIcon type="secured" />
755
-
756
- <span
757
- className="text-[10px]"
758
- style={{
759
- lineHeight: 1.3,
760
- }}
761
- >
762
- Tu compra está 100% asegurada.
763
- </span>
764
- </div>
765
- </div>
766
- </div>
767
-
768
- <div className="min-w-0 px-[22px] flex flex-col items-center justify-between gap-[16px] py-[2px] border-r border-[#363c48] border-l border-[#363c48]">
769
- <div className="text-center">
770
- <div className="bold-text text-[14px]">
771
- 3 operadores compitiendo por tu compra
772
- </div>
773
- </div>
774
-
775
- <div className="grid w-full grid-cols-3 items-stretch gap-[14px] mb-[12px]">
776
- {operators.map((op, idx) => (
777
- <div
778
- key={idx}
779
- className="flex min-w-0 flex-col items-center justify-center gap-[8px] rounded-[8px]"
780
- style={{
781
- border: "1px solid #363c48",
782
- backgroundColor: "#1a202e",
783
- padding: "14px 10px",
784
- }}
785
- >
786
- <img
787
- src={serviceItem.operator_details[0]}
788
- alt={op.name}
789
- className={`h-[24px] max-w-full object-contain ${
790
- isSoldOut ? "grayscale" : ""
791
- }`}
792
- />
793
- <span className="text-[11px] truncate max-w-full text-center">
794
- {serviceItem.operator_details[2]}
795
- </span>
796
- <div className="bg-[#FF8F45] text-white text-[12px] font-bold px-[10px] py-[4px] rounded-[4px] bold-text whitespace-nowrap">
797
- <span>{op?.time}</span>
798
- </div>
799
- <span className="text-[10px] mt-[6px]">
800
- {op?.seatsAvailable}
801
- </span>
802
- </div>
803
- ))}
804
- </div>
805
-
806
- <div
807
- className="flex w-full items-center justify-center gap-[6px] text-[12px]"
808
- style={{
809
- border: "1px solid #363c48",
810
- backgroundColor: "#1a202e",
811
- padding: "8px 14px",
812
- borderRadius: "24px",
813
- }}
814
- >
815
- <LottiePlayer
816
- animationData={serviceItem?.icons?.personsAnim}
817
- width="18px"
818
- height="18px"
819
- />
820
- <span>
821
- <span className="bold-text text-white">
822
- {" "}
823
- <span
824
- className="bold-text"
825
- ref={(node) =>
826
- commonService.startViewerCount(node, viewersConfig)
827
- }
828
- style={{
829
- fontVariantNumeric: "tabular-nums",
830
- color: "#FF5C60",
831
- }}
832
- />{" "}
833
- </span>{" "}
834
- viendo |{" "}
835
- <span
836
- className="bold-text"
837
- ref={(node) =>
838
- commonService.startComprandoCount(node, 4, 16)
839
- }
840
- style={{ fontVariantNumeric: "tabular-nums" }}
841
- />{" "}
842
- han comprado
843
- </span>
844
- </div>
845
- </div>
846
-
847
- <div className="flex flex-col justify-center gap-[12px] py-[2px] pl-[22px] pr-[10px] relative mb-[16px]">
848
- <div
849
- className="flex flex-col gap-[6px] "
850
- style={{
851
- alignItems: "center",
852
- }}
853
- >
854
- <span
855
- className="text-[#FF8F45] bold-text text-[26px] leading-tight"
856
- style={{
857
- animation: "pulse-zoom 2s ease-in-out infinite",
858
- whiteSpace: "nowrap",
859
- }}
860
- >
861
- 60% OFF
862
- </span>
863
-
864
- <span
865
- className="text-[13.33px] font-normal leading-[20px] text-[#9f9f9f] relative"
866
- style={{ position: "relative" }}
867
- >
868
- $10.000
869
- <span
870
- style={{
871
- position: "absolute",
872
- left: "-2px",
873
- top: "50%",
874
- width: "calc(100% + 4px)",
875
- height: "1px",
876
-
877
- backgroundColor: "#FF5C60",
878
-
879
- transform: "rotate(-10deg)",
880
- transformOrigin: "center",
881
- }}
882
- />
883
- </span>
884
- <span className="text-white bold-text text-[28px] leading-none">
885
- {`$${(4000 * ticketQuantity).toLocaleString()}`}
886
- </span>
887
- </div>
888
-
889
- <div className="mt-[4px] flex flex-col items-center gap-[8px]">
890
- <span className="text-[12px] text-white">
891
- ¿Cuántos pasajes quieres?
892
- </span>
893
- <div
894
- className="flex w-full items-center justify-between"
895
- style={{
896
- border: "1px solid #363c48",
897
- backgroundColor: "#1a202e",
898
- padding: "6px 14px",
899
- borderRadius: "14px",
900
- }}
901
- >
902
- <button
903
- type="button"
904
- aria-label="Disminuir pasajes"
905
- disabled={!canDecreaseTicketQuantity}
906
- onClick={() => onDecreaseTicketQuantity?.(serviceItem)}
907
- className={`flex h-[34px] w-[34px] items-center justify-center rounded-full border-none text-[25px] leading-none text-white ${
908
- canDecreaseTicketQuantity
909
- ? "cursor-pointer bg-[#2d374d]"
910
- : "cursor-not-allowed bg-[#222b3d] opacity-50"
911
- }`}
912
- >
913
- -
914
- </button>
915
- <span className="bold-text text-[20px] text-white">
916
- {ticketQuantity}
917
- </span>
918
- <button
919
- type="button"
920
- aria-label="Aumentar pasajes"
921
- onClick={() => onIncreaseTicketQuantity?.(serviceItem)}
922
- className="flex h-[34px] w-[34px] cursor-pointer items-center justify-center rounded-full border-none bg-[#2d374d] text-[25px] leading-none text-white"
923
- >
924
- +
925
- </button>
926
- </div>
927
- </div>
928
-
929
- <button
930
- type="button"
931
- onClick={onBookButtonPress}
932
- className="flex items-center gap-[6px] px-[20px] py-[10px] rounded-[16px] text-white bold-text text-[13px] mt-[4px] justify-center border-none cursor-pointer"
933
- style={{
934
- backgroundColor: "#FF5C60",
935
- animation: "pulse-zoom 2s ease-in-out infinite",
936
- whiteSpace: "nowrap",
937
- }}
938
- >
939
- <LottiePlayer
940
- animationData={serviceItem?.icons?.thunderAnim}
941
- width="18px"
942
- height="18px"
943
- />
944
- <span className="whitespace-nowrap">¡Lo quiero!</span>
945
- </button>
946
- </div>
947
-
948
- <div
949
- className={`absolute bottom-[11px] right-[18px] cursor-pointer transition-transform duration-300 ease-in-out ${isItemExpanded ? "rotate-180" : ""}`}
950
- onClick={onToggleExpand}
951
- >
952
- <img
953
- src={serviceItem.icons?.downArrow}
954
- alt="down arrow"
955
- style={{
956
- width: "14px",
957
- height: "8px",
958
- filter: "brightness(0) invert(1)",
959
- }}
960
- />
961
- </div>
962
- </div>
963
- </div>
964
- <div
965
- className="grid"
966
- style={{
967
- gridTemplateRows: isItemExpanded ? "1fr" : "0fr",
968
- opacity: isItemExpanded ? 1 : 0,
969
- transition:
970
- "grid-template-rows 300ms ease-in-out, opacity 250ms ease-in-out",
971
- }}
972
- >
973
- <div
974
- className={`min-h-0 overflow-hidden px-[16px] text-[13.33px] ${
975
- isItemExpanded ? "pt-[14px] pb-[6px]" : "py-0"
976
- }`}
977
- style={{ transition: "padding 300ms ease-in-out" }}
978
- >
979
- <span className="bold-text">¿Cómo funciona?</span>
980
-
981
- <div className="mt-[14px] grid grid-cols-4 gap-[20px] px-[16px] ">
982
- {HOW_IT_WORKS_STEPS.map((step) => (
983
- <div
984
- key={step.name}
985
- className="flex flex-col items-center text-center text-[#272727]"
986
- >
987
- <FeatureStepIcon icon={step.icon} />
988
- <span className="bold-text mt-[10px] text-[12px] leading-[14px]">
989
- {step.name}
990
- </span>
991
- <span className="mt-[2px] max-w-[220px] text-[12px] leading-[14px] text-[#4a4a4a]">
992
- {step.text}
993
- </span>
994
- </div>
995
- ))}
996
- </div>
997
- </div>
998
- </div>
999
- </div> */}
1000
-
1001
- {/* TOP BADGE — "Remate | Termina en 09:55 min" hardcoded, no countdown hook */}
1002
- {/* {showTopLabel && (
1003
- <div className="absolute -top-[11px] left-0 w-full flex items-center justify-end gap-[12px] pr-[15px] z-10 ">
1004
- <div className="flex items-center gap-[6px] py-[5px] px-[14px] rounded-[38px] text-[12.5px] bg-[#FF8F45] text-white whitespace-nowrap">
1005
- <LottiePlayer
1006
- animationData={getAnimationIcon("bombAnimation")}
1007
- width="14px"
1008
- height="14px"
1009
- />
1010
- <span>
1011
- <strong>Remate</strong> | Termina en{" "}
1012
- <strong>{HARDCODED_COUNTDOWN}</strong> min
1013
- </span>
1014
- </div>
1015
- </div>
1016
- )} */}
1017
- </div>
1018
- );
1019
- };
1020
-
1021
- export default FeatureServiceUiMobile;