// Passenger details + payment screen const ScreenPassenger = ({ flight, query, selectedSeat, passenger, setPassenger, payment, setPayment, onContinue, onBack }) => { const valid = passenger.first && passenger.last && passenger.email && passenger.dob && payment.number.length >= 12 && payment.cvv.length >= 3 && payment.exp; const seatFee = selectedSeat ? seatPrice(selectedSeat.row, selectedSeat.col) : 0; const taxes = Math.round(flight.price * 0.18); const total = flight.price + seatFee + taxes; return (
Step 03 — Tell us who's flying

Passenger & payment.

{/* Left: forms */}
setPassenger({ ...passenger, first: v })} placeholder="Iris"/> setPassenger({ ...passenger, last: v })} placeholder="Whittaker"/> setPassenger({ ...passenger, dob: v })} placeholder="1992-04-18" mono/> setPassenger({ ...passenger, nat: v })} placeholder="United States"/> setPassenger({ ...passenger, email: v })} placeholder="iris@example.com"/> setPassenger({ ...passenger, phone: v })} placeholder="+1 (415) 555 0142" mono/> setPassenger({ ...passenger, passport: v })} placeholder="A1234567" mono/> setPassenger({ ...passenger, ff: v })} placeholder="optional" mono/>
{[ { id: "bag", label: "Checked bag", sub: "23 kg · $40", price: 40, icon: }, { id: "wifi", label: "In-flight Wi-Fi", sub: "Stream-grade · $18", price: 18, icon: }, { id: "meal", label: "Hot meal", sub: "Chef-curated · $24", price: 24, icon: }, { id: "carbon", label: "Carbon offset", sub: "Forest restoration · $12", price: 12, icon: }, ].map(a => { const on = passenger.addons.includes(a.id); return ( ); })}
{/* Card visual */}
{/* shimmer */}
aeria
{(payment.number || "•••• •••• •••• ••••").replace(/(.{4})/g, "$1 ").trim()}
{payment.name || `${passenger.first || "Cardholder"} ${passenger.last || "name"}`} {payment.exp || "MM / YY"}
setPayment({ ...payment, number: v.replace(/\D/g, "").slice(0, 16) })} placeholder="4242 4242 4242 4242" mono/> setPayment({ ...payment, exp: v })} placeholder="07 / 28" mono/> setPayment({ ...payment, cvv: v.replace(/\D/g, "").slice(0,4) })} placeholder="•••" mono/> setPayment({ ...payment, zip: v })} placeholder="94110" mono/>
{/* Right: itinerary summary */}
); }; function Card({ title, badge, children }) { return (
{badge}

{title}

{children}
); } function Row({ children }) { return
{children}
; } function Input({ label, value, onChange, placeholder, mono }) { return ( ); } function PriceLine({ label, value }) { return (
{value}
); } window.ScreenPassenger = ScreenPassenger;