kupos-ui-components-lib 10.4.13 → 10.4.15

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 (56) hide show
  1. package/dist/assets/images/anims/service_list/60_percent_anim.json +1 -0
  2. package/dist/assets/images/filter/arrow-down.png +0 -0
  3. package/dist/assets/images/filter/rapido.svg +14 -0
  4. package/dist/components/FilterSortBar/FilterChip.d.ts +6 -2
  5. package/dist/components/FilterSortBar/FilterChip.js +10 -32
  6. package/dist/components/FilterSortBar/FilterSortBarMobile.d.ts +1 -1
  7. package/dist/components/FilterSortBar/FilterSortBarMobile.js +86 -38
  8. package/dist/components/FilterSortBar/FiltersMasterSheet.d.ts +3 -1
  9. package/dist/components/FilterSortBar/FiltersMasterSheet.js +28 -97
  10. package/dist/components/FilterSortBar/OptionCheckboxList.js +5 -16
  11. package/dist/components/FilterSortBar/PriceRangeSlider.js +17 -55
  12. package/dist/components/FilterSortBar/SheetFooter.js +3 -30
  13. package/dist/components/FilterSortBar/defaultIcons.js +9 -0
  14. package/dist/components/FilterSortBar/icons.d.ts +7 -0
  15. package/dist/components/FilterSortBar/icons.js +8 -1
  16. package/dist/components/FilterSortBar/index.d.ts +1 -1
  17. package/dist/components/FilterSortBar/types.d.ts +34 -0
  18. package/dist/components/PaymentOptions/PaymentOptionsDesktop.d.ts +4 -0
  19. package/dist/components/PaymentOptions/PaymentOptionsDesktop.js +5 -0
  20. package/dist/components/PaymentOptions/PaymentOptionsMobile.d.ts +4 -0
  21. package/dist/components/PaymentOptions/PaymentOptionsMobile.js +5 -0
  22. package/dist/components/PaymentOptions/ResponsivePaymentOptions.d.ts +3 -0
  23. package/dist/components/PaymentOptions/ResponsivePaymentOptions.js +10 -0
  24. package/dist/components/PaymentOptions/index.d.ts +5 -0
  25. package/dist/components/PaymentOptions/index.js +4 -0
  26. package/dist/components/PaymentOptions/mobileTypes.d.ts +0 -0
  27. package/dist/components/PaymentOptions/mobileTypes.js +0 -0
  28. package/dist/components/PaymentOptions/type.d.ts +4 -0
  29. package/dist/components/PaymentOptions/type.js +1 -0
  30. package/dist/components/PaymentSideBar/PaymentSideBarMobile.js +1 -1
  31. package/dist/components/ServiceItem/ExpandedDropdown.d.ts +19 -0
  32. package/dist/components/ServiceItem/ExpandedDropdown.js +28 -0
  33. package/dist/components/ServiceItem/ServiceItemDesktopPeru.d.ts +6 -0
  34. package/dist/components/ServiceItem/ServiceItemDesktopPeru.js +612 -0
  35. package/dist/index.d.ts +1 -1
  36. package/dist/styles.css +233 -0
  37. package/dist/ui/PaymentCardMobile/PaymentCardMobile.js +40 -51
  38. package/dist/ui/TopAmenities/PromoCountdown.d.ts +18 -0
  39. package/dist/ui/TopAmenities/PromoCountdown.js +55 -0
  40. package/package.json +2 -2
  41. package/src/assets/images/filter/arrow-down.png +0 -0
  42. package/src/assets/images/filter/rapido.svg +14 -0
  43. package/src/components/FilterSortBar/FilterChip.tsx +31 -35
  44. package/src/components/FilterSortBar/FilterSortBarMobile.tsx +122 -66
  45. package/src/components/FilterSortBar/FiltersMasterSheet.tsx +34 -118
  46. package/src/components/FilterSortBar/OptionCheckboxList.tsx +5 -16
  47. package/src/components/FilterSortBar/PriceRangeSlider.tsx +20 -61
  48. package/src/components/FilterSortBar/SheetFooter.tsx +4 -32
  49. package/src/components/FilterSortBar/defaultIcons.ts +11 -0
  50. package/src/components/FilterSortBar/icons.tsx +38 -2
  51. package/src/components/FilterSortBar/index.ts +2 -0
  52. package/src/components/FilterSortBar/types.ts +36 -0
  53. package/src/components/PaymentSideBar/PaymentSideBarMobile.tsx +4 -1
  54. package/src/index.ts +2 -0
  55. package/src/ui/PaymentCardMobile/PaymentCardMobile.tsx +136 -98
  56. package/src/components/FilterSortBar/SingleFilterSheet.tsx +0 -82
