import { useState, useRef } from "react"; import { motion, useInView } from "framer-motion"; import { Search, Star, Heart } from "lucide-react"; import { COMPANIONS, CITIES, INTERESTS } from "@/lib/mock-data"; import { Link } from "wouter"; import InquiryModal from "@/components/InquiryModal"; function FadeIn({ children, delay = 0, className = "" }: { children: React.ReactNode; delay?: number; className?: string }) { const ref = useRef(null); const inView = useInView(ref, { once: true, margin: "-40px" }); return ( {children} ); } export default function Companions() { const [cityFilter, setCityFilter] = useState("All"); const [interestFilter, setInterestFilter] = useState("All"); const [search, setSearch] = useState(""); const [favorites, setFavorites] = useState([]); const [modalOpen, setModalOpen] = useState(false); const [selectedName, setSelectedName] = useState(""); const filtered = COMPANIONS.filter(c => { const cityOk = cityFilter === "All" || c.city === cityFilter; const intOk = interestFilter === "All" || c.interests.includes(interestFilter); const searchOk = !search || c.name.toLowerCase().includes(search.toLowerCase()) || c.interests.some(i => i.toLowerCase().includes(search.toLowerCase())); return cityOk && intOk && searchOk; }); const toggleFav = (id: string) => setFavorites(v => v.includes(id) ? v.filter(x => x !== id) : [...v, id]); const gradients = [ "from-amber-900/60 to-stone-900", "from-rose-900/40 to-stone-900", "from-emerald-900/40 to-stone-900", "from-indigo-900/40 to-stone-900", "from-amber-800/50 to-stone-900", "from-purple-900/40 to-stone-900", "from-teal-900/40 to-stone-900", "from-orange-900/40 to-stone-900", ]; return (
setModalOpen(false)} companionName={selectedName} /> {/* Header */}
Our Network

Our Companions

Each companion is personally selected for their poise, intellect, and social grace. Find the perfect match for your occasion.

{/* Filters */}
setSearch(e.target.value)} placeholder="Search companions..." className="w-full pl-9 pr-4 py-2.5 bg-card border border-border text-sm text-foreground focus:outline-none focus:border-primary/40 placeholder:text-muted-foreground/50 transition-colors" />

{filtered.length} companions

{/* Grid */}
{filtered.length === 0 ? (

No companions found

Try adjusting your filters

) : (
{filtered.map((c, i) => { const grad = gradients[parseInt(c.id) % gradients.length]; const isFav = favorites.includes(c.id); return (
{c.name.slice(0, 2).toUpperCase()}
{c.availability}

{c.name}

{c.rating}

{c.city} ยท {c.age} yrs

{c.snippet}

{c.interests.slice(0, 2).map(i => ( {i} ))}
{c.pricing}
View
); })}
)}
); }