From da91dd826a6e79321f8af8dde2db36a167b2f537 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 4 Mar 2026 09:30:52 +0000 Subject: [PATCH] Edit app-9xzmfic2e4g1/src/components/planner/TransportSelector.tsx via Editor --- .../components/planner/TransportSelector.tsx | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 app-9xzmfic2e4g1/src/components/planner/TransportSelector.tsx diff --git a/app-9xzmfic2e4g1/src/components/planner/TransportSelector.tsx b/app-9xzmfic2e4g1/src/components/planner/TransportSelector.tsx new file mode 100644 index 0000000..cfbff44 --- /dev/null +++ b/app-9xzmfic2e4g1/src/components/planner/TransportSelector.tsx @@ -0,0 +1,87 @@ +import { memo } from 'react'; +import { TRANSPORT_OPTIONS } from '@/constants/planner'; +import { cn } from '@/lib/utils'; +import { motion } from 'framer-motion'; +import { CheckCircle2 } from 'lucide-react'; + +interface TransportSelectorProps { + selectedId: string; + onSelect: (id: string) => void; +} + +export const TransportSelector = memo(({ selectedId, onSelect }: TransportSelectorProps) => { + return ( +
+ {TRANSPORT_OPTIONS.map((option, index) => { + const Icon = option.icon; + const isSelected = selectedId === option.id; + + return ( + onSelect(option.id)} + className={cn( + 'relative group flex items-center gap-4 px-5 py-4 rounded-2xl border-2 text-left transition-all duration-200 w-full overflow-hidden', + isSelected + ? 'border-orange-400 bg-orange-50 shadow-md shadow-orange-100' + : 'border-gray-100 bg-gray-50/60 hover:border-gray-200 hover:bg-white hover:shadow-sm' + )} + > + {/* Animated left accent bar */} + + + {/* Icon */} +
+ +
+ + {/* Text */} +
+

+ {option.label} +

+

+ {option.description} +

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