@@ -12,45 +12,17 @@ const SheetFooter = ({ onClear, onApply, colors }: SheetFooterProps) => {
12
12
  const buttonTextColor = colors.buttonTextColor || colors.primaryTextColor;
13
13
 
14
14
  return (
15
- <div
16
- style={{
17
- display: "flex",
18
- gap: 12,
19
- paddingTop: 16,
20
- marginBottom: 8,
21
- }}
22
- >
15
+ <div className="flex gap-[12px] pt-[16px] mb-[8px]">
23
16
  <button
24
17
  onClick={onClear}
25
- style={{
26
- flex: 1,
27
- padding: "12px 16px",
28
- borderRadius: 10,
29
- border: "1px solid #E5E5E5",
30
- background: "#fff",
31
- color: "#464647",
32
- fontSize: 14,
33
- fontWeight: 600,
34
- cursor: "pointer",
35
- WebkitTapHighlightColor: "transparent",
36
- }}
18
+ className="flex-1 px-[16px] py-[12px] rounded-[10px] border border-[#E5E5E5] bg-[#fff] text-[#464647] text-[14px] font-semibold cursor-pointer [-webkit-tap-highlight-color:transparent] font-['DMSans-Regular',sans-serif]"
37
19
  >
38
20
  Borrar filtro
39
21
  </button>
40
22
  <button
41
23
  onClick={onApply}
42
- style={{
43
- flex: 1,
44
- padding: "12px 16px",
45
- borderRadius: 10,
46
- border: "none",
47
- background: buttonColor,
48
- color: buttonTextColor,
49
- fontSize: 14,
50
- fontWeight: 600,
51
- cursor: "pointer",
52
- WebkitTapHighlightColor: "transparent",
53
- }}
24
+ className="flex-1 px-[16px] py-[12px] rounded-[10px] border-none text-[14px] font-semibold cursor-pointer [-webkit-tap-highlight-color:transparent] font-['DMSans-Regular',sans-serif]"
25
+ style={{ background: buttonColor, color: buttonTextColor }}
54
26
  >
55
27
  Aplicar
56
28
  </button>
@@ -10,6 +10,11 @@
10
10
  import { FilterSortBarIcons } from "./types";
11
11
 
12
12
  export const DEFAULT_ICONS: FilterSortBarIcons = {
13
+ // Sourced from src/assets/images/filter/arrow-down.png (re-exported without
14
+ // its stray XMP orientation metadata, which browsers don't honor for PNGs —
15
+ // using the file as-is would render sideways).
16
+ sortArrowIcon:
17
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAABDCAYAAADatIboAAADC0lEQVR4nNWaMWsUQRTHf741ixERIqIICopgY4qA2iimM42Q4gqvsxEE8WPYWKRJkc4qnYWNlUqaFJIuVfIFBOUaUQhETvQiA2/gMc7e3uZuc/d+sMUNdzvv/+b/ZuaYgclTAqvADtAHesBLYAEnLABvNPgjYAB8AJba6ExaGoEgYk4/nwIuAWe9CJgzgbeO4BzBOYJzBOcIzhGcIzhHcI7gHME5gnME5wjOEZwjOEdwjuAcwTmCcwTnCM4RnCM4R3CO4BzBOYJzBOcIzhGcIzhHcI7gHME5gnME55wG5oFrwHngB/AN+MXsUQAXgSvAH+BriDcIeAg8AW4Du8Bb4DPwl9mhBG4BXeAe8Bv4CGyjJ+oHeih9qIfSd3VkjsNV4J2+Lz4hMffHyPwisG4Oz8PzBdgMNXBDFQbOAA+A18Aj0z4tSuAm8EKzH8+g0cP0O8FCn4DHwAU9nD6ntgo++zlFOxXAdeA58FTjigQL7QFb6B2GTbXPwAzRgdppuaGdJmGhQjO/lomrr7bvxgskpXo+XND4br48MCJW9KUnIaAwwfcywW9r8PO5Kt9UEbbzkIH3DUZiHAGFFuyrJJlp5suqHy+ZqzKpnbb0HlDZkoBCM7+eCf7Q9G9r4T9KUxPpSPSNncoJCyg08xsV/YbgO6PaONppw6wPuUzMT1DAoukvzfxOTX/U2SmdBaKIqsJuIqAALhvbHGUKtnHwdiQWVUQvefmBFvZK5uWjCoi2WdNVtVHBjkrsxN6BqyvsUQWEgs3Zpq/f70zqomC6TuRqwhZ2nYDCBN+rsE1njL1YpYi4oaoSEb1aJyCOaG6qPFbBTsJOfTMSVQKWawp2R38/dJ4fl6pthy3sZ7pe2AD3tX09KdjBsO1BmyLiSBxm7LSrQdr2nrbntgf7o6ywbdopXezSbUhsy9lu+yRsU7ftiMt/GnTVY22zelK2GTYScRebZrjqibaZWuabFPawzM9E8FW72JyIWODdWQs+tVNudhroPN/07+nU7BRHot/kzwgzgrVTmP/j9qCV4P8B53h9Q9i84bIAAAAASUVORK5CYII=",
13
18
  filterIcon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEyLjM5NTggNy4wMDAyNkg1LjE4ODcxTTUuMTg4NzEgNy4wMDAyNkM1LjE4ODcxIDYuNjYyOTkgNS4wNTQxNSA2LjMzOTU0IDQuODE1NjYgNi4xMDEwNUM0LjU3NzE4IDUuODYyNTcgNC4yNTM3MyA1LjcyODU5IDMuOTE2NDYgNS43Mjg1OUMzLjU3OTE5IDUuNzI4NTkgMy4yNTU3NCA1Ljg2MjU3IDMuMDE3MjYgNi4xMDEwNUMyLjc3ODc3IDYuMzM5NTQgMi42NDQ3OSA2LjY2Mjk5IDIuNjQ0NzkgNy4wMDAyNk01LjE4ODcxIDcuMDAwMjZDNS4xODg3MSA3LjMzNzUyIDUuMDU0MTUgNy42NjA5OCA0LjgxNTY2IDcuODk5NDZDNC41NzcxOCA4LjEzNzk0IDQuMjUzNzMgOC4yNzE5MiAzLjkxNjQ2IDguMjcxOTJDMy41NzkxOSA4LjI3MTkyIDMuMjU1NzQgOC4xMzc5NCAzLjAxNzI2IDcuODk5NDZDMi43Nzg3NyA3LjY2MDk4IDIuNjQ0NzkgNy4zMzc1MiAyLjY0NDc5IDcuMDAwMjZNMi42NDQ3OSA3LjAwMDI2SDEuNjA0MTNNMTIuMzk1OCAxMC44NTQzSDkuMDQyNzlNOS4wNDI3OSAxMC44NTQzQzkuMDQyNzkgMTEuMTkxNiA4LjkwODQ5IDExLjUxNTUgOC42Njk5NSAxMS43NTRDOC40MzE0MiAxMS45OTI1IDguMTA3ODkgMTIuMTI2NiA3Ljc3MDU0IDEyLjEyNjZDNy40MzMyOCAxMi4xMjY2IDcuMTA5ODIgMTEuOTkyIDYuODcxMzQgMTEuNzUzNUM2LjYzMjg2IDExLjUxNSA2LjQ5ODg4IDExLjE5MTYgNi40OTg4OCAxMC44NTQzTTkuMDQyNzkgMTAuODU0M0M5LjA0Mjc5IDEwLjUxNyA4LjkwODQ5IDEwLjE5MzcgOC42Njk5NSA5Ljk1NTIyQzguNDMxNDIgOS43MTY2OCA4LjEwNzg5IDkuNTgyNjcgNy43NzA1NCA5LjU4MjY3QzcuNDMzMjggOS41ODI2NyA3LjEwOTgyIDkuNzE2NjUgNi44NzEzNCA5Ljk1NTE0QzYuNjMyODYgMTAuMTkzNiA2LjQ5ODg4IDEwLjUxNyA2LjQ5ODg4IDEwLjg1NDNNNi40OTg4OCAxMC44NTQzSDEuNjA0MTNNMTIuMzk1OCAzLjE0NjE3SDEwLjU4NDVNMTAuNTg0NSAzLjE0NjE3QzEwLjU4NDUgMi45NzkxOCAxMC41NTExIDIuODEzODEgMTAuNDg3MiAyLjY1OTUzQzEwLjQyMzMgMi41MDUyNCAxMC4zMjk2IDIuMzY1MDYgMTAuMjExNSAyLjI0Njk3QzEwLjA5MzQgMi4xMjg4OCA5Ljk1MzIyIDIuMDM1MjEgOS43OTg5NCAxLjk3MTMxQzkuNjQ0NjUgMS45MDc0IDkuNDc5MjkgMS44NzQ1MSA5LjMxMjI5IDEuODc0NTFDOC45NzUwMyAxLjg3NDUxIDguNjUxNTcgMi4wMDg0OSA4LjQxMzA5IDIuMjQ2OTdDOC4xNzQ2MSAyLjQ4NTQ1IDguMDQwNjMgMi44MDg5MSA4LjA0MDYzIDMuMTQ2MTdNMTAuNTg0NSAzLjE0NjE3QzEwLjU4NDUgMy4zMTMxNyAxMC41NTExIDMuNDc4NTMgMTAuNDg3MiAzLjYzMjgyQzEwLjQyMzMgMy43ODcxMSAxMC4zMjk2IDMuOTI3MjkgMTAuMjExNSA0LjA0NTM4QzEwLjA5MzQgNC4xNjM0NiA5Ljk1MzIyIDQuMjU3MTMgOS43OTg5NCA0LjMyMTA0QzkuNjQ0NjUgNC4zODQ5NSA5LjQ3OTI5IDQuNDE3ODQgOS4zMTIyOSA0LjQxNzg0QzguOTc1MDMgNC40MTc4NCA4LjY1MTU3IDQuMjgzODYgOC40MTMwOSA0LjA0NTM4QzguMTc0NjEgMy44MDY4OSA4LjA0MDYzIDMuNDgzNDQgOC4wNDA2MyAzLjE0NjE3TTguMDQwNjMgMy4xNDYxN0gxLjYwNDEzIiBzdHJva2U9IiM0NjQ2NDciIHN0cm9rZS13aWR0aD0iMC44NzUiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+Cjwvc3ZnPgo=",
14
19
  searchIcon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTUuNjg3NSAxMC4wNjI1QzguMTAzNzUgMTAuMDYyNSAxMC4wNjI1IDguMTAzNzUgMTAuMDYyNSA1LjY4NzVDMTAuMDYyNSAzLjI3MTI1IDguMTAzNzUgMS4zMTI1IDUuNjg3NSAxLjMxMjVDMy4yNzEyNSAxLjMxMjUgMS4zMTI1IDMuMjcxMjUgMS4zMTI1IDUuNjg3NUMxLjMxMjUgOC4xMDM3NSAzLjI3MTI1IDEwLjA2MjUgNS42ODc1IDEwLjA2MjVaIiBzdHJva2U9IiM0NjQ2NDciLz4KPHBhdGggZD0iTTguNzUgOC43NUwxMS4zNzUgMTEuMzc1IiBzdHJva2U9IiM0NjQ2NDciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8L3N2Zz4K",
15
20
  categoryIcons: {
@@ -26,4 +31,10 @@ export const DEFAULT_ICONS: FilterSortBarIcons = {
26
31
  sunset: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzI5MF8zOTIpIj4KPG1hc2sgaWQ9Im1hc2swXzI5MF8zOTIiIHN0eWxlPSJtYXNrLXR5cGU6bHVtaW5hbmNlIiBtYXNrVW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4PSIwIiB5PSIwIiB3aWR0aD0iMTQiIGhlaWdodD0iMTQiPgo8cGF0aCBkPSJNMTQgMEgwVjE0SDE0VjBaIiBmaWxsPSJ3aGl0ZSIvPgo8L21hc2s+CjxnIG1hc2s9InVybCgjbWFzazBfMjkwXzM5MikiPgo8cGF0aCBkPSJNMy41MzUyOCAxMi4xOTg5QzQuMjQxMSAxMi41MTk3IDUuMTM5NDQgMTIuNTE5NyA1Ljg0NTMgMTIuMTk4OUM2LjU1MTEzIDExLjg3ODEgNy40NDk0OCAxMS44NzgxIDguMTU1MjkgMTIuMTk4OUM4Ljg2MTEgMTIuNTE5NyA5Ljc1OTUgMTIuNTE5NyAxMC40NjUzIDEyLjE5ODlNNy4wMDAyMiAxLjc1VjIuOTE2NjdNMi4zMzM1OCA3LjU4MzMxSDEuMTY2OU0zLjY4MzQ4IDQuMjY2NTdMMi44NTg1MiAzLjQ0MTYxTTEwLjMxNjggNC4yNjY1N0wxMS4xNDE4IDMuNDQxNjFNMTIuODMzNiA3LjU4MzMxSDExLjY2N000LjA4MzU4IDcuNTgzMzFDNC4wODM1OCA1Ljk3MjUyIDUuMzg5NDEgNC42NjY2NyA3LjAwMDIyIDQuNjY2NjdDOC42MTEwNiA0LjY2NjY3IDkuOTE2OTYgNS45NzI1MiA5LjkxNjk2IDcuNTgzMzFNMS4yMjUzIDEwLjE1NzNDMS45MzExMyA5LjgzNjQ5IDIuODI5NDcgOS44MzY0OSAzLjUzNTMgMTAuMTU3M0M0LjI0MTEzIDEwLjQ3ODIgNS4xMzk0NyAxMC40NzgyIDUuODQ1MyAxMC4xNTczQzYuNTUxMTMgOS44MzY0OSA3LjQ0OTQ4IDkuODM2NDkgOC4xNTUyOSAxMC4xNTczQzguODYxMSAxMC40NzgyIDkuNzU5NSAxMC40NzgyIDEwLjQ2NTMgMTAuMTU3M0MxMS4xNzExIDkuODM2NDkgMTIuMDY5NSA5LjgzNjQ5IDEyLjc3NTMgMTAuMTU3MyIgc3Ryb2tlPSIjNDY0NjQ3IiBzdHJva2Utd2lkdGg9IjEuMDUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L2c+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMjkwXzM5MiI+CjxyZWN0IHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K",
27
32
  night: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEyLjI1IDcuNDYwODFDMTIuMTU4MyA4LjQ1Mzc2IDExLjc4NTYgOS40MDAwNyAxMS4xNzU2IDEwLjE4OUMxMC41NjU3IDEwLjk3NzkgOS43NDM3MiAxMS41NzY4IDguODA1ODYgMTEuOTE1NUM3Ljg2NzkzIDEyLjI1NDMgNi44NTI5OSAxMi4zMTg5IDUuODc5NzEgMTIuMTAxOUM0LjkwNjQ0IDExLjg4NDkgNC4wMTUwOCAxMS4zOTUyIDMuMzA5OTcgMTAuNjlDMi42MDQ4NSA5Ljk4NDg5IDIuMTE1MTQgOS4wOTM1NiAxLjg5ODEyIDguMTIwMjhDMS42ODExIDcuMTQ3IDEuNzQ1NzYgNi4xMzIwNSAyLjA4NDUyIDUuMTk0MThDMi40MjMyOSA0LjI1NjI5IDMuMDIyMTYgMy40MzQzIDMuODExMDUgMi44MjQzNUM0LjU5OTk0IDIuMjE0NDIgNS41NDYyMiAxLjg0MTc3IDYuNTM5MTcgMS43NUM1Ljk1Nzg0IDIuNTM2NDkgNS42NzgwOSAzLjUwNTUxIDUuNzUwODEgNC40ODA4MkM1LjgyMzU1IDUuNDU2MTQgNi4yNDM5MiA2LjM3Mjk2IDYuOTM1NDggNy4wNjQ1NEM3LjYyNzA2IDcuNzU2MDcgOC41NDM4NSA4LjE3NjQ5IDkuNTE5MTYgOC4yNDkyMkMxMC40OTQ1IDguMzIxOTUgMTEuNDYzNSA4LjA0MjE2IDEyLjI1IDcuNDYwODFaIiBzdHJva2U9IiM0NjQ2NDciIHN0cm9rZS13aWR0aD0iMC45OTc1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPHBhdGggZD0iTTExLjM3NSAyLjUwODUzQzExLjYzMjcgMi41MDg1MyAxMS44NDE3IDIuMjk5NiAxMS44NDE3IDIuMDQxODZDMTEuODQxNyAxLjc4NDEzIDExLjYzMjcgMS41NzUyIDExLjM3NSAxLjU3NTJDMTEuMTE3MiAxLjU3NTIgMTAuOTA4MyAxLjc4NDEzIDEwLjkwODMgMi4wNDE4NkMxMC45MDgzIDIuMjk5NiAxMS4xMTcyIDIuNTA4NTMgMTEuMzc1IDIuNTA4NTNaIiBmaWxsPSIjNDY0NjQ3Ii8+CjxwYXRoIGQ9Ik0xMi41NDE3IDQuMTQxODlDMTIuNzM1IDQuMTQxODkgMTIuODkxNyAzLjk4NTIgMTIuODkxNyAzLjc5MTg5QzEyLjg5MTcgMy41OTg1OSAxMi43MzUgMy40NDE4OSAxMi41NDE3IDMuNDQxODlDMTIuMzQ4NCAzLjQ0MTg5IDEyLjE5MTcgMy41OTg1OSAxMi4xOTE3IDMuNzkxODlDMTIuMTkxNyAzLjk4NTIgMTIuMzQ4NCA0LjE0MTg5IDEyLjU0MTcgNC4xNDE4OVoiIGZpbGw9IiM0NjQ2NDciLz4KPC9zdmc+Cg==",
28
33
  },
34
+ sortIcons: {
35
+ // Rápido (duration sort) — the only sort chip with no existing category
36
+ // or time-of-day icon to reuse. Sourced from src/assets/images/filter/rapido.svg.
37
+ duration:
38
+ "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTMiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMyAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTcuMjY0NzEgMS40MTUyOEM5LjkyMDg0IDEuNDE1MzIgMTIuMDgyMSAzLjU3NjUzIDEyLjA4MjEgNi4yMzI2N0MxMi4wODIxIDguODg4NzggOS45MjA4MiAxMS4wNSA3LjI2NDcxIDExLjA1QzQuNjA4NTcgMTEuMDUgMi40NDczNSA4Ljg4ODggMi40NDczMyA2LjIzMjY3QzIuNDQ3MzMgMy41NzY1MSA0LjYwODU1IDEuNDE1MjggNy4yNjQ3MSAxLjQxNTI4Wk03LjI2NDcxIDEuOTg5NUM0LjkyMzYyIDEuOTg5NSAzLjAyMTU1IDMuODkxNTggMy4wMjE1NSA2LjIzMjY3QzMuMDIxNTcgOC41NzM3MyA0LjkyMzY0IDEwLjQ3NTggNy4yNjQ3MSAxMC40NzU4QzkuNjA1NzUgMTAuNDc1OCAxMS41MDc4IDguNTczNzEgMTEuNTA3OSA2LjIzMjY3QzExLjUwNzkgMy44OTE2IDkuNjA1NzcgMS45ODk1MyA3LjI2NDcxIDEuOTg5NVoiIGZpbGw9IiM0NjQ2NDciIHN0cm9rZT0iIzQ2NDY0NyIgc3Ryb2tlLXdpZHRoPSIwLjEiLz4KPHBhdGggZD0iTTcuMjY0MjUgMi41MTEyM0M5LjMxNzc5IDIuNTExMzQgMTAuOTg1OSA0LjE3OTM1IDEwLjk4NTkgNi4yMzI5MUMxMC45ODU4IDguMjg2MzggOS4zMTc3MiA5Ljk1NDQ4IDcuMjY0MjUgOS45NTQ1OUM1LjIxNDQ5IDkuOTU0NTkgMy41NDI2OCA4LjI4NjQ4IDMuNTQyNTcgNi4yMzI5MUMzLjU0MjU3IDQuMTc5MjggNS4yMTA2MyAyLjUxMTIzIDcuMjY0MjUgMi41MTEyM1pNNy4yNjQyNSAzLjA4NTQ1QzUuNTI5NDYgMy4wODU0NSA0LjExNjc5IDQuNDk4MTIgNC4xMTY3OSA2LjIzMjkxQzQuMTE2OSA3Ljk2NzYxIDUuNTI5NTMgOS4zODAzNyA3LjI2NDI1IDkuMzgwMzdDOC45OTg4OCA5LjM4MDI2IDEwLjQxMTYgNy45Njc1NCAxMC40MTE3IDYuMjMyOTFDMTAuNDExNyA0LjQ5ODE5IDguOTk4OTUgMy4wODU1NiA3LjI2NDI1IDMuMDg1NDVaIiBmaWxsPSIjNDY0NjQ3IiBzdHJva2U9IiM0NjQ2NDciIHN0cm9rZS13aWR0aD0iMC4xIi8+CjxwYXRoIGQ9Ik03LjI2NDQzIDUuNTY1OTJDNi44OTUzOCA1LjU2NTkyIDYuNTk3OSA1Ljg2MzQxIDYuNTk3OSA2LjIzMjQ2QzYuNTk3OSA2LjYwMTUxIDYuODk1MzggNi44OTkwMSA3LjI2NDQzIDYuODk5MDFDNy42MzM0OSA2Ljg5OTAxIDcuOTMwOTkgNi42MDE1MSA3LjkzMDk5IDYuMjMyNDZDNy45MzA5OSA1Ljg2MzQxIDcuNjMzNDkgNS41NjU5MiA3LjI2NDQzIDUuNTY1OTJaIiBmaWxsPSIjNDY0NjQ3Ii8+CjxwYXRoIGQ9Ik02LjUzMzkxIDEuMTI1OThMNi43NTIzMyAxLjI3Mjg0QzYuNzE0NjcgMS4xODI0NiA2LjYzMTgyIDEuMTI1OTggNi41MzM5MSAxLjEyNTk4WiIgZmlsbD0iIzQ2NDY0NyIvPgo8cGF0aCBkPSJNNy45OTQ0OSAxLjEyNTk4SDcuMjI2MjdMNi44Nzk4MiAxLjM1OTQ2SDYuNTMzMzRINi4yOTk4N1YxLjc1MTFDNi4yOTk4NyAxLjg3OTE0IDYuNDA1MzEgMS45ODQ1OCA2LjUzMzM0IDEuOTg0NThDNi41NjcyNCAxLjk4NDU4IDYuNTk3MzYgMS45NzcwNSA2LjYyNzQ5IDEuOTY1NzVDNi42Njg5MSAxLjk1ODIyIDYuODIzMzMgMS45NDMxNiA3LjI3ODk5IDEuOTQzMTZDNy43MDgzIDEuOTQzMTYgNy44NTUxNSAxLjk1ODIyIDcuODk2NTcgMS45NjU3NUM4LjAxMzMxIDIuMDE4NDcgOC4xNTI2NSAxLjk2NTc1IDguMjA5MTQgMS44NDkwMUM4LjIyNDIgMS44MTg4OSA4LjIzMTczIDEuNzg1IDguMjMxNzMgMS43NTExVjEuMzU5NDZDOC4yMzE3MyAxLjIzMTQyIDguMTI2MjkgMS4xMjU5OCA3Ljk5ODI1IDEuMTI1OThINy45OTQ0OVpNNi43NDQyMyAxLjg1Mjc4QzYuNzQ0MjMgMS44NTI3OCA2Ljc1OTMxIDEuODIyNjUgNi43NjMwOCAxLjgwMzgzQzYuNzU5MzEgMS44MTg4OSA2Ljc1MTc2IDEuODM3NzEgNi43NDQyMyAxLjg1Mjc4Wk02Ljc2MzA4IDEuODAzODNDNi43NjMwOCAxLjgwMzgzIDYuNzYzMDYgMS43ODg3NiA2Ljc2NjgyIDEuNzc3NDZDNi43NjY4MiAxLjc4NDk5IDYuNzY2ODQgMS43OTYyOSA2Ljc2MzA4IDEuODAzODNaTTcuNzY4NTQgMS44MDM4M0M3Ljc2ODU0IDEuODAzODMgNy43NzYwNyAxLjgzNzcxIDcuNzgzNiAxLjg1Mjc4QzcuNzc2MDcgMS44Mzc3MSA3Ljc3MjMxIDEuODIyNjUgNy43Njg1NCAxLjgwMzgzWk03Ljc2NDc4IDEuNzc3NDZDNy43NjQ3OCAxLjc3NzQ2IDcuNzY0NzggMS43OTI1MiA3Ljc2ODU0IDEuODAwMDZDNy43Njg1NCAxLjc5MjUyIDcuNzY4NTQgMS43ODQ5OSA3Ljc2NDc4IDEuNzc3NDZaIiBmaWxsPSIjNDY0NjQ3Ii8+CjxwYXRoIGQ9Ik03Ljk5NDM5IDEuNDY4NjdINi41MzMyNEM2LjEyNjU0IDEuNDY4NjcgNS43OTg5MSAxLjEzMzUxIDUuODAyNjcgMC43MzA1N0M1LjgwMjY3IDAuMzMxMzkzIDYuMTM0MDcgMC4wMDM3NjU4MiA2LjUzMzI0IDBINy45OTgxNUM4LjE5Mzk4IDAgOC4zNzg1IDAuMDc5MDgyOSA4LjUxNzg0IDAuMjE4NDE4QzguNjU3MTcgMC4zNTc3NTQgOC43Mjg3MiAwLjU0MjI4MSA4LjcyODcyIDAuNzM4MTAzQzguNzI4NzIgMS4xMzcyOCA4LjM5NzMzIDEuNDY0OTEgNy45OTgxNSAxLjQ2ODY3SDcuOTk0MzlaTTcuOTk0MzkgMC40NzQ0OTdINi41MzMyNEM2LjM5MzkxIDAuNDc0NDk3IDYuMjc3MTcgMC41OTEyMzUgNi4yNzcxNyAwLjczMDU3QzYuMjc3MTcgMC44NzM2NzEgNi4zOTAxNCAwLjk5MDQxMyA2LjUzMzI0IDAuOTkwNDEzSDcuOTkwNjJDOC4xMjk5NSAwLjk5MDQxMyA4LjI0NjY5IDAuODczNjc1IDguMjQ2NjkgMC43MzQzNEM4LjI0NjY5IDAuNjY2NTU1IDguMjIwMzUgMC41OTg3NjggOC4xNzEzOSAwLjU0OTgxMkM4LjEyMjQzIDAuNTAwODU3IDguMDU4NDIgMC40NzQ0OTMgNy45ODY4NyAwLjQ3MDcyOEw3Ljk5NDM5IDAuNDc0NDk3WiIgZmlsbD0iIzQ2NDY0NyIvPgo8cGF0aCBkPSJNMy42Mzc5NSAzLjcyNDQ5SDEuODY0MjZDMS43MzI0NiAzLjcyNDQ5IDEuNjI3MDEgMy42MTkwNSAxLjYyNzAxIDMuNDg3MjVDMS42MjcwMSAzLjM1NTQ0IDEuNzMyNDYgMy4yNSAxLjg2NDI2IDMuMjVIMy42Mzc5NUMzLjc2OTc1IDMuMjUgMy44NzUyIDMuMzU1NDQgMy44NzUyIDMuNDg3MjVDMy44NzUyIDMuNjE5MDUgMy43Njk3NSAzLjcyNDQ5IDMuNjM3OTUgMy43MjQ0OVoiIGZpbGw9IiM0NjQ2NDciLz4KPHBhdGggZD0iTTIuNjc3MzYgNi41NDg3SDEuNDUzNDdDMS4zMjE2NiA2LjU0ODcgMS4yMTYyMiA2LjQ0MzI2IDEuMjE2MjIgNi4zMTE0NkMxLjIxNjIyIDYuMTc5NjUgMS4zMjE2NiA2LjA3NDIyIDEuNDUzNDcgNi4wNzQyMkgyLjY3NzM2QzIuODA5MTYgNi4wNzQyMiAyLjkxNDYxIDYuMTc5NjUgMi45MTQ2MSA2LjMxMTQ2QzIuOTE0NjEgNi40NDMyNiAyLjgwOTE2IDYuNTQ4NyAyLjY3NzM2IDYuNTQ4N1oiIGZpbGw9IiM0NjQ2NDciLz4KPHBhdGggZD0iTTIuODYxNjUgNy45MzQ5M0gxLjIwODQ3QzEuMDc2NjcgNy45MzQ5MyAwLjk3MTIyMiA3LjgyOTUgMC45NzEyMjIgNy42OTc3QzAuOTcxMjIyIDcuNTY1ODkgMS4wNzY2NyA3LjQ2MDQ1IDEuMjA4NDcgNy40NjA0NUgyLjg2MTY1QzIuOTkzNDUgNy40NjA0NSAzLjA5ODkgNy41NjU4OSAzLjA5ODkgNy42OTc3QzMuMDk4OSA3LjgyOTUgMi45OTM0NSA3LjkzNDkzIDIuODYxNjUgNy45MzQ5M1oiIGZpbGw9IiM0NjQ2NDciLz4KPHBhdGggZD0iTTIuOTE0NzQgNS4xMzYzNkgwLjIzNzI0OUMwLjEwNTQ0NSA1LjEzNjM2IDAgNS4wMzA5MSAwIDQuODk5MTFDMCA0Ljc2NzMgMC4xMDU0NDUgNC42NjE4NyAwLjIzNzI0OSA0LjY2MTg3SDIuOTE0NzRDMy4wNDY1NSA0LjY2MTg3IDMuMTUxOTkgNC43NjczIDMuMTUxOTkgNC44OTkxMUMzLjE1MTk5IDUuMDMwOTEgMy4wNDY1NSA1LjEzNjM2IDIuOTE0NzQgNS4xMzYzNloiIGZpbGw9IiM0NjQ2NDciLz4KPHBhdGggZD0iTTcuMDkxMjEgNi4yMTcyOUM3LjAzMDk2IDYuMjE3MjkgNi45NzA3MSA2LjE5NDY5IDYuOTI1NTIgNi4xNDk1TDUuOTc2NTIgNS4yMTU1OEM1Ljg4MjM4IDUuMTI1MiA1Ljg4MjM4IDQuOTc0NTcgNS45NzY1MiA0Ljg4MDQyQzYuMDY2OSA0Ljc4NjI4IDYuMjE3NTQgNC43ODYyOCA2LjMxMTY5IDQuODgwNDJMNy4yNjA2NiA1LjgxNDM1QzcuMzU0OCA1LjkwNDczIDcuMzU0OCA2LjA1NTM2IDcuMjYwNjYgNi4xNDk1QzcuMjE1NDcgNi4xOTg0NiA3LjE1MTQ3IDYuMjIxMDUgNy4wOTEyMSA2LjIyMTA1VjYuMjE3MjlaIiBmaWxsPSIjNDY0NjQ3Ii8+CjxwYXRoIGQ9Ik03LjUxMzA0IDYuMjgxMzNDNy40NTI3OSA2LjI4MTMzIDcuMzkyNTMgNi4yNTg3NCA3LjM0NzM0IDYuMjEzNTVDNy4yNTMyIDYuMTE5NCA3LjI1MzIgNS45NzI1MyA3LjM0NzM0IDUuODc4MzhMOC45NTkxIDQuMjU5MDlDOS4wNTMyNSA0LjE2NDk0IDkuMjAwMTIgNC4xNjQ5NCA5LjI5NDI3IDQuMjU5MDlDOS4zODg0MSA0LjM1MzIzIDkuMzg4NDEgNC41MDAxIDkuMjk0MjcgNC41OTQyNEw3LjY4MjQ4IDYuMjEzNTVDNy42MzcyOSA2LjI1ODc0IDcuNTc3MDYgNi4yODUxIDcuNTEzMDQgNi4yODUxVjYuMjgxMzNaIiBmaWxsPSIjNDY0NjQ3Ii8+Cjwvc3ZnPgo=",
39
+ },
29
40
  };
@@ -40,7 +40,7 @@ export const ChevronDownIcon = ({
40
40
  width={size}
41
41
  height={size * 0.6}
42
42
  alt=""
43
- style={{ transform: open ? "rotate(180deg)" : "none", transition: "transform 0.2s ease", flexShrink: 0 }}
43
+ className={`flex-shrink-0 transition-transform duration-200 ease-in-out ${open ? "rotate-180" : "rotate-0"}`}
44
44
  />
45
45
  ) : (
46
46
  <svg
@@ -49,12 +49,48 @@ export const ChevronDownIcon = ({
49
49
  viewBox="0 0 10 6"
50
50
  fill="none"
51
51
  xmlns="http://www.w3.org/2000/svg"
52
- style={{ transform: open ? "rotate(180deg)" : "none", transition: "transform 0.2s ease", flexShrink: 0 }}
52
+ className={`flex-shrink-0 transition-transform duration-200 ease-in-out ${open ? "rotate-180" : "rotate-0"}`}
53
53
  >
54
54
  <path d="M1 1L5 5L9 1" stroke={color} strokeWidth="1.4" strokeLinecap="round" strokeLinejoin="round" />
55
55
  </svg>
56
56
  );
57
57
 
58
+ export const SortArrowIcon = ({
59
+ size = 9,
60
+ color = "#464647",
61
+ direction = "desc",
62
+ src,
63
+ /** True once the chip is highlighted (colored background) — flips the raster arrow to white via CSS filter, since unlike the SVG fallback it can't take `color` directly. */
64
+ active,
65
+ }: {
66
+ size?: number;
67
+ color?: string;
68
+ direction?: "asc" | "desc";
69
+ src?: string;
70
+ active?: boolean;
71
+ }) =>
72
+ src ? (
73
+ // arrow-down.png is taller than wide (48x67) — keep its aspect ratio
74
+ // instead of forcing a square box, which would squash it.
75
+ <img
76
+ src={src}
77
+ width={size}
78
+ height={Math.round(size * 1.4)}
79
+ alt=""
80
+ className={`flex-shrink-0 ${direction === "asc" ? "rotate-180" : "rotate-0"} ${active ? "brightness-0 invert" : ""}`}
81
+ />
82
+ ) : (
83
+ <svg width={size} height={size} viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg" className="flex-shrink-0">
84
+ <path
85
+ d={direction === "asc" ? "M2 6.2L5 3.2L8 6.2" : "M2 3.8L5 6.8L8 3.8"}
86
+ stroke={color}
87
+ strokeWidth="1.4"
88
+ strokeLinecap="round"
89
+ strokeLinejoin="round"
90
+ />
91
+ </svg>
92
+ );
93
+
58
94
  export const SearchIcon = ({
59
95
  size = 16,
60
96
  color = "#9B9B9B",
@@ -12,4 +12,6 @@ export type {
12
12
  FilterSortBarIcons,
13
13
  FilterSortBarMobileProps,
14
14
  TimeOfDayVariant,
15
+ SortDirection,
16
+ SortOption,
15
17
  } from "./types";
@@ -16,6 +16,10 @@ export interface FilterOptionItem {
16
16
  selected: boolean;
17
17
  stars?: number;
18
18
  icon?: TimeOfDayVariant;
19
+ /** Excludes this option from the category's inline top-bar chips (still shown/selectable inside the Filtros sheet) — for an option whose concept already has its own standalone chip elsewhere, e.g. an inline time bucket duplicating a "Después de las 6 PM" sort chip. */
20
+ excludeFromInline?: boolean;
21
+ /** True when `selected` is only a display mirror of an active sort chip (e.g. a cohort sort chip's matching checkbox), not a real filter selection. Renders checked like any selected option, but is excluded from active-filter counts — the sort chip itself already accounts for that selection, so counting both would double it. */
22
+ checkedViaSort?: boolean;
19
23
  }
20
24
 
21
25
  export interface PriceRangeValue {
@@ -34,6 +38,8 @@ export interface FilterCategory {
34
38
  options?: FilterOptionItem[];
35
39
  priceRange?: PriceRangeValue;
36
40
  inlineOptions?: boolean;
41
+ /** When true, this category gets no standalone top-bar chip — it's still a tab inside the Filtros master sheet, just reachable only via the "Filtros" button. */
42
+ hideChip?: boolean;
37
43
  }
38
44
 
39
45
  export const DEFAULT_CATEGORY_LABELS: Record<FilterCategoryKey, string> = {
@@ -45,6 +51,29 @@ export const DEFAULT_CATEGORY_LABELS: Record<FilterCategoryKey, string> = {
45
51
  seatType: "Tipo de asiento",
46
52
  };
47
53
 
54
+ export type SortDirection = "asc" | "desc";
55
+
56
+ export interface SortOption {
57
+ key: string;
58
+ label: string;
59
+ /**
60
+ * Present only on directional (base) sorts — e.g. Horario, Precio, Rápido.
61
+ * These are mutually exclusive: activating one deactivates the others, and
62
+ * tapping the already-active one flips its direction instead. Always
63
+ * renders a directional arrow.
64
+ */
65
+ direction?: SortDirection;
66
+ /** Whether this sort is currently applied. */
67
+ active: boolean;
68
+ /**
69
+ * Result count for this cohort (e.g. buses departing after 6 PM), shown as
70
+ * a small badge. Only meaningful on non-directional (cohort) sorts, which
71
+ * toggle on/off independently and combine with whichever directional sort
72
+ * is active — e.g. "Horario" desc + "Después de las 6 PM" together.
73
+ */
74
+ count?: number;
75
+ }
76
+
48
77
  export interface FilterSortBarColors {
49
78
  primaryColor?: string;
50
79
  primaryTextColor?: string;
@@ -59,6 +88,8 @@ export interface FilterSortBarColors {
59
88
  export interface FilterSortBarIcons {
60
89
  closeIcon?: string;
61
90
  chevronDownIcon?: string;
91
+ /** Directional arrow shown on active base sort chips (Horario/Empresas/Precio/Rápido). Drawn pointing down; rotated 180° for ascending. */
92
+ sortArrowIcon?: string;
62
93
  searchIcon?: string;
63
94
  filterIcon?: string;
64
95
  starFilledIcon?: string;
@@ -67,12 +98,17 @@ export interface FilterSortBarIcons {
67
98
  categoryIcons?: Partial<Record<FilterCategoryKey, string>>;
68
99
  categoryIconsActive?: Partial<Record<FilterCategoryKey, string>>;
69
100
  timeOfDayIcons?: Partial<Record<TimeOfDayVariant, string>>;
101
+ /** Icons for sort chips whose key doesn't already map to a category/time-of-day icon (e.g. "duration" for a Rápido chip). Keyed by SortOption.key. */
102
+ sortIcons?: Partial<Record<string, string>>;
70
103
  }
71
104
 
72
105
  export interface FilterSortBarMobileProps {
73
106
  categories: FilterCategory[];
74
107
  onApply: (categoryKey: FilterCategoryKey | "all", updatedCategories: FilterCategory[]) => void;
75
108
  onClearFilter: (categoryKey: FilterCategoryKey | "all") => void;
109
+ /** Sort chips rendered before the filter category chips — see SortOption. */
110
+ sortOptions?: SortOption[];
111
+ onSortChange?: (updatedSortOptions: SortOption[]) => void;
76
112
  currencySign?: string;
77
113
  colors?: FilterSortBarColors;
78
114
  icons?: FilterSortBarIcons;
@@ -710,7 +710,10 @@ const PaymentSideBarMobile: React.FC<PaymentSideBarProps> = (props) => {
710
710
  style={{ color: "var(--secondary-color)" }}
711
711
  >{`${creditosLabel}(${virtualLimit}%)`}</span>
712
712
  }
713
- amount={CommonService.currency(virtualMoney, currencySign)}
713
+ amount={CommonService.currency(
714
+ ((virtualLimit ?? 0) / 100) * Number(virtualMoney ?? 0),
715
+ currencySign
716
+ )}
714
717
  customStyle={{ color: "var(--secondary-color)" }}
715
718
  className="text-[14px]"
716
719
  currency=""
package/src/index.ts CHANGED
@@ -90,6 +90,8 @@ export type {
90
90
  FilterSortBarIcons,
91
91
  FilterSortBarMobileProps,
92
92
  TimeOfDayVariant,
93
+ SortDirection,
94
+ SortOption,
93
95
  } from "./components/FilterSortBar";
94
96
  export { DEFAULT_CATEGORY_LABELS } from "./components/FilterSortBar";
95
97
  export type { SurveyProps } from "./components/Survey/types";
@@ -65,10 +65,14 @@ export const PaymentCardMobile: React.FC<PaymentSideBarProps> = (props) => {
65
65
  currency,
66
66
  insuranceData,
67
67
  isPeru,
68
+ walletMoney,
69
+ walletLabel,
70
+ virtualMoney,
71
+ virtualLimit,
72
+ creditosLabel,
68
73
  showDetails = false,
69
74
  setShowDetails,
70
75
  } = props;
71
- console.log("🚀 ~ PaymentCardMobile ~ selectSeatOnward:", selectSeatOnward);
72
76
 
73
77
  // We use a Class component wrapper below to hold the state,
74
78
  // avoiding Invalid Hook Call issues when linked in external apps with multiple React instances.
@@ -85,8 +89,13 @@ export const PaymentCardMobile: React.FC<PaymentSideBarProps> = (props) => {
85
89
  ? droppingStageReturn
86
90
  : droppingStageOnward;
87
91
  const activeDroppingTime = isReturn ? droppingTimeReturn : droppingTimeOnward;
88
- const activeSource = isReturn ? sourceReturn : sourceOnward;
89
- const activeDest = isReturn ? destinationReturn : destinationOnward;
92
+ const activeSource = (isReturn ? sourceReturn : sourceOnward)?.replace(
93
+ /,\s*/g,
94
+ ", ",
95
+ );
96
+ const activeDest = (
97
+ isReturn ? destinationReturn : destinationOnward
98
+ )?.replace(/,\s*/g, ", ");
90
99
  const activeServiceName = isReturn ? serviceNameReturn : serviceNameOnward;
91
100
  const activeDate = isReturn ? dateReturn : dateOnward;
92
101
  const activeDuration = isReturn ? durationReturn : durationOnward;
@@ -202,7 +211,7 @@ export const PaymentCardMobile: React.FC<PaymentSideBarProps> = (props) => {
202
211
  </div>
203
212
  ) : null}
204
213
 
205
- <div style={{ padding: "16px 16px 0 16px" }}>
214
+ <div style={{ padding: "16px 10px 0 10px" }}>
206
215
  {/* Service Name + Date Badge */}
207
216
  <div
208
217
  style={{
@@ -266,42 +275,19 @@ export const PaymentCardMobile: React.FC<PaymentSideBarProps> = (props) => {
266
275
  <div
267
276
  style={{
268
277
  flexShrink: 0,
269
- width: "28px",
270
- height: "28px",
278
+ width: "20px",
279
+ height: "20px",
271
280
  display: "flex",
272
281
  alignItems: "center",
273
282
  justifyContent: "center",
274
283
  marginTop: "2px",
275
284
  }}
276
285
  >
277
- {icons?.origin ? (
278
- <img
279
- src={icons.origin}
280
- style={{ width: "18px", height: "18px" }}
281
- alt="origin"
282
- />
283
- ) : (
284
- <div
285
- style={{
286
- width: "22px",
287
- height: "22px",
288
- borderRadius: "50%",
289
- border: "2.5px solid #e0321c",
290
- display: "flex",
291
- alignItems: "center",
292
- justifyContent: "center",
293
- }}
294
- >
295
- <div
296
- style={{
297
- width: "8px",
298
- height: "8px",
299
- borderRadius: "50%",
300
- backgroundColor: "#e0321c",
301
- }}
302
- />
303
- </div>
304
- )}
286
+ <img
287
+ src={icons.origin}
288
+ style={{ width: "18px", height: "18px" }}
289
+ alt="origin"
290
+ />
305
291
  </div>
306
292
  <div style={{ flex: 1 }}>
307
293
  <div
@@ -312,6 +298,7 @@ export const PaymentCardMobile: React.FC<PaymentSideBarProps> = (props) => {
312
298
  textTransform: "capitalize",
313
299
  lineHeight: 1.3,
314
300
  }}
301
+ className="bold-text"
315
302
  >
316
303
  {activeSource}
317
304
  </div>
@@ -335,44 +322,25 @@ export const PaymentCardMobile: React.FC<PaymentSideBarProps> = (props) => {
335
322
  style={{
336
323
  display: "flex",
337
324
  alignItems: "flex-start",
338
- gap: "8px",
325
+ gap: "7px",
339
326
  }}
340
327
  >
341
328
  <div
342
329
  style={{
343
330
  flexShrink: 0,
344
- width: "28px",
345
- height: "28px",
331
+ width: "20px",
332
+ height: "20px",
346
333
  display: "flex",
347
334
  alignItems: "center",
348
335
  justifyContent: "center",
349
336
  marginTop: "2px",
350
337
  }}
351
338
  >
352
- {icons?.destination ? (
353
- <img
354
- src={icons.destination}
355
- style={{ width: "18px", height: "18px" }}
356
- alt="destination"
357
- />
358
- ) : (
359
- <div
360
- style={{
361
- width: "22px",
362
- height: "22px",
363
- display: "flex",
364
- alignItems: "center",
365
- justifyContent: "center",
366
- }}
367
- >
368
- <svg viewBox="0 0 24 24" width="24" height="24" fill="none">
369
- <path
370
- d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z"
371
- fill="#e05252"
372
- />
373
- </svg>
374
- </div>
375
- )}
339
+ <img
340
+ src={icons.destination}
341
+ style={{ width: "18px", height: "18px" }}
342
+ alt="destination"
343
+ />
376
344
  </div>
377
345
  <div style={{ flex: 1 }}>
378
346
  <div
@@ -383,6 +351,7 @@ export const PaymentCardMobile: React.FC<PaymentSideBarProps> = (props) => {
383
351
  textTransform: "capitalize",
384
352
  lineHeight: 1.3,
385
353
  }}
354
+ className="bold-text"
386
355
  >
387
356
  {activeDest}
388
357
  </div>
@@ -472,10 +441,12 @@ export const PaymentCardMobile: React.FC<PaymentSideBarProps> = (props) => {
472
441
  const modalDroppingTime = modalIsReturn
473
442
  ? droppingTimeReturn
474
443
  : droppingTimeOnward;
475
- const modalSource = modalIsReturn ? sourceReturn : sourceOnward;
476
- const modalDest = modalIsReturn
477
- ? destinationReturn
478
- : destinationOnward;
444
+ const modalSource = (
445
+ modalIsReturn ? sourceReturn : sourceOnward
446
+ )?.replace(/,\s*/g, ", ");
447
+ const modalDest = (
448
+ modalIsReturn ? destinationReturn : destinationOnward
449
+ )?.replace(/,\s*/g, ", ");
479
450
  const modalServiceName = modalIsReturn
480
451
  ? serviceNameReturn
481
452
  : serviceNameOnward;
@@ -669,41 +640,44 @@ export const PaymentCardMobile: React.FC<PaymentSideBarProps> = (props) => {
669
640
  {(modalIsReturn
670
641
  ? selectedReturn[0]
671
642
  : selectedOnward[0]
672
- ).map((val: any, idx: number) => (
673
- <span
674
- key={idx}
675
- style={{
676
- display: "inline-flex",
677
- alignItems: "center",
678
- }}
679
- >
680
- {val.number ||
681
- val.seat_number ||
682
- val.seatNumber ||
683
- val.name ||
684
- ""}
685
- {val.type && (
686
- <span
687
- style={{
688
- display: "inline-flex",
689
- alignItems: "center",
690
- justifyContent: "center",
691
- fontSize: "12px",
692
- marginLeft: "4px",
693
- }}
694
- >
695
- {val.type?.charAt(0)?.toUpperCase()}
696
- </span>
697
- )}
698
- </span>
699
- ))}
643
+ ).map((val: any, idx: number) => {
644
+ console.log("🚀 ~ PaymentCardMobile ~ val:", val);
645
+ return (
646
+ <span
647
+ key={idx}
648
+ style={{
649
+ display: "inline-flex",
650
+ alignItems: "center",
651
+ }}
652
+ >
653
+ {val.number ||
654
+ val.seat_number ||
655
+ val.seatNumber ||
656
+ val.name ||
657
+ ""}
658
+ {val.type && (
659
+ <span
660
+ style={{
661
+ display: "inline-flex",
662
+ alignItems: "center",
663
+ justifyContent: "center",
664
+ fontSize: "12px",
665
+ marginLeft: "4px",
666
+ }}
667
+ >
668
+ {val.type?.charAt(0)?.toUpperCase()}
669
+ </span>
670
+ )}
671
+ </span>
672
+ );
673
+ })}
700
674
  </span>
701
675
  </div>
702
676
  )}
703
677
  </div>
704
678
 
705
679
  {/* ── POLÍTICA ── */}
706
- <div style={S.section} className="mt-[30px]">
680
+ {/* <div style={S.section} className="mt-[30px]">
707
681
  <div style={S.sectionTitle} className="bold-text">
708
682
  Política
709
683
  </div>
@@ -716,7 +690,7 @@ export const PaymentCardMobile: React.FC<PaymentSideBarProps> = (props) => {
716
690
  Gratis hasta 24h antes
717
691
  </span>
718
692
  </div>
719
- </div>
693
+ </div> */}
720
694
 
721
695
  {/* ── TARIFA ── */}
722
696
  <div style={S.section} className="mt-[30px]">
@@ -792,12 +766,14 @@ export const PaymentCardMobile: React.FC<PaymentSideBarProps> = (props) => {
792
766
  ) : null}
793
767
 
794
768
  {/* Service fee */}
795
- {props.serviceFeeDataStateValue?.service_fee > 0 && (
769
+ {props.serviceFeeDataStateValue
770
+ ?.total_convenience_fee_amount && (
796
771
  <div style={S.sectionRow}>
797
772
  <span style={{ flex: 1 }}>Cargo por servicio</span>
798
773
  <span style={S.sectionRowValue} className="bold-text">
799
774
  {CommonService.currency(
800
- props.serviceFeeDataStateValue.service_fee,
775
+ props.serviceFeeDataStateValue
776
+ .total_convenience_fee_amount,
801
777
  currencySign,
802
778
  )}
803
779
  </span>
@@ -899,6 +875,67 @@ export const PaymentCardMobile: React.FC<PaymentSideBarProps> = (props) => {
899
875
  </div>
900
876
  ) : null}
901
877
 
878
+ {/* Cupon */}
879
+ {removeDiscountAtomValue && (
880
+ <div style={S.sectionRow}>
881
+ <span style={{ flex: 1 }}>Cupón</span>
882
+ <span
883
+ style={{
884
+ ...S.sectionRowValue,
885
+ color: "var(--secondary-color)",
886
+ }}
887
+ className="bold-text"
888
+ >
889
+ {`- ${CommonService.currency((netFare ?? 0) - (discountAmount ?? 0), currencySign)}`}
890
+ </span>
891
+ </div>
892
+ )}
893
+
894
+ {/* Wallet */}
895
+ {walletMoney ? (
896
+ <div style={S.sectionRow}>
897
+ <span style={{ flex: 1 }}>{walletLabel}</span>
898
+ <span
899
+ style={{
900
+ ...S.sectionRowValue,
901
+ color: "var(--secondary-color)",
902
+ }}
903
+ className="bold-text"
904
+ >
905
+ {isPeru
906
+ ? CommonService.currencyFixed(
907
+ walletMoney,
908
+ currencySign,
909
+ )
910
+ : CommonService.currency(walletMoney, currencySign)}
911
+ </span>
912
+ </div>
913
+ ) : null}
914
+
915
+ {/* Virtual credits */}
916
+ {virtualMoney ? (
917
+ <div style={S.sectionRow}>
918
+ <span style={{ flex: 1 }}>
919
+ <span
920
+ style={{ color: "var(--secondary-color)" }}
921
+ >{`${creditosLabel}(${virtualLimit}%)`}</span>
922
+ </span>
923
+ <span
924
+ style={{
925
+ ...S.sectionRowValue,
926
+ color: "var(--secondary-color)",
927
+ }}
928
+ className="bold-text"
929
+ >
930
+ {CommonService.currency(
931
+ ((virtualLimit ?? 0) / 100) *
932
+ Number(virtualMoney ?? 0),
933
+ currencySign,
934
+ )}
935
+ </span>
936
+ </div>
937
+ ) : null}
938
+
902
939
  {/* Dashed separator */}
903
940
  <div
904
941
  style={{
@@ -946,9 +983,10 @@ export const PaymentCardMobile: React.FC<PaymentSideBarProps> = (props) => {
946
983
  alignItems: "center",
947
984
  justifyContent: "center",
948
985
  gap: "6px",
949
- paddingBottom: "14px",
986
+ paddingBottom: "8px",
950
987
  cursor: "pointer",
951
988
  userSelect: "none",
989
+ marginTop: "-5px",
952
990
  }}
953
991
  onClick={() => setShowDetails && setShowDetails(!showDetails)}
954
992
  >