|
| 1 | +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; |
| 2 | +import { Badge } from "@/components/ui/badge"; |
| 3 | +import { Percent, CreditCard, Gift, TrendingDown, Star, Zap } from "lucide-react"; |
| 4 | +import { motion } from "framer-motion"; |
| 5 | + |
| 6 | +interface Promotion { |
| 7 | + brand: string; |
| 8 | + brandLogo?: string; |
| 9 | + color: string; |
| 10 | + mainDiscount: string; |
| 11 | + description: string; |
| 12 | + highlights: string[]; |
| 13 | + cardType: string; |
| 14 | + icon: React.ReactNode; |
| 15 | + category: "premium" | "supermarket" | "standard"; |
| 16 | +} |
| 17 | + |
| 18 | +const promotions: Promotion[] = [ |
| 19 | + { |
| 20 | + brand: "Repsol Waylet", |
| 21 | + color: "from-red-500 to-orange-500", |
| 22 | + mainDiscount: "Hasta 40 cént./L", |
| 23 | + description: "La app más completa con múltiples formas de ahorro", |
| 24 | + highlights: [ |
| 25 | + "10-40 cént./L según energías contratadas", |
| 26 | + "Duplica tu saldo hasta noviembre 2025", |
| 27 | + "10% de cashback en cada repostaje", |
| 28 | + "100% bonificación en recarga eléctrica", |
| 29 | + "Descuentos en Burger King, El Corte Inglés" |
| 30 | + ], |
| 31 | + cardType: "App gratuita + Tarjeta energía", |
| 32 | + icon: <Zap className="w-5 h-5" />, |
| 33 | + category: "premium" |
| 34 | + }, |
| 35 | + { |
| 36 | + brand: "Moeve (Cepsa)", |
| 37 | + color: "from-blue-500 to-cyan-500", |
| 38 | + mainDiscount: "Hasta 18.5 cént./L", |
| 39 | + description: "Programa de fidelización renovado con múltiples opciones", |
| 40 | + highlights: [ |
| 41 | + "Moeve Pro Direct: hasta 17.50 cént./L", |
| 42 | + "7 cént./L desde el primer litro", |
| 43 | + "5 cént./L adicionales a fin de mes", |
| 44 | + "10€ de bienvenida nuevos usuarios", |
| 45 | + "Más de €300 anuales en ahorro potencial" |
| 46 | + ], |
| 47 | + cardType: "Tarjeta gratuita + App GOW", |
| 48 | + icon: <Star className="w-5 h-5" />, |
| 49 | + category: "premium" |
| 50 | + }, |
| 51 | + { |
| 52 | + brand: "Carrefour", |
| 53 | + color: "from-blue-600 to-blue-800", |
| 54 | + mainDiscount: "8-10% cashback", |
| 55 | + description: "Alto porcentaje de devolución en gasolineras propias", |
| 56 | + highlights: [ |
| 57 | + "8% de cashback trimestral", |
| 58 | + "10% último fin de semana del mes", |
| 59 | + "4% en gasolineras Cepsa", |
| 60 | + "Sin cambiar de banco", |
| 61 | + "145 estaciones de servicio" |
| 62 | + ], |
| 63 | + cardType: "Tarjeta Pass Carrefour", |
| 64 | + icon: <Percent className="w-5 h-5" />, |
| 65 | + category: "supermarket" |
| 66 | + }, |
| 67 | + { |
| 68 | + brand: "BP", |
| 69 | + color: "from-green-500 to-emerald-600", |
| 70 | + mainDiscount: "3 cént./L + bonus", |
| 71 | + description: "Descuento directo con bonificación extra por volumen", |
| 72 | + highlights: [ |
| 73 | + "3 cént./L en cada repostaje", |
| 74 | + "2€ extra con +40L en BP Ultimate", |
| 75 | + "Hasta 24€ al mes de ahorro", |
| 76 | + "Sistema de puntos canjeables", |
| 77 | + "Uso en tiendas BP" |
| 78 | + ], |
| 79 | + cardType: "Tarjeta BP", |
| 80 | + icon: <Gift className="w-5 h-5" />, |
| 81 | + category: "standard" |
| 82 | + }, |
| 83 | + { |
| 84 | + brand: "Alcampo", |
| 85 | + color: "from-red-600 to-pink-600", |
| 86 | + mainDiscount: "Hasta 8 cént./L", |
| 87 | + description: "Descuentos inmediatos en red de 53 gasolineras", |
| 88 | + highlights: [ |
| 89 | + "Hasta 8 cént./L con Alcampo Dúa", |
| 90 | + "Tarjeta Oney gratuita", |
| 91 | + "53 gasolineras en España", |
| 92 | + "Acumulación en compras supermercado", |
| 93 | + "Precios competitivos Low Cost" |
| 94 | + ], |
| 95 | + cardType: "Tarjeta Alcampo Dúa", |
| 96 | + icon: <TrendingDown className="w-5 h-5" />, |
| 97 | + category: "supermarket" |
| 98 | + }, |
| 99 | + { |
| 100 | + brand: "Galp + ING/ABANCA", |
| 101 | + color: "from-orange-500 to-yellow-500", |
| 102 | + mainDiscount: "3-5% descuento", |
| 103 | + description: "Descuentos mediante tarjetas bancarias asociadas", |
| 104 | + highlights: [ |
| 105 | + "ABANCA Visa: 4-5% descuento", |
| 106 | + "ING: 3% en Galp y Shell", |
| 107 | + "Lidl Plus: hasta 5% (máx 4€)", |
| 108 | + "Programa Mundo Galp puntos", |
| 109 | + "Descuento RACE para socios" |
| 110 | + ], |
| 111 | + cardType: "Tarjeta bancaria asociada", |
| 112 | + icon: <CreditCard className="w-5 h-5" />, |
| 113 | + category: "standard" |
| 114 | + }, |
| 115 | + { |
| 116 | + brand: "Eroski + Repsol", |
| 117 | + color: "from-green-600 to-teal-600", |
| 118 | + mainDiscount: "4% cashback", |
| 119 | + description: "Alianza estratégica con devolución mensual", |
| 120 | + highlights: [ |
| 121 | + "4% en Repsol, Campsa, Petronor", |
| 122 | + "Tarjeta Eroski Club (4,99€/mes)", |
| 123 | + "Devolución a principios de mes", |
| 124 | + "Límite: 150L/día, 1.500L/mes", |
| 125 | + "Canjeable en supermercados" |
| 126 | + ], |
| 127 | + cardType: "Eroski Club + Repsol Más", |
| 128 | + icon: <Percent className="w-5 h-5" />, |
| 129 | + category: "supermarket" |
| 130 | + }, |
| 131 | +]; |
| 132 | + |
| 133 | +const categoryTitles = { |
| 134 | + premium: "Programas Premium", |
| 135 | + supermarket: "Supermercados", |
| 136 | + standard: "Gasolineras Tradicionales" |
| 137 | +}; |
| 138 | + |
| 139 | +export const PromotionsSection = () => { |
| 140 | + const groupedPromotions = { |
| 141 | + premium: promotions.filter(p => p.category === "premium"), |
| 142 | + supermarket: promotions.filter(p => p.category === "supermarket"), |
| 143 | + standard: promotions.filter(p => p.category === "standard") |
| 144 | + }; |
| 145 | + |
| 146 | + return ( |
| 147 | + <section className="w-full py-20 bg-gradient-to-b from-background via-secondary/20 to-background"> |
| 148 | + <div className="container mx-auto px-4"> |
| 149 | + <motion.div |
| 150 | + initial={{ opacity: 0, y: 20 }} |
| 151 | + whileInView={{ opacity: 1, y: 0 }} |
| 152 | + transition={{ duration: 0.6 }} |
| 153 | + viewport={{ once: true }} |
| 154 | + className="text-center mb-12" |
| 155 | + > |
| 156 | + <Badge className="mb-4" variant="outline"> |
| 157 | + <Gift className="w-4 h-4 mr-2" /> |
| 158 | + Promociones y Descuentos |
| 159 | + </Badge> |
| 160 | + <h2 className="text-4xl md:text-5xl font-bold mb-4"> |
| 161 | + Ahorra más con{" "} |
| 162 | + <span className="bg-gradient-to-r from-primary to-accent bg-clip-text text-transparent"> |
| 163 | + tarjetas y apps |
| 164 | + </span> |
| 165 | + </h2> |
| 166 | + <p className="text-xl text-muted-foreground max-w-3xl mx-auto"> |
| 167 | + Descubre todas las promociones activas de las principales gasolineras. |
| 168 | + Combina descuentos y encuentra el mejor precio posible. |
| 169 | + </p> |
| 170 | + </motion.div> |
| 171 | + |
| 172 | + {Object.entries(groupedPromotions).map(([category, promos], categoryIndex) => ( |
| 173 | + <div key={category} className="mb-12"> |
| 174 | + <h3 className="text-2xl font-bold mb-6 text-center"> |
| 175 | + {categoryTitles[category as keyof typeof categoryTitles]} |
| 176 | + </h3> |
| 177 | + <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"> |
| 178 | + {promos.map((promo, index) => ( |
| 179 | + <motion.div |
| 180 | + key={promo.brand} |
| 181 | + initial={{ opacity: 0, y: 20 }} |
| 182 | + whileInView={{ opacity: 1, y: 0 }} |
| 183 | + transition={{ duration: 0.5, delay: index * 0.1 }} |
| 184 | + viewport={{ once: true }} |
| 185 | + > |
| 186 | + <Card className="h-full hover:shadow-xl transition-all duration-300 border-primary/20 hover:border-primary/40 bg-card/80 backdrop-blur"> |
| 187 | + <CardHeader> |
| 188 | + <div className="flex items-start justify-between mb-2"> |
| 189 | + <div className={`bg-gradient-to-r ${promo.color} p-3 rounded-lg`}> |
| 190 | + {promo.icon} |
| 191 | + </div> |
| 192 | + <Badge variant="secondary" className="text-lg font-bold"> |
| 193 | + {promo.mainDiscount} |
| 194 | + </Badge> |
| 195 | + </div> |
| 196 | + <CardTitle className="text-xl">{promo.brand}</CardTitle> |
| 197 | + <CardDescription className="text-sm"> |
| 198 | + {promo.description} |
| 199 | + </CardDescription> |
| 200 | + </CardHeader> |
| 201 | + <CardContent className="space-y-4"> |
| 202 | + <div className="space-y-2"> |
| 203 | + {promo.highlights.map((highlight, idx) => ( |
| 204 | + <div key={idx} className="flex items-start gap-2 text-sm"> |
| 205 | + <div className={`mt-1 w-1.5 h-1.5 rounded-full bg-gradient-to-r ${promo.color} flex-shrink-0`} /> |
| 206 | + <span className="text-muted-foreground">{highlight}</span> |
| 207 | + </div> |
| 208 | + ))} |
| 209 | + </div> |
| 210 | + <div className="pt-4 border-t border-border"> |
| 211 | + <div className="flex items-center gap-2 text-xs text-muted-foreground"> |
| 212 | + <CreditCard className="w-4 h-4" /> |
| 213 | + <span className="font-medium">{promo.cardType}</span> |
| 214 | + </div> |
| 215 | + </div> |
| 216 | + </CardContent> |
| 217 | + </Card> |
| 218 | + </motion.div> |
| 219 | + ))} |
| 220 | + </div> |
| 221 | + </div> |
| 222 | + ))} |
| 223 | + |
| 224 | + <div className="mt-8 text-center text-sm text-muted-foreground"> |
| 225 | + <p>Información actualizada a noviembre 2025. Consulta condiciones específicas en cada programa.</p> |
| 226 | + </div> |
| 227 | + </div> |
| 228 | + </section> |
| 229 | + ); |
| 230 | +}; |
0 commit comments