From 8e09b7ff5cb84080b70fd8461da05f8739faf879 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 4 Mar 2026 09:30:07 +0000 Subject: [PATCH] Edit app-9xzmfic2e4g1/src/components/planner/TravelTypeSelector.tsx via Editor --- .../components/planner/TravelTypeSelector.tsx | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 app-9xzmfic2e4g1/src/components/planner/TravelTypeSelector.tsx diff --git a/app-9xzmfic2e4g1/src/components/planner/TravelTypeSelector.tsx b/app-9xzmfic2e4g1/src/components/planner/TravelTypeSelector.tsx new file mode 100644 index 0000000..867b38f --- /dev/null +++ b/app-9xzmfic2e4g1/src/components/planner/TravelTypeSelector.tsx @@ -0,0 +1,89 @@ +import { memo } from 'react'; +import { TRAVEL_TYPE_OPTIONS } from '@/constants/planner'; +import { cn } from '@/lib/utils'; +import { motion } from 'framer-motion'; +import { CheckCircle2 } from 'lucide-react'; + +interface TravelTypeSelectorProps { + selectedId: string; + onSelect: (id: string) => void; +} + +export const TravelTypeSelector = memo(({ selectedId, onSelect }: TravelTypeSelectorProps) => { + return ( +
+ {TRAVEL_TYPE_OPTIONS.map((option, index) => { + const Icon = option.icon; + const isSelected = selectedId === option.id; + + return ( + onSelect(option.id)} + className={cn( + 'relative group flex flex-col items-start gap-3 p-5 rounded-2xl border-2 text-left transition-all duration-200 overflow-hidden', + isSelected + ? `${option.border} ${option.bg} shadow-md` + : 'border-gray-100 bg-gray-50/60 hover:border-gray-200 hover:bg-white hover:shadow-sm' + )} + > + {/* Background glow when selected */} + {isSelected && ( + + )} + + {/* Icon */} +
+ +
+ + {/* Text */} +
+

+ {option.label} +

+

+ {option.description} +

+
+ + {/* Check badge */} + {isSelected && ( + + + + )} +
+ ); + })} +
+ ); +}); + +TravelTypeSelector.displayName = 'TravelTypeSelector'; \ No newline at end of file