// Maison Yeya — Bridal & Couture collection pages
function CollectionsPage({ kind, setRoute, onAppointment, onOpenLook, onSave, isSaved }) {
// kind: "bridal" or "couture"
const isBridal = kind === "bridal";
const collections = isBridal ? BRIDAL_COLLECTIONS : COUTURE_COLLECTIONS;
const [filter, setFilter] = useState("all");
const filtered = filter === "all" ? collections : collections.filter(c => c.id === filter);
const heroCopy = isBridal
? {
eyebrow: "Bridal · Couture Privée",
title: "Bridal Couture Privée",
sub: "Six collections of hand-made bridal couture, each made to measure at the atelier. Reach out by appointment to view the full lookbook.",
heroImg: "media/media-09-website-banner-1.webp",
heroLook: "Gharami"
}
: {
eyebrow: "Couture · Eveningwear",
title: "Couture Privée",
sub: "Ten couture and eveningwear collections in the maison's archive. Pieces from current and past series are available by private quotation.",
heroImg: "media/media-01-yeya-couture-les-marionettes-capella-01.webp",
heroLook: "Les Marionettes · Capella"
};
return (
{/* HERO BANNER */}
{heroCopy.title}
{heroCopy.sub}
Featured · {heroCopy.heroLook}
{String(collections.length).padStart(2, "0")} / {isBridal ? "06" : "10"}
{/* FILTER BAR */}
{isBridal ? "All Bridal" : "All Couture"} Collections
Browse the Lookbook
{collections.map(c => (
))}
{/* COLLECTION SHOWCASE — large editorial blocks */}
{filtered.map((c, i) => (
))}
{/* PRIVATE BOOK CTA */}
Private Lookbook
{isBridal
? "The full bridal lookbook is shared at consultation."
: "Couture pieces are shown by private appointment at the atelier."}
Save the looks that move you to your Enquiry — we will assemble a personal selection and book a fitting.
);
}
// ──────────────────────────────────────────────────────────
// One collection block (alternating layout)
// ──────────────────────────────────────────────────────────
function CollectionShowcase({ c, index, onOpen, onSave, saved, onAppointment }) {
const flip = index % 2 === 1;
return (
{/* Image */}
onOpen(c)} className="img-frame"
style={{ aspectRatio: "4/5", cursor: "pointer", position: "relative", overflow: "hidden" }}>
{/* Copy */}
{c.subtitle}
№ {String(index + 1).padStart(2, "0")}
{c.name}
{c.note}
{c.range}
{String(c.looks).padStart(2, "0")}
MY · {c.id.toUpperCase()}
);
}
function DTerm({ label, children }) {
return (
{label}
{children}
);
}
function ZoomImage({ src, alt }) {
const [hover, setHover] = useState(false);
return (
<>
setHover(true)}
onMouseLeave={() => setHover(false)}
style={{
width: "100%", height: "100%", objectFit: "cover",
transform: hover ? "scale(1.05)" : "scale(1)",
transition: "transform 1400ms cubic-bezier(0.22, 1, 0.36, 1)"
}}/>
View Look →
>
);
}
window.CollectionsPage = CollectionsPage;