// Hotels (Duffel Stays) search panel — additive. Renders inside the existing glass search // panel when mode === "hotels". Self-contained: search → results → booking overlay, so the // flight state machine in app.jsx is never touched. Accent: --sky. const HotelSearchPanel = () => { const [city, setCity] = useState(DESTINATIONS[0]); const [cityOpen, setCityOpen] = useState(false); const [checkIn, setCheckIn] = useState(""); const [checkOut, setCheckOut] = useState(""); const [rooms, setRooms] = useState(1); const [adults, setAdults] = useState(2); const [loading, setLoading] = useState(false); const [results, setResults] = useState(null); // null | [] | [stay] const [booking, setBooking] = useState(null); // selected stay for booking overlay const cityChoices = useMemo(() => { // merge featured destinations + airport cities into one pickable list const seen = new Set(); const out = []; for (const d of DESTINATIONS) { if (!seen.has(d.code)) { seen.add(d.code); out.push({ code: d.code, city: d.city, country: d.country }); } } for (const a of AIRPORTS) { if (!seen.has(a.code)) { seen.add(a.code); out.push({ code: a.code, city: a.city, country: a.name }); } } return out; }, []); async function runSearch() { setLoading(true); setResults(null); const list = await EHT_API.searchStays({ cityCode: city.code, cityLabel: city.city, checkInDate: checkIn || undefined, checkOutDate: checkOut || undefined, rooms, adults, }); setLoading(false); setResults(list); } const dropdownOpen = cityOpen; return (